From 7263481e486a71f76f9c8cf17b5b05a4ef72a6ea Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 22 Jun 2025 11:01:26 +0200 Subject: [PATCH] Adding upstream version 2.4.63. Signed-off-by: Daniel Baumann --- .deps | 0 .gdbinit | 598 + .github/workflows/linux.yml | 297 + .github/workflows/windows.yml | 63 + .gitignore | 370 + ABOUT_APACHE | 244 + Apache-apr2.dsw | 3052 ++ Apache.dsw | 3601 ++ BuildAll.dsp | 97 + BuildBin.dsp | 97 + CHANGES | 8294 +++ CMakeLists.txt | 1047 + INSTALL | 87 + InstallBin.dsp | 109 + LAYOUT | 173 + LICENSE | 537 + Makefile.in | 318 + Makefile.win | 1297 + NOTICE | 18 + NWGNUmakefile | 481 + README | 110 + README.CHANGES | 19 + README.cmake | 329 + README.platforms | 112 + ROADMAP | 229 + VERSIONING | 154 + acinclude.m4 | 783 + ap.d | 102 + apache_probes.d | 222 + build/NWGNUenvironment.inc | 410 + build/NWGNUhead.inc | 109 + build/NWGNUmakefile | 140 + build/NWGNUscripts.inc | 43 + build/NWGNUtail.inc | 332 + build/PrintPath | 130 + build/aix/README | 66 + build/aix/aixinfo | 16 + build/aix/aixproto.ksh | 78 + build/aix/buildaix.ksh | 127 + build/aix/mkinstallp.ksh | 201 + build/apr_common.m4 | 987 + build/binbuild.sh | 206 + build/bsd_makefile | 34 + build/build-modules-c.awk | 82 + build/buildinfo.sh | 171 + build/config-stubs | 27 + build/config.guess | 1812 + build/config.sub | 1971 + build/config_vars.sh.in | 78 + build/cpR_noreplace.pl | 71 + build/default.pl | 496 + build/fastgen.sh | 89 + build/find_apr.m4 | 202 + build/find_apu.m4 | 211 + build/get-version.sh | 59 + build/install-bindist.sh.in | 176 + build/install.sh | 123 + build/installwinconf.awk | 286 + build/instdso.sh | 105 + build/library.mk | 22 + build/ltlib.mk | 23 + build/ltmain.sh | 11375 ++++ build/make_exports.awk | 162 + build/make_nw_export.awk | 118 + build/make_var_export.awk | 75 + build/mkconfNW.awk | 161 + build/mkdep.perl | 90 + build/mkdir.sh | 48 + build/nw_export.inc | 67 + build/nw_ver.awk | 62 + build/pkg/README | 16 + build/pkg/buildpkg.sh | 94 + build/pkg/pkginfo.in | 11 + build/program.mk | 23 + build/rpm/htcacheclean.init | 100 + build/rpm/httpd.init | 155 + build/rpm/httpd.logrotate | 8 + build/rpm/httpd.spec.in | 494 + build/rules.mk.in | 245 + build/special.mk | 36 + build/sysv_makefile | 34 + build/win32/apache.ico | Bin 0 -> 1078 bytes build/win32/httpd.rc | 88 + buildconf | 331 + config.layout | 421 + configure | 43609 ++++++++++++++++ configure.in | 986 + docs/cgi-examples/printenv | 27 + docs/cgi-examples/printenv.vbs | 32 + docs/cgi-examples/printenv.wsf | 33 + docs/cgi-examples/test-cgi | 42 + docs/conf/charset.conv | 55 + docs/conf/extra/httpd-autoindex.conf.in | 93 + docs/conf/extra/httpd-dav.conf.in | 53 + docs/conf/extra/httpd-default.conf.in | 90 + docs/conf/extra/httpd-info.conf.in | 36 + docs/conf/extra/httpd-languages.conf.in | 141 + docs/conf/extra/httpd-manual.conf.in | 38 + docs/conf/extra/httpd-mpm.conf.in | 119 + .../extra/httpd-multilang-errordoc.conf.in | 52 + docs/conf/extra/httpd-ssl.conf.in | 290 + docs/conf/extra/httpd-userdir.conf.in | 21 + docs/conf/extra/httpd-vhosts.conf.in | 41 + docs/conf/extra/proxy-html.conf.in | 90 + docs/conf/httpd.conf.in | 418 + docs/conf/magic | 385 + docs/conf/mime.types | 1859 + docs/docroot/index.html | 1 + docs/doxygen.conf | 74 + docs/error/HTTP_BAD_GATEWAY.html.var | 371 + docs/error/HTTP_BAD_REQUEST.html.var | 266 + docs/error/HTTP_FORBIDDEN.html.var | 476 + docs/error/HTTP_GONE.html.var | 534 + .../error/HTTP_INTERNAL_SERVER_ERROR.html.var | 576 + docs/error/HTTP_LENGTH_REQUIRED.html.var | 279 + docs/error/HTTP_METHOD_NOT_ALLOWED.html.var | 269 + docs/error/HTTP_NOT_FOUND.html.var | 536 + docs/error/HTTP_NOT_IMPLEMENTED.html.var | 254 + docs/error/HTTP_PRECONDITION_FAILED.html.var | 257 + .../HTTP_REQUEST_ENTITY_TOO_LARGE.html.var | 282 + docs/error/HTTP_REQUEST_TIME_OUT.html.var | 270 + .../error/HTTP_REQUEST_URI_TOO_LARGE.html.var | 271 + docs/error/HTTP_SERVICE_UNAVAILABLE.html.var | 286 + docs/error/HTTP_UNAUTHORIZED.html.var | 423 + .../HTTP_UNSUPPORTED_MEDIA_TYPE.html.var | 252 + docs/error/HTTP_VARIANT_ALSO_VARIES.html.var | 278 + docs/error/README | 40 + docs/error/contact.html.var | 153 + docs/error/include/bottom.html | 12 + docs/error/include/spacer.html | 2 + docs/error/include/top.html | 21 + docs/icons/README | 166 + docs/icons/README.html | 815 + docs/icons/a.gif | Bin 0 -> 246 bytes docs/icons/a.png | Bin 0 -> 306 bytes docs/icons/alert.black.gif | Bin 0 -> 242 bytes docs/icons/alert.black.png | Bin 0 -> 293 bytes docs/icons/alert.red.gif | Bin 0 -> 247 bytes docs/icons/alert.red.png | Bin 0 -> 314 bytes docs/icons/apache_pb.gif | Bin 0 -> 4463 bytes docs/icons/apache_pb.png | Bin 0 -> 9691 bytes docs/icons/apache_pb.svg | 5879 +++ docs/icons/apache_pb2.gif | Bin 0 -> 4234 bytes docs/icons/apache_pb2.png | Bin 0 -> 10401 bytes docs/icons/back.gif | Bin 0 -> 216 bytes docs/icons/back.png | Bin 0 -> 308 bytes docs/icons/ball.gray.gif | Bin 0 -> 233 bytes docs/icons/ball.gray.png | Bin 0 -> 298 bytes docs/icons/ball.red.gif | Bin 0 -> 205 bytes docs/icons/ball.red.png | Bin 0 -> 289 bytes docs/icons/binary.gif | Bin 0 -> 246 bytes docs/icons/binary.png | Bin 0 -> 310 bytes docs/icons/binhex.gif | Bin 0 -> 246 bytes docs/icons/binhex.png | Bin 0 -> 319 bytes docs/icons/blank.gif | Bin 0 -> 148 bytes docs/icons/blank.png | Bin 0 -> 215 bytes docs/icons/bomb.gif | Bin 0 -> 308 bytes docs/icons/bomb.png | Bin 0 -> 375 bytes docs/icons/box1.gif | Bin 0 -> 251 bytes docs/icons/box1.png | Bin 0 -> 325 bytes docs/icons/box2.gif | Bin 0 -> 268 bytes docs/icons/box2.png | Bin 0 -> 336 bytes docs/icons/broken.gif | Bin 0 -> 247 bytes docs/icons/broken.png | Bin 0 -> 320 bytes docs/icons/burst.gif | Bin 0 -> 235 bytes docs/icons/burst.png | Bin 0 -> 341 bytes docs/icons/c.gif | Bin 0 -> 242 bytes docs/icons/c.png | Bin 0 -> 299 bytes docs/icons/comp.blue.gif | Bin 0 -> 251 bytes docs/icons/comp.blue.png | Bin 0 -> 330 bytes docs/icons/comp.gray.gif | Bin 0 -> 246 bytes docs/icons/comp.gray.png | Bin 0 -> 318 bytes docs/icons/compressed.gif | Bin 0 -> 1038 bytes docs/icons/compressed.png | Bin 0 -> 1108 bytes docs/icons/continued.gif | Bin 0 -> 214 bytes docs/icons/continued.png | Bin 0 -> 296 bytes docs/icons/dir.gif | Bin 0 -> 225 bytes docs/icons/dir.png | Bin 0 -> 295 bytes docs/icons/diskimg.gif | Bin 0 -> 167 bytes docs/icons/diskimg.png | Bin 0 -> 215 bytes docs/icons/down.gif | Bin 0 -> 163 bytes docs/icons/down.png | Bin 0 -> 256 bytes docs/icons/dvi.gif | Bin 0 -> 238 bytes docs/icons/dvi.png | Bin 0 -> 305 bytes docs/icons/f.gif | Bin 0 -> 236 bytes docs/icons/f.png | Bin 0 -> 296 bytes docs/icons/folder.gif | Bin 0 -> 225 bytes docs/icons/folder.open.gif | Bin 0 -> 242 bytes docs/icons/folder.open.png | Bin 0 -> 332 bytes docs/icons/folder.png | Bin 0 -> 295 bytes docs/icons/folder.sec.gif | Bin 0 -> 243 bytes docs/icons/folder.sec.png | Bin 0 -> 313 bytes docs/icons/forward.gif | Bin 0 -> 219 bytes docs/icons/forward.png | Bin 0 -> 308 bytes docs/icons/generic.gif | Bin 0 -> 221 bytes docs/icons/generic.png | Bin 0 -> 275 bytes docs/icons/generic.red.gif | Bin 0 -> 220 bytes docs/icons/generic.red.png | Bin 0 -> 283 bytes docs/icons/generic.sec.gif | Bin 0 -> 249 bytes docs/icons/generic.sec.png | Bin 0 -> 295 bytes docs/icons/hand.right.gif | Bin 0 -> 217 bytes docs/icons/hand.right.png | Bin 0 -> 311 bytes docs/icons/hand.up.gif | Bin 0 -> 223 bytes docs/icons/hand.up.png | Bin 0 -> 304 bytes docs/icons/icon.sheet.gif | Bin 0 -> 11977 bytes docs/icons/icon.sheet.png | Bin 0 -> 9018 bytes docs/icons/image1.gif | Bin 0 -> 274 bytes docs/icons/image1.png | Bin 0 -> 325 bytes docs/icons/image2.gif | Bin 0 -> 309 bytes docs/icons/image2.png | Bin 0 -> 371 bytes docs/icons/image3.gif | Bin 0 -> 286 bytes docs/icons/image3.png | Bin 0 -> 338 bytes docs/icons/index.gif | Bin 0 -> 268 bytes docs/icons/index.png | Bin 0 -> 332 bytes docs/icons/layout.gif | Bin 0 -> 276 bytes docs/icons/layout.png | Bin 0 -> 323 bytes docs/icons/left.gif | Bin 0 -> 172 bytes docs/icons/left.png | Bin 0 -> 257 bytes docs/icons/link.gif | Bin 0 -> 249 bytes docs/icons/link.png | Bin 0 -> 314 bytes docs/icons/movie.gif | Bin 0 -> 243 bytes docs/icons/movie.png | Bin 0 -> 272 bytes docs/icons/odf6odb.png | Bin 0 -> 1047 bytes docs/icons/odf6odc.png | Bin 0 -> 1000 bytes docs/icons/odf6odf.png | Bin 0 -> 1047 bytes docs/icons/odf6odg.png | Bin 0 -> 1072 bytes docs/icons/odf6odi.png | Bin 0 -> 1067 bytes docs/icons/odf6odm.png | Bin 0 -> 1060 bytes docs/icons/odf6odp.png | Bin 0 -> 978 bytes docs/icons/odf6ods.png | Bin 0 -> 971 bytes docs/icons/odf6odt.png | Bin 0 -> 983 bytes docs/icons/odf6otc.png | Bin 0 -> 1040 bytes docs/icons/odf6otf.png | Bin 0 -> 1082 bytes docs/icons/odf6otg.png | Bin 0 -> 1106 bytes docs/icons/odf6oth.png | Bin 0 -> 1062 bytes docs/icons/odf6oti.png | Bin 0 -> 1107 bytes docs/icons/odf6otp.png | Bin 0 -> 1017 bytes docs/icons/odf6ots.png | Bin 0 -> 1010 bytes docs/icons/odf6ott.png | Bin 0 -> 1022 bytes docs/icons/p.gif | Bin 0 -> 237 bytes docs/icons/p.png | Bin 0 -> 298 bytes docs/icons/patch.gif | Bin 0 -> 251 bytes docs/icons/patch.png | Bin 0 -> 310 bytes docs/icons/pdf.gif | Bin 0 -> 249 bytes docs/icons/pdf.png | Bin 0 -> 304 bytes docs/icons/pie0.gif | Bin 0 -> 188 bytes docs/icons/pie0.png | Bin 0 -> 259 bytes docs/icons/pie1.gif | Bin 0 -> 198 bytes docs/icons/pie1.png | Bin 0 -> 279 bytes docs/icons/pie2.gif | Bin 0 -> 198 bytes docs/icons/pie2.png | Bin 0 -> 272 bytes docs/icons/pie3.gif | Bin 0 -> 191 bytes docs/icons/pie3.png | Bin 0 -> 276 bytes docs/icons/pie4.gif | Bin 0 -> 193 bytes docs/icons/pie4.png | Bin 0 -> 258 bytes docs/icons/pie5.gif | Bin 0 -> 189 bytes docs/icons/pie5.png | Bin 0 -> 277 bytes docs/icons/pie6.gif | Bin 0 -> 186 bytes docs/icons/pie6.png | Bin 0 -> 273 bytes docs/icons/pie7.gif | Bin 0 -> 185 bytes docs/icons/pie7.png | Bin 0 -> 275 bytes docs/icons/pie8.gif | Bin 0 -> 173 bytes docs/icons/pie8.png | Bin 0 -> 259 bytes docs/icons/portal.gif | Bin 0 -> 254 bytes docs/icons/portal.png | Bin 0 -> 319 bytes docs/icons/ps.gif | Bin 0 -> 244 bytes docs/icons/ps.png | Bin 0 -> 303 bytes docs/icons/quill.gif | Bin 0 -> 267 bytes docs/icons/quill.png | Bin 0 -> 329 bytes docs/icons/right.gif | Bin 0 -> 172 bytes docs/icons/right.png | Bin 0 -> 254 bytes docs/icons/screw1.gif | Bin 0 -> 258 bytes docs/icons/screw1.png | Bin 0 -> 328 bytes docs/icons/screw2.gif | Bin 0 -> 263 bytes docs/icons/screw2.png | Bin 0 -> 333 bytes docs/icons/script.gif | Bin 0 -> 242 bytes docs/icons/script.png | Bin 0 -> 290 bytes docs/icons/small/back.gif | Bin 0 -> 129 bytes docs/icons/small/back.png | Bin 0 -> 181 bytes docs/icons/small/binary.gif | Bin 0 -> 134 bytes docs/icons/small/binary.png | Bin 0 -> 172 bytes docs/icons/small/binhex.gif | Bin 0 -> 131 bytes docs/icons/small/binhex.png | Bin 0 -> 178 bytes docs/icons/small/blank.gif | Bin 0 -> 55 bytes docs/icons/small/blank.png | Bin 0 -> 100 bytes docs/icons/small/broken.gif | Bin 0 -> 139 bytes docs/icons/small/broken.png | Bin 0 -> 184 bytes docs/icons/small/burst.gif | Bin 0 -> 128 bytes docs/icons/small/burst.png | Bin 0 -> 210 bytes docs/icons/small/comp1.gif | Bin 0 -> 130 bytes docs/icons/small/comp1.png | Bin 0 -> 216 bytes docs/icons/small/comp2.gif | Bin 0 -> 131 bytes docs/icons/small/comp2.png | Bin 0 -> 215 bytes docs/icons/small/compressed.gif | Bin 0 -> 128 bytes docs/icons/small/compressed.png | Bin 0 -> 212 bytes docs/icons/small/continued.gif | Bin 0 -> 114 bytes docs/icons/small/continued.png | Bin 0 -> 163 bytes docs/icons/small/doc.gif | Bin 0 -> 191 bytes docs/icons/small/doc.png | Bin 0 -> 222 bytes docs/icons/small/folder.gif | Bin 0 -> 132 bytes docs/icons/small/folder.png | Bin 0 -> 196 bytes docs/icons/small/folder2.gif | Bin 0 -> 122 bytes docs/icons/small/folder2.png | Bin 0 -> 180 bytes docs/icons/small/forward.gif | Bin 0 -> 125 bytes docs/icons/small/forward.png | Bin 0 -> 174 bytes docs/icons/small/generic.gif | Bin 0 -> 116 bytes docs/icons/small/generic.png | Bin 0 -> 149 bytes docs/icons/small/generic2.gif | Bin 0 -> 127 bytes docs/icons/small/generic2.png | Bin 0 -> 179 bytes docs/icons/small/generic3.gif | Bin 0 -> 113 bytes docs/icons/small/generic3.png | Bin 0 -> 171 bytes docs/icons/small/image.gif | Bin 0 -> 126 bytes docs/icons/small/image.png | Bin 0 -> 197 bytes docs/icons/small/image2.gif | Bin 0 -> 138 bytes docs/icons/small/image2.png | Bin 0 -> 203 bytes docs/icons/small/index.gif | Bin 0 -> 145 bytes docs/icons/small/index.png | Bin 0 -> 225 bytes docs/icons/small/key.gif | Bin 0 -> 187 bytes docs/icons/small/key.png | Bin 0 -> 210 bytes docs/icons/small/movie.gif | Bin 0 -> 134 bytes docs/icons/small/movie.png | Bin 0 -> 159 bytes docs/icons/small/patch.gif | Bin 0 -> 182 bytes docs/icons/small/patch.png | Bin 0 -> 211 bytes docs/icons/small/ps.gif | Bin 0 -> 184 bytes docs/icons/small/ps.png | Bin 0 -> 217 bytes docs/icons/small/rainbow.gif | Bin 0 -> 3811 bytes docs/icons/small/rainbow.png | Bin 0 -> 2427 bytes docs/icons/small/sound.gif | Bin 0 -> 130 bytes docs/icons/small/sound.png | Bin 0 -> 197 bytes docs/icons/small/sound2.gif | Bin 0 -> 119 bytes docs/icons/small/sound2.png | Bin 0 -> 171 bytes docs/icons/small/tar.gif | Bin 0 -> 132 bytes docs/icons/small/tar.png | Bin 0 -> 173 bytes docs/icons/small/text.gif | Bin 0 -> 128 bytes docs/icons/small/text.png | Bin 0 -> 163 bytes docs/icons/small/transfer.gif | Bin 0 -> 124 bytes docs/icons/small/transfer.png | Bin 0 -> 211 bytes docs/icons/small/unknown.gif | Bin 0 -> 131 bytes docs/icons/small/unknown.png | Bin 0 -> 172 bytes docs/icons/small/uu.gif | Bin 0 -> 125 bytes docs/icons/small/uu.png | Bin 0 -> 166 bytes docs/icons/sound1.gif | Bin 0 -> 248 bytes docs/icons/sound1.png | Bin 0 -> 331 bytes docs/icons/sound2.gif | Bin 0 -> 221 bytes docs/icons/sound2.png | Bin 0 -> 315 bytes docs/icons/sphere1.gif | Bin 0 -> 285 bytes docs/icons/sphere1.png | Bin 0 -> 347 bytes docs/icons/sphere2.gif | Bin 0 -> 264 bytes docs/icons/sphere2.png | Bin 0 -> 339 bytes docs/icons/svg.png | Bin 0 -> 1010 bytes docs/icons/tar.gif | Bin 0 -> 219 bytes docs/icons/tar.png | Bin 0 -> 261 bytes docs/icons/tex.gif | Bin 0 -> 251 bytes docs/icons/tex.png | Bin 0 -> 310 bytes docs/icons/text.gif | Bin 0 -> 229 bytes docs/icons/text.png | Bin 0 -> 288 bytes docs/icons/transfer.gif | Bin 0 -> 242 bytes docs/icons/transfer.png | Bin 0 -> 334 bytes docs/icons/unknown.gif | Bin 0 -> 245 bytes docs/icons/unknown.png | Bin 0 -> 307 bytes docs/icons/up.gif | Bin 0 -> 164 bytes docs/icons/up.png | Bin 0 -> 255 bytes docs/icons/uu.gif | Bin 0 -> 236 bytes docs/icons/uu.png | Bin 0 -> 296 bytes docs/icons/uuencoded.gif | Bin 0 -> 236 bytes docs/icons/uuencoded.png | Bin 0 -> 296 bytes docs/icons/world1.gif | Bin 0 -> 228 bytes docs/icons/world1.png | Bin 0 -> 332 bytes docs/icons/world2.gif | Bin 0 -> 261 bytes docs/icons/world2.png | Bin 0 -> 363 bytes docs/icons/xml.png | Bin 0 -> 1053 bytes docs/man/ab.1 | 216 + docs/man/apachectl.8 | 95 + docs/man/apxs.1 | 247 + docs/man/dbmmanage.1 | 121 + docs/man/fcgistarter.8 | 59 + docs/man/htcacheclean.8 | 146 + docs/man/htdbm.1 | 187 + docs/man/htdigest.1 | 62 + docs/man/htpasswd.1 | 185 + docs/man/httpd.8 | 119 + docs/man/httxt2dbm.1 | 65 + docs/man/logresolve.1 | 51 + docs/man/rotatelogs.8 | 192 + docs/man/suexec.8 | 48 + docs/man/tr/ab.1 | 213 + docs/man/tr/apachectl.8 | 95 + docs/man/tr/apxs.1 | 251 + docs/man/tr/dbmmanage.1 | 121 + docs/man/tr/fcgistarter.8 | 59 + docs/man/tr/htcacheclean.8 | 146 + docs/man/tr/htdbm.1 | 187 + docs/man/tr/htdigest.1 | 62 + docs/man/tr/htpasswd.1 | 170 + docs/man/tr/httpd.8 | 119 + docs/man/tr/httxt2dbm.1 | 65 + docs/man/tr/logresolve.1 | 51 + docs/man/tr/rotatelogs.8 | 177 + docs/man/tr/suexec.8 | 48 + docs/manual/BUILDING | 2 + docs/manual/LICENSE | 202 + docs/manual/bind.html | 25 + docs/manual/bind.html.de | 229 + docs/manual/bind.html.en | 246 + docs/manual/bind.html.fr.utf8 | 254 + docs/manual/bind.html.ja.utf8 | 209 + docs/manual/bind.html.ko.euc-kr | 179 + docs/manual/bind.html.tr.utf8 | 244 + docs/manual/caching.html | 13 + docs/manual/caching.html.en | 908 + docs/manual/caching.html.fr.utf8 | 999 + docs/manual/caching.html.tr.utf8 | 889 + docs/manual/configuring.html | 25 + docs/manual/configuring.html.de | 216 + docs/manual/configuring.html.en | 235 + docs/manual/configuring.html.fr.utf8 | 249 + docs/manual/configuring.html.ja.utf8 | 205 + docs/manual/configuring.html.ko.euc-kr | 182 + docs/manual/configuring.html.tr.utf8 | 233 + docs/manual/content-negotiation.html | 21 + docs/manual/content-negotiation.html.en | 711 + docs/manual/content-negotiation.html.fr.utf8 | 743 + docs/manual/content-negotiation.html.ja.utf8 | 752 + .../manual/content-negotiation.html.ko.euc-kr | 632 + docs/manual/content-negotiation.html.tr.utf8 | 680 + docs/manual/convenience.map | 726 + docs/manual/custom-error.html | 25 + docs/manual/custom-error.html.en | 237 + docs/manual/custom-error.html.es | 249 + docs/manual/custom-error.html.fr.utf8 | 250 + docs/manual/custom-error.html.ja.utf8 | 229 + docs/manual/custom-error.html.ko.euc-kr | 230 + docs/manual/custom-error.html.tr.utf8 | 233 + docs/manual/developer/API.html | 5 + docs/manual/developer/API.html.en | 1245 + docs/manual/developer/debugging.html | 5 + docs/manual/developer/debugging.html.en | 60 + docs/manual/developer/documenting.html | 9 + docs/manual/developer/documenting.html.en | 112 + .../developer/documenting.html.zh-cn.utf8 | 109 + docs/manual/developer/filters.html | 5 + docs/manual/developer/filters.html.en | 234 + docs/manual/developer/hooks.html | 5 + docs/manual/developer/hooks.html.en | 261 + docs/manual/developer/index.html | 9 + docs/manual/developer/index.html.en | 89 + docs/manual/developer/index.html.zh-cn.utf8 | 88 + docs/manual/developer/modguide.html | 5 + docs/manual/developer/modguide.html.en | 1739 + docs/manual/developer/modules.html | 9 + docs/manual/developer/modules.html.en | 306 + docs/manual/developer/modules.html.ja.utf8 | 301 + docs/manual/developer/new_api_2_4.html | 5 + docs/manual/developer/new_api_2_4.html.en | 601 + docs/manual/developer/output-filters.html | 5 + docs/manual/developer/output-filters.html.en | 585 + docs/manual/developer/request.html | 5 + docs/manual/developer/request.html.en | 248 + docs/manual/developer/thread_safety.html | 5 + docs/manual/developer/thread_safety.html.en | 307 + docs/manual/dns-caveats.html | 21 + docs/manual/dns-caveats.html.en | 217 + docs/manual/dns-caveats.html.fr.utf8 | 226 + docs/manual/dns-caveats.html.ja.utf8 | 279 + docs/manual/dns-caveats.html.ko.euc-kr | 253 + docs/manual/dns-caveats.html.tr.utf8 | 207 + docs/manual/dso.html | 21 + docs/manual/dso.html.en | 332 + docs/manual/dso.html.fr.utf8 | 356 + docs/manual/dso.html.ja.utf8 | 330 + docs/manual/dso.html.ko.euc-kr | 306 + docs/manual/dso.html.tr.utf8 | 329 + docs/manual/env.html | 21 + docs/manual/env.html.en | 537 + docs/manual/env.html.fr.utf8 | 568 + docs/manual/env.html.ja.utf8 | 456 + docs/manual/env.html.ko.euc-kr | 400 + docs/manual/env.html.tr.utf8 | 530 + docs/manual/expr.html | 9 + docs/manual/expr.html.en | 657 + docs/manual/expr.html.fr.utf8 | 693 + docs/manual/faq/index.html | 21 + docs/manual/faq/index.html.en | 50 + docs/manual/faq/index.html.es | 50 + docs/manual/faq/index.html.fr.utf8 | 50 + docs/manual/faq/index.html.tr.utf8 | 50 + docs/manual/faq/index.html.zh-cn.utf8 | 49 + docs/manual/filter.html | 25 + docs/manual/filter.html.en | 183 + docs/manual/filter.html.es | 204 + docs/manual/filter.html.fr.utf8 | 201 + docs/manual/filter.html.ja.utf8 | 112 + docs/manual/filter.html.ko.euc-kr | 108 + docs/manual/filter.html.tr.utf8 | 194 + docs/manual/getting-started.html | 13 + docs/manual/getting-started.html.en | 254 + docs/manual/getting-started.html.fr.utf8 | 277 + docs/manual/getting-started.html.ru.utf8 | 271 + docs/manual/glossary.html | 29 + docs/manual/glossary.html.de | 583 + docs/manual/glossary.html.en | 515 + docs/manual/glossary.html.es | 556 + docs/manual/glossary.html.fr.utf8 | 619 + docs/manual/glossary.html.ja.utf8 | 482 + docs/manual/glossary.html.ko.euc-kr | 396 + docs/manual/glossary.html.tr.utf8 | 529 + docs/manual/handler.html | 29 + docs/manual/handler.html.en | 182 + docs/manual/handler.html.es | 195 + docs/manual/handler.html.fr.utf8 | 188 + docs/manual/handler.html.ja.utf8 | 189 + docs/manual/handler.html.ko.euc-kr | 181 + docs/manual/handler.html.tr.utf8 | 179 + docs/manual/handler.html.zh-cn.utf8 | 157 + docs/manual/howto/access.html | 13 + docs/manual/howto/access.html.en | 229 + docs/manual/howto/access.html.es | 236 + docs/manual/howto/access.html.fr.utf8 | 242 + docs/manual/howto/auth.html | 25 + docs/manual/howto/auth.html.en | 640 + docs/manual/howto/auth.html.es | 717 + docs/manual/howto/auth.html.fr.utf8 | 681 + docs/manual/howto/auth.html.ja.utf8 | 692 + docs/manual/howto/auth.html.ko.euc-kr | 355 + docs/manual/howto/auth.html.tr.utf8 | 639 + docs/manual/howto/cgi.html | 21 + docs/manual/howto/cgi.html.en | 601 + docs/manual/howto/cgi.html.es | 619 + docs/manual/howto/cgi.html.fr.utf8 | 643 + docs/manual/howto/cgi.html.ja.utf8 | 593 + docs/manual/howto/cgi.html.ko.euc-kr | 533 + docs/manual/howto/htaccess.html | 25 + docs/manual/howto/htaccess.html.en | 465 + docs/manual/howto/htaccess.html.es | 464 + docs/manual/howto/htaccess.html.fr.utf8 | 512 + docs/manual/howto/htaccess.html.ja.utf8 | 417 + docs/manual/howto/htaccess.html.ko.euc-kr | 363 + docs/manual/howto/htaccess.html.pt-br | 407 + docs/manual/howto/http2.html | 13 + docs/manual/howto/http2.html.en | 346 + docs/manual/howto/http2.html.es | 421 + docs/manual/howto/http2.html.fr.utf8 | 429 + docs/manual/howto/index.html | 25 + docs/manual/howto/index.html.en | 170 + docs/manual/howto/index.html.es | 163 + docs/manual/howto/index.html.fr.utf8 | 178 + docs/manual/howto/index.html.ja.utf8 | 132 + docs/manual/howto/index.html.ko.euc-kr | 124 + docs/manual/howto/index.html.zh-cn.utf8 | 121 + docs/manual/howto/public_html.html | 25 + docs/manual/howto/public_html.html.en | 218 + docs/manual/howto/public_html.html.es | 216 + docs/manual/howto/public_html.html.fr.utf8 | 235 + docs/manual/howto/public_html.html.ja.utf8 | 228 + docs/manual/howto/public_html.html.ko.euc-kr | 190 + docs/manual/howto/public_html.html.tr.utf8 | 229 + docs/manual/howto/reverse_proxy.html | 9 + docs/manual/howto/reverse_proxy.html.en | 360 + docs/manual/howto/reverse_proxy.html.fr.utf8 | 381 + docs/manual/howto/ssi.html | 21 + docs/manual/howto/ssi.html.en | 503 + docs/manual/howto/ssi.html.es | 361 + docs/manual/howto/ssi.html.fr.utf8 | 518 + docs/manual/howto/ssi.html.ja.utf8 | 515 + docs/manual/howto/ssi.html.ko.euc-kr | 458 + docs/manual/images/apache_header.gif | Bin 0 -> 4084 bytes docs/manual/images/bal-man-b.png | Bin 0 -> 321860 bytes docs/manual/images/bal-man-w.png | Bin 0 -> 374905 bytes docs/manual/images/bal-man.png | Bin 0 -> 255941 bytes docs/manual/images/build_a_mod_2.png | Bin 0 -> 74459 bytes docs/manual/images/build_a_mod_3.png | Bin 0 -> 51249 bytes docs/manual/images/build_a_mod_4.png | Bin 0 -> 40188 bytes docs/manual/images/caching_fig1.gif | Bin 0 -> 16515 bytes docs/manual/images/caching_fig1.png | Bin 0 -> 13452 bytes docs/manual/images/caching_fig1.tr.png | Bin 0 -> 11460 bytes docs/manual/images/custom_errordocs.png | Bin 0 -> 17167 bytes docs/manual/images/down.gif | Bin 0 -> 56 bytes docs/manual/images/favicon.ico | Bin 0 -> 1086 bytes docs/manual/images/feather.gif | Bin 0 -> 3656 bytes docs/manual/images/feather.png | Bin 0 -> 21145 bytes docs/manual/images/filter_arch.png | Bin 0 -> 2411 bytes docs/manual/images/filter_arch.tr.png | Bin 0 -> 2502 bytes docs/manual/images/home.gif | Bin 0 -> 1465 bytes docs/manual/images/index.gif | Bin 0 -> 1540 bytes docs/manual/images/left.gif | Bin 0 -> 60 bytes docs/manual/images/mod_filter_new.gif | Bin 0 -> 2392 bytes docs/manual/images/mod_filter_new.png | Bin 0 -> 1052 bytes docs/manual/images/mod_filter_new.tr.png | Bin 0 -> 1326 bytes docs/manual/images/mod_filter_old.gif | Bin 0 -> 1230 bytes docs/manual/images/mod_filter_old.png | Bin 0 -> 738 bytes docs/manual/images/mod_rewrite_fig1.gif | Bin 0 -> 3525 bytes docs/manual/images/mod_rewrite_fig1.png | Bin 0 -> 1700 bytes docs/manual/images/mod_rewrite_fig2.gif | Bin 0 -> 2553 bytes docs/manual/images/mod_rewrite_fig2.png | Bin 0 -> 1381 bytes docs/manual/images/pixel.gif | Bin 0 -> 61 bytes docs/manual/images/reverse-proxy-arch.png | Bin 0 -> 11702 bytes docs/manual/images/rewrite_backreferences.png | Bin 0 -> 37163 bytes docs/manual/images/rewrite_process_uri.png | Bin 0 -> 106807 bytes docs/manual/images/rewrite_rule_flow.png | Bin 0 -> 40325 bytes docs/manual/images/right.gif | Bin 0 -> 59 bytes docs/manual/images/ssl_intro_fig1.gif | Bin 0 -> 5738 bytes docs/manual/images/ssl_intro_fig1.png | Bin 0 -> 3331 bytes docs/manual/images/ssl_intro_fig2.gif | Bin 0 -> 2700 bytes docs/manual/images/ssl_intro_fig2.png | Bin 0 -> 1208 bytes docs/manual/images/ssl_intro_fig3.gif | Bin 0 -> 4020 bytes docs/manual/images/ssl_intro_fig3.png | Bin 0 -> 2568 bytes docs/manual/images/sub.gif | Bin 0 -> 6083 bytes docs/manual/images/syntax_rewritecond.png | Bin 0 -> 44876 bytes docs/manual/images/syntax_rewriterule.png | Bin 0 -> 53367 bytes docs/manual/images/up.gif | Bin 0 -> 57 bytes docs/manual/index.html | 45 + docs/manual/index.html.da | 121 + docs/manual/index.html.de | 130 + docs/manual/index.html.en | 127 + docs/manual/index.html.es | 129 + docs/manual/index.html.fr.utf8 | 130 + docs/manual/index.html.ja.utf8 | 129 + docs/manual/index.html.ko.euc-kr | 118 + docs/manual/index.html.pt-br | 123 + docs/manual/index.html.ru.utf8 | 127 + docs/manual/index.html.tr.utf8 | 127 + docs/manual/index.html.zh-cn.utf8 | 124 + docs/manual/install.html | 29 + docs/manual/install.html.de | 436 + docs/manual/install.html.en | 501 + docs/manual/install.html.es | 483 + docs/manual/install.html.fr.utf8 | 528 + docs/manual/install.html.ja.utf8 | 434 + docs/manual/install.html.ko.euc-kr | 388 + docs/manual/install.html.tr.utf8 | 497 + docs/manual/invoking.html | 29 + docs/manual/invoking.html.de | 187 + docs/manual/invoking.html.en | 175 + docs/manual/invoking.html.es | 190 + docs/manual/invoking.html.fr.utf8 | 188 + docs/manual/invoking.html.ja.utf8 | 185 + docs/manual/invoking.html.ko.euc-kr | 168 + docs/manual/invoking.html.tr.utf8 | 172 + docs/manual/license.html | 5 + docs/manual/license.html.en | 264 + docs/manual/logs.html | 21 + docs/manual/logs.html.en | 710 + docs/manual/logs.html.fr.utf8 | 761 + docs/manual/logs.html.ja.utf8 | 604 + docs/manual/logs.html.ko.euc-kr | 550 + docs/manual/logs.html.tr.utf8 | 684 + docs/manual/misc/index.html | 25 + docs/manual/misc/index.html.en | 94 + docs/manual/misc/index.html.es | 100 + docs/manual/misc/index.html.fr.utf8 | 99 + docs/manual/misc/index.html.ko.euc-kr | 95 + docs/manual/misc/index.html.tr.utf8 | 96 + docs/manual/misc/index.html.zh-cn.utf8 | 85 + docs/manual/misc/password_encryptions.html | 9 + docs/manual/misc/password_encryptions.html.en | 259 + .../misc/password_encryptions.html.fr.utf8 | 273 + docs/manual/misc/perf-tuning.html | 17 + docs/manual/misc/perf-tuning.html.en | 986 + docs/manual/misc/perf-tuning.html.fr.utf8 | 1058 + docs/manual/misc/perf-tuning.html.ko.euc-kr | 1006 + docs/manual/misc/perf-tuning.html.tr.utf8 | 1021 + docs/manual/misc/relevant_standards.html | 13 + docs/manual/misc/relevant_standards.html.en | 234 + .../misc/relevant_standards.html.fr.utf8 | 253 + .../misc/relevant_standards.html.ko.euc-kr | 221 + docs/manual/misc/security_tips.html | 17 + docs/manual/misc/security_tips.html.en | 487 + docs/manual/misc/security_tips.html.fr.utf8 | 509 + docs/manual/misc/security_tips.html.ko.euc-kr | 373 + docs/manual/misc/security_tips.html.tr.utf8 | 486 + docs/manual/mod/core.html | 25 + docs/manual/mod/core.html.de | 3926 ++ docs/manual/mod/core.html.en | 5327 ++ docs/manual/mod/core.html.es | 4617 ++ docs/manual/mod/core.html.fr.utf8 | 5712 ++ docs/manual/mod/core.html.ja.utf8 | 3840 ++ docs/manual/mod/core.html.tr.utf8 | 5271 ++ docs/manual/mod/directive-dict.html | 25 + docs/manual/mod/directive-dict.html.en | 323 + docs/manual/mod/directive-dict.html.es | 314 + docs/manual/mod/directive-dict.html.fr.utf8 | 319 + docs/manual/mod/directive-dict.html.ja.utf8 | 334 + docs/manual/mod/directive-dict.html.ko.euc-kr | 284 + docs/manual/mod/directive-dict.html.tr.utf8 | 305 + docs/manual/mod/directives.html | 33 + docs/manual/mod/directives.html.de | 805 + docs/manual/mod/directives.html.en | 806 + docs/manual/mod/directives.html.es | 808 + docs/manual/mod/directives.html.fr.utf8 | 806 + docs/manual/mod/directives.html.ja.utf8 | 803 + docs/manual/mod/directives.html.ko.euc-kr | 803 + docs/manual/mod/directives.html.tr.utf8 | 802 + docs/manual/mod/directives.html.zh-cn.utf8 | 801 + docs/manual/mod/event.html | 9 + docs/manual/mod/event.html.en | 432 + docs/manual/mod/event.html.fr.utf8 | 500 + docs/manual/mod/index.html | 33 + docs/manual/mod/index.html.de | 280 + docs/manual/mod/index.html.en | 276 + docs/manual/mod/index.html.es | 281 + docs/manual/mod/index.html.fr.utf8 | 322 + docs/manual/mod/index.html.ja.utf8 | 266 + docs/manual/mod/index.html.ko.euc-kr | 262 + docs/manual/mod/index.html.tr.utf8 | 269 + docs/manual/mod/index.html.zh-cn.utf8 | 271 + docs/manual/mod/mod_access_compat.html | 13 + docs/manual/mod/mod_access_compat.html.en | 499 + .../manual/mod/mod_access_compat.html.fr.utf8 | 524 + .../manual/mod/mod_access_compat.html.ja.utf8 | 476 + docs/manual/mod/mod_actions.html | 21 + docs/manual/mod/mod_actions.html.de | 197 + docs/manual/mod/mod_actions.html.en | 186 + docs/manual/mod/mod_actions.html.fr.utf8 | 196 + docs/manual/mod/mod_actions.html.ja.utf8 | 205 + docs/manual/mod/mod_actions.html.ko.euc-kr | 194 + docs/manual/mod/mod_alias.html | 21 + docs/manual/mod/mod_alias.html.en | 698 + docs/manual/mod/mod_alias.html.fr.utf8 | 708 + docs/manual/mod/mod_alias.html.ja.utf8 | 447 + docs/manual/mod/mod_alias.html.ko.euc-kr | 414 + docs/manual/mod/mod_alias.html.tr.utf8 | 649 + docs/manual/mod/mod_allowmethods.html | 9 + docs/manual/mod/mod_allowmethods.html.en | 116 + docs/manual/mod/mod_allowmethods.html.fr.utf8 | 119 + docs/manual/mod/mod_asis.html | 17 + docs/manual/mod/mod_asis.html.en | 143 + docs/manual/mod/mod_asis.html.fr.utf8 | 143 + docs/manual/mod/mod_asis.html.ja.utf8 | 144 + docs/manual/mod/mod_asis.html.ko.euc-kr | 138 + docs/manual/mod/mod_auth_basic.html | 17 + docs/manual/mod/mod_auth_basic.html.en | 288 + docs/manual/mod/mod_auth_basic.html.fr.utf8 | 315 + docs/manual/mod/mod_auth_basic.html.ja.utf8 | 198 + docs/manual/mod/mod_auth_basic.html.ko.euc-kr | 191 + docs/manual/mod/mod_auth_digest.html | 13 + docs/manual/mod/mod_auth_digest.html.en | 298 + docs/manual/mod/mod_auth_digest.html.fr.utf8 | 316 + .../manual/mod/mod_auth_digest.html.ko.euc-kr | 317 + docs/manual/mod/mod_auth_form.html | 9 + docs/manual/mod/mod_auth_form.html.en | 734 + docs/manual/mod/mod_auth_form.html.fr.utf8 | 820 + docs/manual/mod/mod_authn_anon.html | 17 + docs/manual/mod/mod_authn_anon.html.en | 247 + docs/manual/mod/mod_authn_anon.html.fr.utf8 | 262 + docs/manual/mod/mod_authn_anon.html.ja.utf8 | 251 + docs/manual/mod/mod_authn_anon.html.ko.euc-kr | 243 + docs/manual/mod/mod_authn_core.html | 9 + docs/manual/mod/mod_authn_core.html.en | 281 + docs/manual/mod/mod_authn_core.html.fr.utf8 | 297 + docs/manual/mod/mod_authn_dbd.html | 9 + docs/manual/mod/mod_authn_dbd.html.en | 231 + docs/manual/mod/mod_authn_dbd.html.fr.utf8 | 248 + docs/manual/mod/mod_authn_dbm.html | 17 + docs/manual/mod/mod_authn_dbm.html.en | 179 + docs/manual/mod/mod_authn_dbm.html.fr.utf8 | 188 + docs/manual/mod/mod_authn_dbm.html.ja.utf8 | 167 + docs/manual/mod/mod_authn_dbm.html.ko.euc-kr | 159 + docs/manual/mod/mod_authn_file.html | 17 + docs/manual/mod/mod_authn_file.html.en | 164 + docs/manual/mod/mod_authn_file.html.fr.utf8 | 173 + docs/manual/mod/mod_authn_file.html.ja.utf8 | 174 + docs/manual/mod/mod_authn_file.html.ko.euc-kr | 157 + docs/manual/mod/mod_authn_socache.html | 9 + docs/manual/mod/mod_authn_socache.html.en | 255 + .../manual/mod/mod_authn_socache.html.fr.utf8 | 286 + docs/manual/mod/mod_authnz_fcgi.html | 9 + docs/manual/mod/mod_authnz_fcgi.html.en | 566 + docs/manual/mod/mod_authnz_fcgi.html.fr.utf8 | 588 + docs/manual/mod/mod_authnz_ldap.html | 9 + docs/manual/mod/mod_authnz_ldap.html.en | 1462 + docs/manual/mod/mod_authnz_ldap.html.fr.utf8 | 1496 + docs/manual/mod/mod_authz_core.html | 9 + docs/manual/mod/mod_authz_core.html.en | 689 + docs/manual/mod/mod_authz_core.html.fr.utf8 | 697 + docs/manual/mod/mod_authz_dbd.html | 9 + docs/manual/mod/mod_authz_dbd.html.en | 315 + docs/manual/mod/mod_authz_dbd.html.fr.utf8 | 334 + docs/manual/mod/mod_authz_dbm.html | 13 + docs/manual/mod/mod_authz_dbm.html.en | 215 + docs/manual/mod/mod_authz_dbm.html.fr.utf8 | 225 + docs/manual/mod/mod_authz_dbm.html.ko.euc-kr | 156 + docs/manual/mod/mod_authz_groupfile.html | 17 + docs/manual/mod/mod_authz_groupfile.html.en | 158 + .../mod/mod_authz_groupfile.html.fr.utf8 | 165 + .../mod/mod_authz_groupfile.html.ja.utf8 | 130 + .../mod/mod_authz_groupfile.html.ko.euc-kr | 121 + docs/manual/mod/mod_authz_host.html | 9 + docs/manual/mod/mod_authz_host.html.en | 253 + docs/manual/mod/mod_authz_host.html.fr.utf8 | 256 + docs/manual/mod/mod_authz_owner.html | 17 + docs/manual/mod/mod_authz_owner.html.en | 169 + docs/manual/mod/mod_authz_owner.html.fr.utf8 | 182 + docs/manual/mod/mod_authz_owner.html.ja.utf8 | 182 + .../manual/mod/mod_authz_owner.html.ko.euc-kr | 177 + docs/manual/mod/mod_authz_user.html | 17 + docs/manual/mod/mod_authz_user.html.en | 122 + docs/manual/mod/mod_authz_user.html.fr.utf8 | 124 + docs/manual/mod/mod_authz_user.html.ja.utf8 | 90 + docs/manual/mod/mod_authz_user.html.ko.euc-kr | 88 + docs/manual/mod/mod_autoindex.html | 21 + docs/manual/mod/mod_autoindex.html.en | 1072 + docs/manual/mod/mod_autoindex.html.fr.utf8 | 1150 + docs/manual/mod/mod_autoindex.html.ja.utf8 | 1081 + docs/manual/mod/mod_autoindex.html.ko.euc-kr | 893 + docs/manual/mod/mod_autoindex.html.tr.utf8 | 1076 + docs/manual/mod/mod_brotli.html | 9 + docs/manual/mod/mod_brotli.html.en | 349 + docs/manual/mod/mod_brotli.html.fr.utf8 | 360 + docs/manual/mod/mod_buffer.html | 9 + docs/manual/mod/mod_buffer.html.en | 128 + docs/manual/mod/mod_buffer.html.fr.utf8 | 131 + docs/manual/mod/mod_cache.html | 17 + docs/manual/mod/mod_cache.html.en | 1078 + docs/manual/mod/mod_cache.html.fr.utf8 | 1187 + docs/manual/mod/mod_cache.html.ja.utf8 | 680 + docs/manual/mod/mod_cache.html.ko.euc-kr | 532 + docs/manual/mod/mod_cache_disk.html | 17 + docs/manual/mod/mod_cache_disk.html.en | 292 + docs/manual/mod/mod_cache_disk.html.fr.utf8 | 310 + docs/manual/mod/mod_cache_disk.html.ja.utf8 | 234 + docs/manual/mod/mod_cache_disk.html.ko.euc-kr | 228 + docs/manual/mod/mod_cache_socache.html | 9 + docs/manual/mod/mod_cache_socache.html.en | 266 + .../manual/mod/mod_cache_socache.html.fr.utf8 | 279 + docs/manual/mod/mod_cern_meta.html | 13 + docs/manual/mod/mod_cern_meta.html.en | 157 + docs/manual/mod/mod_cern_meta.html.fr.utf8 | 162 + docs/manual/mod/mod_cern_meta.html.ko.euc-kr | 150 + docs/manual/mod/mod_cgi.html | 17 + docs/manual/mod/mod_cgi.html.en | 317 + docs/manual/mod/mod_cgi.html.fr.utf8 | 334 + docs/manual/mod/mod_cgi.html.ja.utf8 | 295 + docs/manual/mod/mod_cgi.html.ko.euc-kr | 278 + docs/manual/mod/mod_cgid.html | 17 + docs/manual/mod/mod_cgid.html.en | 160 + docs/manual/mod/mod_cgid.html.fr.utf8 | 164 + docs/manual/mod/mod_cgid.html.ja.utf8 | 147 + docs/manual/mod/mod_cgid.html.ko.euc-kr | 143 + docs/manual/mod/mod_charset_lite.html | 13 + docs/manual/mod/mod_charset_lite.html.en | 236 + docs/manual/mod/mod_charset_lite.html.fr.utf8 | 252 + .../mod/mod_charset_lite.html.ko.euc-kr | 228 + docs/manual/mod/mod_data.html | 9 + docs/manual/mod/mod_data.html.en | 106 + docs/manual/mod/mod_data.html.fr.utf8 | 105 + docs/manual/mod/mod_dav.html | 17 + docs/manual/mod/mod_dav.html.en | 311 + docs/manual/mod/mod_dav.html.fr.utf8 | 333 + docs/manual/mod/mod_dav.html.ja.utf8 | 305 + docs/manual/mod/mod_dav.html.ko.euc-kr | 307 + docs/manual/mod/mod_dav_fs.html | 17 + docs/manual/mod/mod_dav_fs.html.en | 144 + docs/manual/mod/mod_dav_fs.html.fr.utf8 | 151 + docs/manual/mod/mod_dav_fs.html.ja.utf8 | 135 + docs/manual/mod/mod_dav_fs.html.ko.euc-kr | 140 + docs/manual/mod/mod_dav_lock.html | 13 + docs/manual/mod/mod_dav_lock.html.en | 128 + docs/manual/mod/mod_dav_lock.html.fr.utf8 | 137 + docs/manual/mod/mod_dav_lock.html.ja.utf8 | 132 + docs/manual/mod/mod_dbd.html | 9 + docs/manual/mod/mod_dbd.html.en | 394 + docs/manual/mod/mod_dbd.html.fr.utf8 | 421 + docs/manual/mod/mod_deflate.html | 17 + docs/manual/mod/mod_deflate.html.en | 474 + docs/manual/mod/mod_deflate.html.fr.utf8 | 511 + docs/manual/mod/mod_deflate.html.ja.utf8 | 467 + docs/manual/mod/mod_deflate.html.ko.euc-kr | 453 + docs/manual/mod/mod_dialup.html | 9 + docs/manual/mod/mod_dialup.html.en | 107 + docs/manual/mod/mod_dialup.html.fr.utf8 | 113 + docs/manual/mod/mod_dir.html | 21 + docs/manual/mod/mod_dir.html.en | 349 + docs/manual/mod/mod_dir.html.fr.utf8 | 382 + docs/manual/mod/mod_dir.html.ja.utf8 | 261 + docs/manual/mod/mod_dir.html.ko.euc-kr | 246 + docs/manual/mod/mod_dir.html.tr.utf8 | 365 + docs/manual/mod/mod_dumpio.html | 13 + docs/manual/mod/mod_dumpio.html.en | 139 + docs/manual/mod/mod_dumpio.html.fr.utf8 | 142 + docs/manual/mod/mod_dumpio.html.ja.utf8 | 139 + docs/manual/mod/mod_echo.html | 17 + docs/manual/mod/mod_echo.html.en | 100 + docs/manual/mod/mod_echo.html.fr.utf8 | 100 + docs/manual/mod/mod_echo.html.ja.utf8 | 100 + docs/manual/mod/mod_echo.html.ko.euc-kr | 103 + docs/manual/mod/mod_env.html | 21 + docs/manual/mod/mod_env.html.en | 165 + docs/manual/mod/mod_env.html.fr.utf8 | 172 + docs/manual/mod/mod_env.html.ja.utf8 | 151 + docs/manual/mod/mod_env.html.ko.euc-kr | 144 + docs/manual/mod/mod_env.html.tr.utf8 | 166 + docs/manual/mod/mod_example_hooks.html | 13 + docs/manual/mod/mod_example_hooks.html.en | 184 + .../manual/mod/mod_example_hooks.html.fr.utf8 | 196 + .../mod/mod_example_hooks.html.ko.euc-kr | 185 + docs/manual/mod/mod_expires.html | 17 + docs/manual/mod/mod_expires.html.en | 274 + docs/manual/mod/mod_expires.html.fr.utf8 | 280 + docs/manual/mod/mod_expires.html.ja.utf8 | 267 + docs/manual/mod/mod_expires.html.ko.euc-kr | 257 + docs/manual/mod/mod_ext_filter.html | 17 + docs/manual/mod/mod_ext_filter.html.en | 362 + docs/manual/mod/mod_ext_filter.html.fr.utf8 | 383 + docs/manual/mod/mod_ext_filter.html.ja.utf8 | 399 + docs/manual/mod/mod_ext_filter.html.ko.euc-kr | 382 + docs/manual/mod/mod_file_cache.html | 13 + docs/manual/mod/mod_file_cache.html.en | 238 + docs/manual/mod/mod_file_cache.html.fr.utf8 | 271 + docs/manual/mod/mod_file_cache.html.ko.euc-kr | 232 + docs/manual/mod/mod_filter.html | 9 + docs/manual/mod/mod_filter.html.en | 525 + docs/manual/mod/mod_filter.html.fr.utf8 | 569 + docs/manual/mod/mod_headers.html | 17 + docs/manual/mod/mod_headers.html.en | 623 + docs/manual/mod/mod_headers.html.fr.utf8 | 680 + docs/manual/mod/mod_headers.html.ja.utf8 | 381 + docs/manual/mod/mod_headers.html.ko.euc-kr | 369 + docs/manual/mod/mod_heartbeat.html | 9 + docs/manual/mod/mod_heartbeat.html.en | 135 + docs/manual/mod/mod_heartbeat.html.fr.utf8 | 142 + docs/manual/mod/mod_heartmonitor.html | 9 + docs/manual/mod/mod_heartmonitor.html.en | 155 + docs/manual/mod/mod_heartmonitor.html.fr.utf8 | 166 + docs/manual/mod/mod_http2.html | 9 + docs/manual/mod/mod_http2.html.en | 1099 + docs/manual/mod/mod_http2.html.fr.utf8 | 1247 + docs/manual/mod/mod_ident.html | 17 + docs/manual/mod/mod_ident.html.en | 131 + docs/manual/mod/mod_ident.html.fr.utf8 | 140 + docs/manual/mod/mod_ident.html.ja.utf8 | 131 + docs/manual/mod/mod_ident.html.ko.euc-kr | 128 + docs/manual/mod/mod_imagemap.html | 13 + docs/manual/mod/mod_imagemap.html.en | 416 + docs/manual/mod/mod_imagemap.html.fr.utf8 | 440 + docs/manual/mod/mod_imagemap.html.ko.euc-kr | 393 + docs/manual/mod/mod_include.html | 13 + docs/manual/mod/mod_include.html.en | 1150 + docs/manual/mod/mod_include.html.fr.utf8 | 1234 + docs/manual/mod/mod_include.html.ja.utf8 | 901 + docs/manual/mod/mod_info.html | 17 + docs/manual/mod/mod_info.html.en | 231 + docs/manual/mod/mod_info.html.fr.utf8 | 240 + docs/manual/mod/mod_info.html.ja.utf8 | 222 + docs/manual/mod/mod_info.html.ko.euc-kr | 199 + docs/manual/mod/mod_isapi.html | 13 + docs/manual/mod/mod_isapi.html.en | 371 + docs/manual/mod/mod_isapi.html.fr.utf8 | 393 + docs/manual/mod/mod_isapi.html.ko.euc-kr | 349 + docs/manual/mod/mod_lbmethod_bybusyness.html | 9 + .../mod/mod_lbmethod_bybusyness.html.en | 103 + .../mod/mod_lbmethod_bybusyness.html.fr.utf8 | 109 + docs/manual/mod/mod_lbmethod_byrequests.html | 9 + .../mod/mod_lbmethod_byrequests.html.en | 255 + .../mod/mod_lbmethod_byrequests.html.fr.utf8 | 264 + docs/manual/mod/mod_lbmethod_bytraffic.html | 9 + .../manual/mod/mod_lbmethod_bytraffic.html.en | 119 + .../mod/mod_lbmethod_bytraffic.html.fr.utf8 | 125 + docs/manual/mod/mod_lbmethod_heartbeat.html | 9 + .../manual/mod/mod_lbmethod_heartbeat.html.en | 102 + .../mod/mod_lbmethod_heartbeat.html.fr.utf8 | 109 + docs/manual/mod/mod_ldap.html | 9 + docs/manual/mod/mod_ldap.html.en | 878 + docs/manual/mod/mod_ldap.html.fr.utf8 | 958 + docs/manual/mod/mod_log_config.html | 21 + docs/manual/mod/mod_log_config.html.en | 606 + docs/manual/mod/mod_log_config.html.fr.utf8 | 645 + docs/manual/mod/mod_log_config.html.ja.utf8 | 510 + docs/manual/mod/mod_log_config.html.ko.euc-kr | 441 + docs/manual/mod/mod_log_config.html.tr.utf8 | 586 + docs/manual/mod/mod_log_debug.html | 9 + docs/manual/mod/mod_log_debug.html.en | 172 + docs/manual/mod/mod_log_debug.html.fr.utf8 | 183 + docs/manual/mod/mod_log_forensic.html | 17 + docs/manual/mod/mod_log_forensic.html.en | 196 + docs/manual/mod/mod_log_forensic.html.fr.utf8 | 218 + docs/manual/mod/mod_log_forensic.html.ja.utf8 | 197 + docs/manual/mod/mod_log_forensic.html.tr.utf8 | 195 + docs/manual/mod/mod_logio.html | 21 + docs/manual/mod/mod_logio.html.en | 154 + docs/manual/mod/mod_logio.html.fr.utf8 | 166 + docs/manual/mod/mod_logio.html.ja.utf8 | 141 + docs/manual/mod/mod_logio.html.ko.euc-kr | 140 + docs/manual/mod/mod_logio.html.tr.utf8 | 151 + docs/manual/mod/mod_lua.html | 9 + docs/manual/mod/mod_lua.html.en | 1922 + docs/manual/mod/mod_lua.html.fr.utf8 | 2079 + docs/manual/mod/mod_macro.html | 9 + docs/manual/mod/mod_macro.html.en | 303 + docs/manual/mod/mod_macro.html.fr.utf8 | 310 + docs/manual/mod/mod_md.html | 9 + docs/manual/mod/mod_md.html.en | 1536 + docs/manual/mod/mod_md.html.fr.utf8 | 1784 + docs/manual/mod/mod_mime.html | 13 + docs/manual/mod/mod_mime.html.en | 1060 + docs/manual/mod/mod_mime.html.fr.utf8 | 1129 + docs/manual/mod/mod_mime.html.ja.utf8 | 1011 + docs/manual/mod/mod_mime_magic.html | 9 + docs/manual/mod/mod_mime_magic.html.en | 304 + docs/manual/mod/mod_mime_magic.html.fr.utf8 | 312 + docs/manual/mod/mod_negotiation.html | 13 + docs/manual/mod/mod_negotiation.html.en | 372 + docs/manual/mod/mod_negotiation.html.fr.utf8 | 388 + docs/manual/mod/mod_negotiation.html.ja.utf8 | 332 + docs/manual/mod/mod_nw_ssl.html | 9 + docs/manual/mod/mod_nw_ssl.html.en | 127 + docs/manual/mod/mod_nw_ssl.html.fr.utf8 | 131 + docs/manual/mod/mod_privileges.html | 9 + docs/manual/mod/mod_privileges.html.en | 427 + docs/manual/mod/mod_privileges.html.fr.utf8 | 480 + docs/manual/mod/mod_proxy.html | 13 + docs/manual/mod/mod_proxy.html.en | 2194 + docs/manual/mod/mod_proxy.html.fr.utf8 | 2495 + docs/manual/mod/mod_proxy.html.ja.utf8 | 1288 + docs/manual/mod/mod_proxy_ajp.html | 13 + docs/manual/mod/mod_proxy_ajp.html.en | 639 + docs/manual/mod/mod_proxy_ajp.html.fr.utf8 | 693 + docs/manual/mod/mod_proxy_ajp.html.ja.utf8 | 565 + docs/manual/mod/mod_proxy_balancer.html | 13 + docs/manual/mod/mod_proxy_balancer.html.en | 363 + .../mod/mod_proxy_balancer.html.fr.utf8 | 408 + .../mod/mod_proxy_balancer.html.ja.utf8 | 349 + docs/manual/mod/mod_proxy_connect.html | 13 + docs/manual/mod/mod_proxy_connect.html.en | 137 + .../manual/mod/mod_proxy_connect.html.fr.utf8 | 143 + .../manual/mod/mod_proxy_connect.html.ja.utf8 | 114 + docs/manual/mod/mod_proxy_express.html | 9 + docs/manual/mod/mod_proxy_express.html.en | 204 + .../manual/mod/mod_proxy_express.html.fr.utf8 | 207 + docs/manual/mod/mod_proxy_fcgi.html | 9 + docs/manual/mod/mod_proxy_fcgi.html.en | 356 + docs/manual/mod/mod_proxy_fcgi.html.fr.utf8 | 380 + docs/manual/mod/mod_proxy_fdpass.html | 9 + docs/manual/mod/mod_proxy_fdpass.html.en | 101 + docs/manual/mod/mod_proxy_fdpass.html.fr.utf8 | 104 + docs/manual/mod/mod_proxy_ftp.html | 9 + docs/manual/mod/mod_proxy_ftp.html.en | 267 + docs/manual/mod/mod_proxy_ftp.html.fr.utf8 | 296 + docs/manual/mod/mod_proxy_hcheck.html | 9 + docs/manual/mod/mod_proxy_hcheck.html.en | 282 + docs/manual/mod/mod_proxy_hcheck.html.fr.utf8 | 314 + docs/manual/mod/mod_proxy_html.html | 9 + docs/manual/mod/mod_proxy_html.html.en | 490 + docs/manual/mod/mod_proxy_html.html.fr.utf8 | 555 + docs/manual/mod/mod_proxy_http.html | 9 + docs/manual/mod/mod_proxy_http.html.en | 174 + docs/manual/mod/mod_proxy_http.html.fr.utf8 | 193 + docs/manual/mod/mod_proxy_http2.html | 9 + docs/manual/mod/mod_proxy_http2.html.en | 156 + docs/manual/mod/mod_proxy_http2.html.fr.utf8 | 156 + docs/manual/mod/mod_proxy_scgi.html | 9 + docs/manual/mod/mod_proxy_scgi.html.en | 213 + docs/manual/mod/mod_proxy_scgi.html.fr.utf8 | 230 + docs/manual/mod/mod_proxy_uwsgi.html | 9 + docs/manual/mod/mod_proxy_uwsgi.html.en | 113 + docs/manual/mod/mod_proxy_uwsgi.html.fr.utf8 | 116 + docs/manual/mod/mod_proxy_wstunnel.html | 9 + docs/manual/mod/mod_proxy_wstunnel.html.en | 152 + .../mod/mod_proxy_wstunnel.html.fr.utf8 | 157 + docs/manual/mod/mod_ratelimit.html | 9 + docs/manual/mod/mod_ratelimit.html.en | 100 + docs/manual/mod/mod_ratelimit.html.fr.utf8 | 104 + docs/manual/mod/mod_reflector.html | 9 + docs/manual/mod/mod_reflector.html.en | 125 + docs/manual/mod/mod_reflector.html.fr.utf8 | 129 + docs/manual/mod/mod_remoteip.html | 9 + docs/manual/mod/mod_remoteip.html.en | 379 + docs/manual/mod/mod_remoteip.html.fr.utf8 | 425 + docs/manual/mod/mod_reqtimeout.html | 9 + docs/manual/mod/mod_reqtimeout.html.en | 224 + docs/manual/mod/mod_reqtimeout.html.fr.utf8 | 234 + docs/manual/mod/mod_request.html | 13 + docs/manual/mod/mod_request.html.en | 132 + docs/manual/mod/mod_request.html.fr.utf8 | 138 + docs/manual/mod/mod_request.html.tr.utf8 | 132 + docs/manual/mod/mod_rewrite.html | 9 + docs/manual/mod/mod_rewrite.html.en | 1644 + docs/manual/mod/mod_rewrite.html.fr.utf8 | 1760 + docs/manual/mod/mod_sed.html | 9 + docs/manual/mod/mod_sed.html.en | 176 + docs/manual/mod/mod_sed.html.fr.utf8 | 191 + docs/manual/mod/mod_session.html | 9 + docs/manual/mod/mod_session.html.en | 550 + docs/manual/mod/mod_session.html.fr.utf8 | 619 + docs/manual/mod/mod_session_cookie.html | 9 + docs/manual/mod/mod_session_cookie.html.en | 197 + .../mod/mod_session_cookie.html.fr.utf8 | 217 + docs/manual/mod/mod_session_crypto.html | 9 + docs/manual/mod/mod_session_crypto.html.en | 266 + .../mod/mod_session_crypto.html.fr.utf8 | 293 + docs/manual/mod/mod_session_dbd.html | 9 + docs/manual/mod/mod_session_dbd.html.en | 357 + docs/manual/mod/mod_session_dbd.html.fr.utf8 | 407 + docs/manual/mod/mod_setenvif.html | 21 + docs/manual/mod/mod_setenvif.html.en | 362 + docs/manual/mod/mod_setenvif.html.fr.utf8 | 373 + docs/manual/mod/mod_setenvif.html.ja.utf8 | 340 + docs/manual/mod/mod_setenvif.html.ko.euc-kr | 297 + docs/manual/mod/mod_setenvif.html.tr.utf8 | 348 + docs/manual/mod/mod_slotmem_plain.html | 9 + docs/manual/mod/mod_slotmem_plain.html.en | 121 + .../manual/mod/mod_slotmem_plain.html.fr.utf8 | 123 + docs/manual/mod/mod_slotmem_shm.html | 9 + docs/manual/mod/mod_slotmem_shm.html.en | 129 + docs/manual/mod/mod_slotmem_shm.html.fr.utf8 | 138 + docs/manual/mod/mod_so.html | 21 + docs/manual/mod/mod_so.html.en | 228 + docs/manual/mod/mod_so.html.fr.utf8 | 244 + docs/manual/mod/mod_so.html.ja.utf8 | 230 + docs/manual/mod/mod_so.html.ko.euc-kr | 208 + docs/manual/mod/mod_so.html.tr.utf8 | 230 + docs/manual/mod/mod_socache_dbm.html | 9 + docs/manual/mod/mod_socache_dbm.html.en | 87 + docs/manual/mod/mod_socache_dbm.html.fr.utf8 | 86 + docs/manual/mod/mod_socache_dc.html | 9 + docs/manual/mod/mod_socache_dc.html.en | 84 + docs/manual/mod/mod_socache_dc.html.fr.utf8 | 83 + docs/manual/mod/mod_socache_memcache.html | 9 + docs/manual/mod/mod_socache_memcache.html.en | 129 + .../mod/mod_socache_memcache.html.fr.utf8 | 135 + docs/manual/mod/mod_socache_redis.html | 9 + docs/manual/mod/mod_socache_redis.html.en | 153 + .../manual/mod/mod_socache_redis.html.fr.utf8 | 156 + docs/manual/mod/mod_socache_shmcb.html | 9 + docs/manual/mod/mod_socache_shmcb.html.en | 87 + .../manual/mod/mod_socache_shmcb.html.fr.utf8 | 87 + docs/manual/mod/mod_speling.html | 17 + docs/manual/mod/mod_speling.html.en | 192 + docs/manual/mod/mod_speling.html.fr.utf8 | 196 + docs/manual/mod/mod_speling.html.ja.utf8 | 193 + docs/manual/mod/mod_speling.html.ko.euc-kr | 176 + docs/manual/mod/mod_ssl.html | 9 + docs/manual/mod/mod_ssl.html.en | 2895 + docs/manual/mod/mod_ssl.html.fr.utf8 | 3211 ++ docs/manual/mod/mod_status.html | 21 + docs/manual/mod/mod_status.html.en | 204 + docs/manual/mod/mod_status.html.fr.utf8 | 210 + docs/manual/mod/mod_status.html.ja.utf8 | 172 + docs/manual/mod/mod_status.html.ko.euc-kr | 165 + docs/manual/mod/mod_status.html.tr.utf8 | 198 + docs/manual/mod/mod_substitute.html | 9 + docs/manual/mod/mod_substitute.html.en | 224 + docs/manual/mod/mod_substitute.html.fr.utf8 | 241 + docs/manual/mod/mod_suexec.html | 21 + docs/manual/mod/mod_suexec.html.en | 109 + docs/manual/mod/mod_suexec.html.fr.utf8 | 114 + docs/manual/mod/mod_suexec.html.ja.utf8 | 113 + docs/manual/mod/mod_suexec.html.ko.euc-kr | 111 + docs/manual/mod/mod_suexec.html.tr.utf8 | 113 + docs/manual/mod/mod_systemd.html | 9 + docs/manual/mod/mod_systemd.html.en | 113 + docs/manual/mod/mod_systemd.html.fr.utf8 | 113 + docs/manual/mod/mod_unique_id.html | 17 + docs/manual/mod/mod_unique_id.html.en | 250 + docs/manual/mod/mod_unique_id.html.fr.utf8 | 272 + docs/manual/mod/mod_unique_id.html.ja.utf8 | 248 + docs/manual/mod/mod_unique_id.html.ko.euc-kr | 221 + docs/manual/mod/mod_unixd.html | 13 + docs/manual/mod/mod_unixd.html.en | 211 + docs/manual/mod/mod_unixd.html.fr.utf8 | 226 + docs/manual/mod/mod_unixd.html.tr.utf8 | 214 + docs/manual/mod/mod_userdir.html | 21 + docs/manual/mod/mod_userdir.html.en | 223 + docs/manual/mod/mod_userdir.html.fr.utf8 | 236 + docs/manual/mod/mod_userdir.html.ja.utf8 | 219 + docs/manual/mod/mod_userdir.html.ko.euc-kr | 191 + docs/manual/mod/mod_userdir.html.tr.utf8 | 222 + docs/manual/mod/mod_usertrack.html | 9 + docs/manual/mod/mod_usertrack.html.en | 304 + docs/manual/mod/mod_usertrack.html.fr.utf8 | 313 + docs/manual/mod/mod_version.html | 17 + docs/manual/mod/mod_version.html.en | 166 + docs/manual/mod/mod_version.html.fr.utf8 | 176 + docs/manual/mod/mod_version.html.ja.utf8 | 164 + docs/manual/mod/mod_version.html.ko.euc-kr | 180 + docs/manual/mod/mod_vhost_alias.html | 13 + docs/manual/mod/mod_vhost_alias.html.en | 361 + docs/manual/mod/mod_vhost_alias.html.fr.utf8 | 385 + docs/manual/mod/mod_vhost_alias.html.tr.utf8 | 354 + docs/manual/mod/mod_watchdog.html | 9 + docs/manual/mod/mod_watchdog.html.en | 106 + docs/manual/mod/mod_watchdog.html.fr.utf8 | 110 + docs/manual/mod/mod_xml2enc.html | 9 + docs/manual/mod/mod_xml2enc.html.en | 219 + docs/manual/mod/mod_xml2enc.html.fr.utf8 | 239 + docs/manual/mod/module-dict.html | 21 + docs/manual/mod/module-dict.html.en | 147 + docs/manual/mod/module-dict.html.fr.utf8 | 147 + docs/manual/mod/module-dict.html.ja.utf8 | 149 + docs/manual/mod/module-dict.html.ko.euc-kr | 139 + docs/manual/mod/module-dict.html.tr.utf8 | 119 + docs/manual/mod/mpm_common.html | 21 + docs/manual/mod/mpm_common.html.de | 780 + docs/manual/mod/mpm_common.html.en | 891 + docs/manual/mod/mpm_common.html.fr.utf8 | 975 + docs/manual/mod/mpm_common.html.ja.utf8 | 801 + docs/manual/mod/mpm_common.html.tr.utf8 | 910 + docs/manual/mod/mpm_netware.html | 9 + docs/manual/mod/mpm_netware.html.en | 138 + docs/manual/mod/mpm_netware.html.fr.utf8 | 140 + docs/manual/mod/mpm_winnt.html | 17 + docs/manual/mod/mpm_winnt.html.de | 99 + docs/manual/mod/mpm_winnt.html.en | 157 + docs/manual/mod/mpm_winnt.html.fr.utf8 | 163 + docs/manual/mod/mpm_winnt.html.ja.utf8 | 101 + docs/manual/mod/mpmt_os2.html | 9 + docs/manual/mod/mpmt_os2.html.en | 101 + docs/manual/mod/mpmt_os2.html.fr.utf8 | 102 + docs/manual/mod/overrides.html | 9 + docs/manual/mod/overrides.html.en | 753 + docs/manual/mod/overrides.html.fr.utf8 | 848 + docs/manual/mod/prefork.html | 21 + docs/manual/mod/prefork.html.de | 222 + docs/manual/mod/prefork.html.en | 218 + docs/manual/mod/prefork.html.fr.utf8 | 233 + docs/manual/mod/prefork.html.ja.utf8 | 220 + docs/manual/mod/prefork.html.tr.utf8 | 217 + docs/manual/mod/quickreference.html | 33 + docs/manual/mod/quickreference.html.de | 1263 + docs/manual/mod/quickreference.html.en | 1248 + docs/manual/mod/quickreference.html.es | 1252 + docs/manual/mod/quickreference.html.fr.utf8 | 1588 + docs/manual/mod/quickreference.html.ja.utf8 | 1178 + docs/manual/mod/quickreference.html.ko.euc-kr | 1206 + docs/manual/mod/quickreference.html.tr.utf8 | 1245 + .../manual/mod/quickreference.html.zh-cn.utf8 | 1243 + docs/manual/mod/worker.html | 21 + docs/manual/mod/worker.html.de | 201 + docs/manual/mod/worker.html.en | 208 + docs/manual/mod/worker.html.fr.utf8 | 212 + docs/manual/mod/worker.html.ja.utf8 | 217 + docs/manual/mod/worker.html.tr.utf8 | 203 + docs/manual/mpm.html | 33 + docs/manual/mpm.html.de | 160 + docs/manual/mpm.html.en | 211 + docs/manual/mpm.html.es | 151 + docs/manual/mpm.html.fr.utf8 | 227 + docs/manual/mpm.html.ja.utf8 | 166 + docs/manual/mpm.html.ko.euc-kr | 154 + docs/manual/mpm.html.tr.utf8 | 210 + docs/manual/mpm.html.zh-cn.utf8 | 155 + docs/manual/new_features_2_0.html | 29 + docs/manual/new_features_2_0.html.de | 295 + docs/manual/new_features_2_0.html.en | 268 + docs/manual/new_features_2_0.html.fr.utf8 | 284 + docs/manual/new_features_2_0.html.ja.utf8 | 283 + docs/manual/new_features_2_0.html.ko.euc-kr | 261 + docs/manual/new_features_2_0.html.pt-br | 271 + docs/manual/new_features_2_0.html.tr.utf8 | 275 + docs/manual/new_features_2_2.html | 21 + docs/manual/new_features_2_2.html.en | 305 + docs/manual/new_features_2_2.html.fr.utf8 | 331 + docs/manual/new_features_2_2.html.ko.euc-kr | 156 + docs/manual/new_features_2_2.html.pt-br | 165 + docs/manual/new_features_2_2.html.tr.utf8 | 305 + docs/manual/new_features_2_4.html | 13 + docs/manual/new_features_2_4.html.en | 473 + docs/manual/new_features_2_4.html.fr.utf8 | 523 + docs/manual/new_features_2_4.html.tr.utf8 | 492 + docs/manual/platform/ebcdic.html | 9 + docs/manual/platform/ebcdic.html.en | 616 + docs/manual/platform/ebcdic.html.ko.euc-kr | 585 + docs/manual/platform/index.html | 17 + docs/manual/platform/index.html.en | 124 + docs/manual/platform/index.html.fr.utf8 | 130 + docs/manual/platform/index.html.ko.euc-kr | 109 + docs/manual/platform/index.html.zh-cn.utf8 | 103 + docs/manual/platform/netware.html | 13 + docs/manual/platform/netware.html.en | 693 + docs/manual/platform/netware.html.fr.utf8 | 763 + docs/manual/platform/netware.html.ko.euc-kr | 609 + docs/manual/platform/perf-hp.html | 13 + docs/manual/platform/perf-hp.html.en | 131 + docs/manual/platform/perf-hp.html.fr.utf8 | 143 + docs/manual/platform/perf-hp.html.ko.euc-kr | 128 + docs/manual/platform/rpm.html | 9 + docs/manual/platform/rpm.html.en | 248 + docs/manual/platform/rpm.html.fr.utf8 | 264 + docs/manual/platform/win_compiling.html | 13 + docs/manual/platform/win_compiling.html.en | 517 + .../platform/win_compiling.html.fr.utf8 | 603 + .../platform/win_compiling.html.ko.euc-kr | 448 + docs/manual/platform/windows.html | 13 + docs/manual/platform/windows.html.en | 677 + docs/manual/platform/windows.html.fr.utf8 | 732 + docs/manual/platform/windows.html.ko.euc-kr | 716 + docs/manual/programs/ab.html | 17 + docs/manual/programs/ab.html.en | 360 + docs/manual/programs/ab.html.fr.utf8 | 404 + docs/manual/programs/ab.html.ko.euc-kr | 231 + docs/manual/programs/ab.html.tr.utf8 | 383 + docs/manual/programs/apachectl.html | 17 + docs/manual/programs/apachectl.html.en | 188 + docs/manual/programs/apachectl.html.fr.utf8 | 202 + docs/manual/programs/apachectl.html.ko.euc-kr | 174 + docs/manual/programs/apachectl.html.tr.utf8 | 195 + docs/manual/programs/apxs.html | 17 + docs/manual/programs/apxs.html.en | 364 + docs/manual/programs/apxs.html.fr.utf8 | 395 + docs/manual/programs/apxs.html.ko.euc-kr | 354 + docs/manual/programs/apxs.html.tr.utf8 | 388 + docs/manual/programs/configure.html | 17 + docs/manual/programs/configure.html.en | 706 + docs/manual/programs/configure.html.fr.utf8 | 790 + docs/manual/programs/configure.html.ko.euc-kr | 960 + docs/manual/programs/configure.html.tr.utf8 | 772 + docs/manual/programs/dbmmanage.html | 17 + docs/manual/programs/dbmmanage.html.en | 224 + docs/manual/programs/dbmmanage.html.fr.utf8 | 247 + docs/manual/programs/dbmmanage.html.ko.euc-kr | 202 + docs/manual/programs/dbmmanage.html.tr.utf8 | 241 + docs/manual/programs/fcgistarter.html | 13 + docs/manual/programs/fcgistarter.html.en | 96 + docs/manual/programs/fcgistarter.html.fr.utf8 | 96 + docs/manual/programs/fcgistarter.html.tr.utf8 | 95 + docs/manual/programs/htcacheclean.html | 17 + docs/manual/programs/htcacheclean.html.en | 248 + .../manual/programs/htcacheclean.html.fr.utf8 | 264 + .../programs/htcacheclean.html.ko.euc-kr | 143 + .../manual/programs/htcacheclean.html.tr.utf8 | 246 + docs/manual/programs/htdbm.html | 13 + docs/manual/programs/htdbm.html.en | 347 + docs/manual/programs/htdbm.html.fr.utf8 | 384 + docs/manual/programs/htdbm.html.tr.utf8 | 360 + docs/manual/programs/htdigest.html | 17 + docs/manual/programs/htdigest.html.en | 111 + docs/manual/programs/htdigest.html.fr.utf8 | 119 + docs/manual/programs/htdigest.html.ko.euc-kr | 105 + docs/manual/programs/htdigest.html.tr.utf8 | 114 + docs/manual/programs/htpasswd.html | 17 + docs/manual/programs/htpasswd.html.en | 338 + docs/manual/programs/htpasswd.html.fr.utf8 | 373 + docs/manual/programs/htpasswd.html.ko.euc-kr | 247 + docs/manual/programs/htpasswd.html.tr.utf8 | 316 + docs/manual/programs/httpd.html | 17 + docs/manual/programs/httpd.html.en | 225 + docs/manual/programs/httpd.html.fr.utf8 | 239 + docs/manual/programs/httpd.html.ko.euc-kr | 218 + docs/manual/programs/httpd.html.tr.utf8 | 216 + docs/manual/programs/httxt2dbm.html | 13 + docs/manual/programs/httxt2dbm.html.en | 114 + docs/manual/programs/httxt2dbm.html.fr.utf8 | 122 + docs/manual/programs/httxt2dbm.html.tr.utf8 | 116 + docs/manual/programs/index.html | 25 + docs/manual/programs/index.html.en | 130 + docs/manual/programs/index.html.es | 132 + docs/manual/programs/index.html.fr.utf8 | 132 + docs/manual/programs/index.html.ko.euc-kr | 111 + docs/manual/programs/index.html.tr.utf8 | 115 + docs/manual/programs/index.html.zh-cn.utf8 | 124 + docs/manual/programs/log_server_status.html | 9 + .../manual/programs/log_server_status.html.en | 86 + .../programs/log_server_status.html.fr.utf8 | 89 + docs/manual/programs/logresolve.html | 17 + docs/manual/programs/logresolve.html.en | 102 + docs/manual/programs/logresolve.html.fr.utf8 | 106 + .../manual/programs/logresolve.html.ko.euc-kr | 101 + docs/manual/programs/logresolve.html.tr.utf8 | 99 + docs/manual/programs/other.html | 17 + docs/manual/programs/other.html.en | 68 + docs/manual/programs/other.html.fr.utf8 | 70 + docs/manual/programs/other.html.ko.euc-kr | 89 + docs/manual/programs/other.html.tr.utf8 | 68 + docs/manual/programs/rotatelogs.html | 17 + docs/manual/programs/rotatelogs.html.en | 321 + docs/manual/programs/rotatelogs.html.fr.utf8 | 341 + .../manual/programs/rotatelogs.html.ko.euc-kr | 175 + docs/manual/programs/rotatelogs.html.tr.utf8 | 312 + docs/manual/programs/split-logfile.html | 9 + docs/manual/programs/split-logfile.html.en | 85 + .../programs/split-logfile.html.fr.utf8 | 92 + docs/manual/programs/suexec.html | 17 + docs/manual/programs/suexec.html.en | 91 + docs/manual/programs/suexec.html.fr.utf8 | 96 + docs/manual/programs/suexec.html.ko.euc-kr | 94 + docs/manual/programs/suexec.html.tr.utf8 | 91 + docs/manual/rewrite/access.html | 9 + docs/manual/rewrite/access.html.en | 323 + docs/manual/rewrite/access.html.fr.utf8 | 331 + docs/manual/rewrite/advanced.html | 9 + docs/manual/rewrite/advanced.html.en | 370 + docs/manual/rewrite/advanced.html.fr.utf8 | 390 + docs/manual/rewrite/avoid.html | 9 + docs/manual/rewrite/avoid.html.en | 254 + docs/manual/rewrite/avoid.html.fr.utf8 | 271 + docs/manual/rewrite/flags.html | 9 + docs/manual/rewrite/flags.html.en | 880 + docs/manual/rewrite/flags.html.fr.utf8 | 941 + docs/manual/rewrite/htaccess.html | 9 + docs/manual/rewrite/htaccess.html.en | 66 + docs/manual/rewrite/htaccess.html.fr.utf8 | 67 + docs/manual/rewrite/index.html | 17 + docs/manual/rewrite/index.html.en | 96 + docs/manual/rewrite/index.html.fr.utf8 | 110 + docs/manual/rewrite/index.html.tr.utf8 | 91 + docs/manual/rewrite/index.html.zh-cn.utf8 | 80 + docs/manual/rewrite/intro.html | 9 + docs/manual/rewrite/intro.html.en | 400 + docs/manual/rewrite/intro.html.fr.utf8 | 426 + docs/manual/rewrite/proxy.html | 9 + docs/manual/rewrite/proxy.html.en | 119 + docs/manual/rewrite/proxy.html.fr.utf8 | 124 + docs/manual/rewrite/remapping.html | 9 + docs/manual/rewrite/remapping.html.en | 697 + docs/manual/rewrite/remapping.html.fr.utf8 | 717 + docs/manual/rewrite/rewritemap.html | 9 + docs/manual/rewrite/rewritemap.html.en | 481 + docs/manual/rewrite/rewritemap.html.fr.utf8 | 511 + docs/manual/rewrite/tech.html | 9 + docs/manual/rewrite/tech.html.en | 205 + docs/manual/rewrite/tech.html.fr.utf8 | 223 + docs/manual/rewrite/vhosts.html | 9 + docs/manual/rewrite/vhosts.html.en | 228 + docs/manual/rewrite/vhosts.html.fr.utf8 | 239 + docs/manual/sections.html | 21 + docs/manual/sections.html.en | 607 + docs/manual/sections.html.fr.utf8 | 664 + docs/manual/sections.html.ja.utf8 | 523 + docs/manual/sections.html.ko.euc-kr | 452 + docs/manual/sections.html.tr.utf8 | 656 + docs/manual/server-wide.html | 21 + docs/manual/server-wide.html.en | 142 + docs/manual/server-wide.html.fr.utf8 | 144 + docs/manual/server-wide.html.ja.utf8 | 134 + docs/manual/server-wide.html.ko.euc-kr | 125 + docs/manual/server-wide.html.tr.utf8 | 140 + docs/manual/sitemap.html | 33 + docs/manual/sitemap.html.de | 376 + docs/manual/sitemap.html.en | 375 + docs/manual/sitemap.html.es | 352 + docs/manual/sitemap.html.fr.utf8 | 398 + docs/manual/sitemap.html.ja.utf8 | 352 + docs/manual/sitemap.html.ko.euc-kr | 350 + docs/manual/sitemap.html.tr.utf8 | 370 + docs/manual/sitemap.html.zh-cn.utf8 | 350 + docs/manual/socache.html | 9 + docs/manual/socache.html.en | 148 + docs/manual/socache.html.fr.utf8 | 152 + docs/manual/ssl/index.html | 21 + docs/manual/ssl/index.html.en | 71 + docs/manual/ssl/index.html.fr.utf8 | 73 + docs/manual/ssl/index.html.ja.utf8 | 72 + docs/manual/ssl/index.html.tr.utf8 | 71 + docs/manual/ssl/index.html.zh-cn.utf8 | 72 + docs/manual/ssl/ssl_compat.html | 9 + docs/manual/ssl/ssl_compat.html.en | 248 + docs/manual/ssl/ssl_compat.html.fr.utf8 | 257 + docs/manual/ssl/ssl_faq.html | 9 + docs/manual/ssl/ssl_faq.html.en | 935 + docs/manual/ssl/ssl_faq.html.fr.utf8 | 1036 + docs/manual/ssl/ssl_howto.html | 9 + docs/manual/ssl/ssl_howto.html.en | 449 + docs/manual/ssl/ssl_howto.html.fr.utf8 | 489 + docs/manual/ssl/ssl_intro.html | 13 + docs/manual/ssl/ssl_intro.html.en | 672 + docs/manual/ssl/ssl_intro.html.fr.utf8 | 727 + docs/manual/ssl/ssl_intro.html.ja.utf8 | 730 + docs/manual/stopping.html | 29 + docs/manual/stopping.html.de | 288 + docs/manual/stopping.html.en | 264 + docs/manual/stopping.html.es | 297 + docs/manual/stopping.html.fr.utf8 | 305 + docs/manual/stopping.html.ja.utf8 | 279 + docs/manual/stopping.html.ko.euc-kr | 235 + docs/manual/stopping.html.tr.utf8 | 273 + docs/manual/style/build.properties | 27 + docs/manual/style/common.dtd | 203 + docs/manual/style/css/manual-chm.css | 27 + docs/manual/style/css/manual-loose-100pc.css | 155 + docs/manual/style/css/manual-print.css | 717 + docs/manual/style/css/manual-zip-100pc.css | 23 + docs/manual/style/css/manual-zip.css | 24 + docs/manual/style/css/manual.css | 1048 + docs/manual/style/css/prettify.css | 121 + docs/manual/style/faq.dtd | 36 + docs/manual/style/lang.dtd | 24 + docs/manual/style/latex/atbeginend.sty | 80 + docs/manual/style/manualpage.dtd | 29 + docs/manual/style/modulesynopsis.dtd | 92 + docs/manual/style/scripts/MINIFY | 5 + docs/manual/style/scripts/prettify.js | 1622 + docs/manual/style/scripts/prettify.min.js | 123 + docs/manual/style/sitemap.dtd | 42 + docs/manual/style/version.ent | 24 + docs/manual/suexec.html | 21 + docs/manual/suexec.html.en | 641 + docs/manual/suexec.html.fr.utf8 | 689 + docs/manual/suexec.html.ja.utf8 | 643 + docs/manual/suexec.html.ko.euc-kr | 564 + docs/manual/suexec.html.tr.utf8 | 580 + docs/manual/upgrading.html | 9 + docs/manual/upgrading.html.en | 537 + docs/manual/upgrading.html.fr.utf8 | 598 + docs/manual/urlmapping.html | 21 + docs/manual/urlmapping.html.en | 379 + docs/manual/urlmapping.html.fr.utf8 | 402 + docs/manual/urlmapping.html.ja.utf8 | 318 + docs/manual/urlmapping.html.ko.euc-kr | 277 + docs/manual/urlmapping.html.tr.utf8 | 365 + docs/manual/vhosts/details.html | 17 + docs/manual/vhosts/details.html.en | 348 + docs/manual/vhosts/details.html.fr.utf8 | 369 + docs/manual/vhosts/details.html.ko.euc-kr | 412 + docs/manual/vhosts/details.html.tr.utf8 | 319 + docs/manual/vhosts/examples.html | 21 + docs/manual/vhosts/examples.html.en | 566 + docs/manual/vhosts/examples.html.fr.utf8 | 586 + docs/manual/vhosts/examples.html.ja.utf8 | 680 + docs/manual/vhosts/examples.html.ko.euc-kr | 657 + docs/manual/vhosts/examples.html.tr.utf8 | 562 + docs/manual/vhosts/fd-limits.html | 21 + docs/manual/vhosts/fd-limits.html.en | 155 + docs/manual/vhosts/fd-limits.html.fr.utf8 | 167 + docs/manual/vhosts/fd-limits.html.ja.utf8 | 157 + docs/manual/vhosts/fd-limits.html.ko.euc-kr | 152 + docs/manual/vhosts/fd-limits.html.tr.utf8 | 150 + docs/manual/vhosts/index.html | 29 + docs/manual/vhosts/index.html.de | 124 + docs/manual/vhosts/index.html.en | 126 + docs/manual/vhosts/index.html.fr.utf8 | 127 + docs/manual/vhosts/index.html.ja.utf8 | 120 + docs/manual/vhosts/index.html.ko.euc-kr | 119 + docs/manual/vhosts/index.html.tr.utf8 | 123 + docs/manual/vhosts/index.html.zh-cn.utf8 | 105 + docs/manual/vhosts/ip-based.html | 21 + docs/manual/vhosts/ip-based.html.en | 210 + docs/manual/vhosts/ip-based.html.fr.utf8 | 213 + docs/manual/vhosts/ip-based.html.ja.utf8 | 190 + docs/manual/vhosts/ip-based.html.ko.euc-kr | 180 + docs/manual/vhosts/ip-based.html.tr.utf8 | 211 + docs/manual/vhosts/mass.html | 17 + docs/manual/vhosts/mass.html.en | 348 + docs/manual/vhosts/mass.html.fr.utf8 | 363 + docs/manual/vhosts/mass.html.ko.euc-kr | 453 + docs/manual/vhosts/mass.html.tr.utf8 | 334 + docs/manual/vhosts/name-based.html | 25 + docs/manual/vhosts/name-based.html.de | 299 + docs/manual/vhosts/name-based.html.en | 224 + docs/manual/vhosts/name-based.html.fr.utf8 | 267 + docs/manual/vhosts/name-based.html.ja.utf8 | 303 + docs/manual/vhosts/name-based.html.ko.euc-kr | 266 + docs/manual/vhosts/name-based.html.tr.utf8 | 238 + docs/server-status/README.md | 40 + docs/server-status/feather.png | Bin 0 -> 2549 bytes docs/server-status/server-status.lua | 1901 + emacs-style | 12 + httpd.dep | 68 + httpd.dsp | 111 + httpd.mak | 344 + httpd.spec | 494 + include/.indent.pro | 54 + include/ap_compat.h | 30 + include/ap_config.h | 206 + include/ap_config_auto.h.in | 420 + include/ap_config_layout.h.in | 64 + include/ap_expr.h | 353 + include/ap_hooks.h | 162 + include/ap_listen.h | 163 + include/ap_mmn.h | 650 + include/ap_mpm.h | 283 + include/ap_provider.h | 100 + include/ap_regex.h | 296 + include/ap_regkey.h | 219 + include/ap_release.h | 83 + include/ap_slotmem.h | 199 + include/ap_socache.h | 231 + include/apache_noprobes.h | 344 + include/heartbeat.h | 60 + include/http_config.h | 1451 + include/http_connection.h | 183 + include/http_core.h | 1097 + include/http_log.h | 836 + include/http_main.h | 88 + include/http_protocol.h | 1130 + include/http_request.h | 642 + include/http_ssl.h | 317 + include/http_vhost.h | 132 + include/httpd.h | 2720 + include/mod_auth.h | 141 + include/mod_core.h | 103 + include/mod_request.h | 64 + include/mpm_common.h | 479 + include/scoreboard.h | 257 + include/util_cfgtree.h | 98 + include/util_charset.h | 72 + include/util_cookies.h | 146 + include/util_ebcdic.h | 92 + include/util_fcgi.h | 280 + include/util_filter.h | 639 + include/util_ldap.h | 397 + include/util_md5.h | 72 + include/util_mutex.h | 223 + include/util_script.h | 235 + include/util_time.h | 119 + include/util_varbuf.h | 197 + include/util_xml.h | 51 + libhttpd.dep | 2421 + libhttpd.dsp | 854 + libhttpd.mak | 1378 + modules/Makefile.in | 6 + modules/NWGNUmakefile | 121 + modules/README | 67 + modules/aaa/.indent.pro | 54 + modules/aaa/Makefile.in | 3 + modules/aaa/NWGNUaccesscompat | 248 + modules/aaa/NWGNUallowmethods | 248 + modules/aaa/NWGNUauthbasc | 248 + modules/aaa/NWGNUauthdigt | 248 + modules/aaa/NWGNUauthform | 250 + modules/aaa/NWGNUauthnano | 248 + modules/aaa/NWGNUauthndbd | 249 + modules/aaa/NWGNUauthndbm | 248 + modules/aaa/NWGNUauthnfil | 248 + modules/aaa/NWGNUauthnsocache | 248 + modules/aaa/NWGNUauthnzldap | 264 + modules/aaa/NWGNUauthzdbd | 249 + modules/aaa/NWGNUauthzdbm | 248 + modules/aaa/NWGNUauthzgrp | 247 + modules/aaa/NWGNUauthzusr | 247 + modules/aaa/NWGNUmakefile | 270 + modules/aaa/config.m4 | 84 + modules/aaa/mod_access_compat.c | 377 + modules/aaa/mod_access_compat.dep | 59 + modules/aaa/mod_access_compat.dsp | 111 + modules/aaa/mod_access_compat.mak | 353 + modules/aaa/mod_allowmethods.c | 158 + modules/aaa/mod_allowmethods.dep | 56 + modules/aaa/mod_allowmethods.dsp | 111 + modules/aaa/mod_allowmethods.mak | 353 + modules/aaa/mod_auth_basic.c | 508 + modules/aaa/mod_auth_basic.dep | 63 + modules/aaa/mod_auth_basic.dsp | 111 + modules/aaa/mod_auth_basic.mak | 353 + modules/aaa/mod_auth_digest.c | 1983 + modules/aaa/mod_auth_digest.dep | 68 + modules/aaa/mod_auth_digest.dsp | 111 + modules/aaa/mod_auth_digest.mak | 353 + modules/aaa/mod_auth_form.c | 1332 + modules/aaa/mod_auth_form.dep | 66 + modules/aaa/mod_auth_form.dsp | 111 + modules/aaa/mod_auth_form.mak | 353 + modules/aaa/mod_authn_anon.c | 215 + modules/aaa/mod_authn_anon.dep | 58 + modules/aaa/mod_authn_anon.dsp | 111 + modules/aaa/mod_authn_anon.mak | 381 + modules/aaa/mod_authn_core.c | 427 + modules/aaa/mod_authn_core.dep | 58 + modules/aaa/mod_authn_core.dsp | 111 + modules/aaa/mod_authn_core.mak | 381 + modules/aaa/mod_authn_dbd.c | 307 + modules/aaa/mod_authn_dbd.dep | 56 + modules/aaa/mod_authn_dbd.dsp | 115 + modules/aaa/mod_authn_dbd.mak | 409 + modules/aaa/mod_authn_dbm.c | 231 + modules/aaa/mod_authn_dbm.dep | 61 + modules/aaa/mod_authn_dbm.dsp | 111 + modules/aaa/mod_authn_dbm.mak | 381 + modules/aaa/mod_authn_file.c | 194 + modules/aaa/mod_authn_file.dep | 60 + modules/aaa/mod_authn_file.dsp | 111 + modules/aaa/mod_authn_file.mak | 381 + modules/aaa/mod_authn_socache.c | 475 + modules/aaa/mod_authn_socache.dep | 62 + modules/aaa/mod_authn_socache.dsp | 111 + modules/aaa/mod_authn_socache.mak | 353 + modules/aaa/mod_authnz_fcgi.c | 1372 + modules/aaa/mod_authnz_fcgi.dep | 61 + modules/aaa/mod_authnz_fcgi.dsp | 119 + modules/aaa/mod_authnz_fcgi.mak | 353 + modules/aaa/mod_authnz_ldap.c | 2099 + modules/aaa/mod_authnz_ldap.dep | 70 + modules/aaa/mod_authnz_ldap.dsp | 111 + modules/aaa/mod_authnz_ldap.mak | 381 + modules/aaa/mod_authz_core.c | 1173 + modules/aaa/mod_authz_core.dep | 60 + modules/aaa/mod_authz_core.dsp | 111 + modules/aaa/mod_authz_core.mak | 381 + modules/aaa/mod_authz_dbd.c | 409 + modules/aaa/mod_authz_dbd.dep | 61 + modules/aaa/mod_authz_dbd.dsp | 119 + modules/aaa/mod_authz_dbd.h | 44 + modules/aaa/mod_authz_dbd.mak | 409 + modules/aaa/mod_authz_dbm.c | 356 + modules/aaa/mod_authz_dbm.dep | 62 + modules/aaa/mod_authz_dbm.dsp | 111 + modules/aaa/mod_authz_dbm.mak | 381 + modules/aaa/mod_authz_groupfile.c | 333 + modules/aaa/mod_authz_groupfile.dep | 61 + modules/aaa/mod_authz_groupfile.dsp | 111 + modules/aaa/mod_authz_groupfile.mak | 381 + modules/aaa/mod_authz_host.c | 410 + modules/aaa/mod_authz_host.dep | 60 + modules/aaa/mod_authz_host.dsp | 111 + modules/aaa/mod_authz_host.mak | 381 + modules/aaa/mod_authz_owner.c | 189 + modules/aaa/mod_authz_owner.dep | 59 + modules/aaa/mod_authz_owner.dsp | 111 + modules/aaa/mod_authz_owner.h | 27 + modules/aaa/mod_authz_owner.mak | 381 + modules/aaa/mod_authz_user.c | 146 + modules/aaa/mod_authz_user.dep | 58 + modules/aaa/mod_authz_user.dsp | 111 + modules/aaa/mod_authz_user.mak | 381 + modules/arch/netware/libprews.c | 79 + modules/arch/netware/mod_netware.c | 206 + modules/arch/netware/mod_nw_ssl.c | 1285 + modules/arch/unix/Makefile.in | 3 + modules/arch/unix/config5.m4 | 33 + modules/arch/unix/mod_privileges.c | 588 + modules/arch/unix/mod_systemd.c | 119 + modules/arch/unix/mod_unixd.c | 433 + modules/arch/unix/mod_unixd.h | 41 + modules/arch/win32/Makefile.in | 3 + modules/arch/win32/config.m4 | 9 + modules/arch/win32/mod_isapi.c | 1728 + modules/arch/win32/mod_isapi.dep | 61 + modules/arch/win32/mod_isapi.dsp | 115 + modules/arch/win32/mod_isapi.h | 271 + modules/arch/win32/mod_isapi.mak | 353 + modules/arch/win32/mod_win32.c | 563 + modules/cache/.indent.pro | 54 + modules/cache/Makefile.in | 3 + modules/cache/NWGNUcach_dsk | 262 + modules/cache/NWGNUcach_socache | 263 + modules/cache/NWGNUmakefile | 250 + modules/cache/NWGNUmod_cach | 265 + modules/cache/NWGNUsocachdbm | 261 + modules/cache/NWGNUsocachmem | 261 + modules/cache/NWGNUsocachshmcb | 261 + modules/cache/cache_common.h | 56 + modules/cache/cache_disk_common.h | 68 + modules/cache/cache_socache_common.h | 57 + modules/cache/cache_storage.c | 790 + modules/cache/cache_storage.h | 76 + modules/cache/cache_util.c | 1344 + modules/cache/cache_util.h | 341 + modules/cache/config.m4 | 143 + modules/cache/mod_cache.c | 2717 + modules/cache/mod_cache.dep | 194 + modules/cache/mod_cache.dsp | 131 + modules/cache/mod_cache.h | 192 + modules/cache/mod_cache.mak | 370 + modules/cache/mod_cache_disk.c | 1585 + modules/cache/mod_cache_disk.dep | 59 + modules/cache/mod_cache_disk.dsp | 115 + modules/cache/mod_cache_disk.h | 91 + modules/cache/mod_cache_disk.mak | 381 + modules/cache/mod_cache_socache.c | 1545 + modules/cache/mod_cache_socache.dep | 67 + modules/cache/mod_cache_socache.dsp | 115 + modules/cache/mod_cache_socache.mak | 381 + modules/cache/mod_file_cache.c | 414 + modules/cache/mod_file_cache.dep | 56 + modules/cache/mod_file_cache.dsp | 111 + modules/cache/mod_file_cache.exp | 1 + modules/cache/mod_file_cache.mak | 353 + modules/cache/mod_socache_dbm.c | 764 + modules/cache/mod_socache_dbm.dep | 60 + modules/cache/mod_socache_dbm.dsp | 111 + modules/cache/mod_socache_dbm.mak | 353 + modules/cache/mod_socache_dc.c | 198 + modules/cache/mod_socache_dc.dep | 55 + modules/cache/mod_socache_dc.dsp | 111 + modules/cache/mod_socache_dc.mak | 353 + modules/cache/mod_socache_memcache.c | 418 + modules/cache/mod_socache_memcache.dep | 59 + modules/cache/mod_socache_memcache.dsp | 111 + modules/cache/mod_socache_memcache.mak | 353 + modules/cache/mod_socache_redis.c | 486 + modules/cache/mod_socache_redis.dep | 5 + modules/cache/mod_socache_redis.dsp | 111 + modules/cache/mod_socache_redis.mak | 353 + modules/cache/mod_socache_shmcb.c | 1085 + modules/cache/mod_socache_shmcb.dep | 56 + modules/cache/mod_socache_shmcb.dsp | 111 + modules/cache/mod_socache_shmcb.mak | 353 + modules/cluster/Makefile.in | 3 + modules/cluster/NWGNUmakefile | 246 + modules/cluster/NWGNUmodheartbeat | 257 + modules/cluster/NWGNUmodheartmonitor | 257 + modules/cluster/README.heartbeat | 33 + modules/cluster/README.heartmonitor | 30 + modules/cluster/config5.m4 | 17 + modules/cluster/mod_heartbeat.c | 228 + modules/cluster/mod_heartbeat.dep | 55 + modules/cluster/mod_heartbeat.dsp | 123 + modules/cluster/mod_heartbeat.mak | 380 + modules/cluster/mod_heartmonitor.c | 920 + modules/cluster/mod_heartmonitor.dep | 63 + modules/cluster/mod_heartmonitor.dsp | 123 + modules/cluster/mod_heartmonitor.mak | 380 + modules/config7.m4 | 56 + modules/core/Makefile.in | 3 + modules/core/NWGNUmakefile | 257 + modules/core/config.m4 | 60 + modules/core/mod_macro.c | 950 + modules/core/mod_macro.dep | 45 + modules/core/mod_macro.dsp | 111 + modules/core/mod_macro.mak | 353 + modules/core/mod_so.c | 442 + modules/core/mod_so.h | 38 + modules/core/mod_watchdog.c | 718 + modules/core/mod_watchdog.dep | 59 + modules/core/mod_watchdog.dsp | 115 + modules/core/mod_watchdog.h | 213 + modules/core/mod_watchdog.mak | 353 + modules/core/test/Makefile | 67 + modules/core/test/conf/inc63_1.conf | 5 + modules/core/test/conf/inc63_2.conf | 3 + modules/core/test/conf/test01.conf | 3 + modules/core/test/conf/test02.conf | 3 + modules/core/test/conf/test03.conf | 5 + modules/core/test/conf/test04.conf | 5 + modules/core/test/conf/test05.conf | 5 + modules/core/test/conf/test06.conf | 6 + modules/core/test/conf/test07.conf | 3 + modules/core/test/conf/test08.conf | 3 + modules/core/test/conf/test09.conf | 6 + modules/core/test/conf/test10.conf | 10 + modules/core/test/conf/test11.conf | 15 + modules/core/test/conf/test12.conf | 12 + modules/core/test/conf/test13.conf | 18 + modules/core/test/conf/test14.conf | 23 + modules/core/test/conf/test15.conf | 9 + modules/core/test/conf/test16.conf | 11 + modules/core/test/conf/test17.conf | 10 + modules/core/test/conf/test18.conf | 10 + modules/core/test/conf/test19.conf | 26 + modules/core/test/conf/test20.conf | 11 + modules/core/test/conf/test21.conf | 11 + modules/core/test/conf/test22.conf | 11 + modules/core/test/conf/test23.conf | 15 + modules/core/test/conf/test24.conf | 23 + modules/core/test/conf/test25.conf | 27 + modules/core/test/conf/test26.conf | 19 + modules/core/test/conf/test27.conf | 22 + modules/core/test/conf/test28.conf | 13 + modules/core/test/conf/test29.conf | 10 + modules/core/test/conf/test30.conf | 12 + modules/core/test/conf/test31.conf | 16 + modules/core/test/conf/test32.conf | 7 + modules/core/test/conf/test33.conf | 3 + modules/core/test/conf/test34.conf | 14 + modules/core/test/conf/test35.conf | 10 + modules/core/test/conf/test36.conf | 12 + modules/core/test/conf/test37.conf | 7 + modules/core/test/conf/test38.conf | 10 + modules/core/test/conf/test39.conf | 23 + modules/core/test/conf/test40.conf | 33 + modules/core/test/conf/test41.conf | 20 + modules/core/test/conf/test42.conf | 13 + modules/core/test/conf/test43.conf | 29 + modules/core/test/conf/test44.conf | 19 + modules/core/test/conf/test45.conf | 7 + modules/core/test/conf/test46.conf | 11 + modules/core/test/conf/test47.conf | 15 + modules/core/test/conf/test48.conf | 23 + modules/core/test/conf/test49.conf | 2 + modules/core/test/conf/test50.conf | 5 + modules/core/test/conf/test51.conf | 9 + modules/core/test/conf/test52.conf | 8 + modules/core/test/conf/test53.conf | 2 + modules/core/test/conf/test54.conf | 6 + modules/core/test/conf/test55.conf | 11 + modules/core/test/conf/test56.conf | 18 + modules/core/test/conf/test57.conf | 4 + modules/core/test/conf/test58.conf | 4 + modules/core/test/conf/test59.conf | 4 + modules/core/test/conf/test60.conf | 17 + modules/core/test/conf/test61.conf | 18 + modules/core/test/conf/test62.conf | 25 + modules/core/test/conf/test63.conf | 9 + modules/core/test/conf/test64.conf | 5 + modules/core/test/conf/test65.conf | 11 + modules/core/test/conf/test66.conf | 7 + modules/core/test/conf/test67.conf | 1 + modules/core/test/conf/test68.conf | 5 + modules/core/test/conf/test69.conf | 14 + modules/core/test/ref/test01.out | 3 + modules/core/test/ref/test02.out | 3 + modules/core/test/ref/test03.out | 3 + modules/core/test/ref/test04.out | 3 + modules/core/test/ref/test05.out | 3 + modules/core/test/ref/test06.out | 3 + modules/core/test/ref/test07.out | 3 + modules/core/test/ref/test08.out | 3 + modules/core/test/ref/test09.out | 3 + modules/core/test/ref/test10.out | 3 + modules/core/test/ref/test11.out | 6 + modules/core/test/ref/test12.out | 7 + modules/core/test/ref/test13.out | 8 + modules/core/test/ref/test14.out | 14 + modules/core/test/ref/test15.out | 6 + modules/core/test/ref/test16.out | 5 + modules/core/test/ref/test17.out | 7 + modules/core/test/ref/test18.out | 7 + modules/core/test/ref/test19.out | 9 + modules/core/test/ref/test20.out | 4 + modules/core/test/ref/test21.out | 5 + modules/core/test/ref/test22.out | 6 + modules/core/test/ref/test23.out | 7 + modules/core/test/ref/test24.out | 8 + modules/core/test/ref/test25.out | 9 + modules/core/test/ref/test26.out | 11 + modules/core/test/ref/test27.out | 8 + modules/core/test/ref/test28.out | 6 + modules/core/test/ref/test29.out | 4 + modules/core/test/ref/test30.out | 7 + modules/core/test/ref/test31.out | 23 + modules/core/test/ref/test32.out | 3 + modules/core/test/ref/test33.out | 3 + modules/core/test/ref/test34.out | 13 + modules/core/test/ref/test35.out | 13 + modules/core/test/ref/test36.out | 20 + modules/core/test/ref/test37.out | 3 + modules/core/test/ref/test38.out | 6 + modules/core/test/ref/test39.out | 7 + modules/core/test/ref/test40.out | 18 + modules/core/test/ref/test41.out | 9 + modules/core/test/ref/test42.out | 15 + modules/core/test/ref/test43.out | 8 + modules/core/test/ref/test44.out | 5 + modules/core/test/ref/test45.out | 19 + modules/core/test/ref/test46.out | 9 + modules/core/test/ref/test47.out | 8 + modules/core/test/ref/test48.out | 20 + modules/core/test/ref/test49.out | 3 + modules/core/test/ref/test50.out | 3 + modules/core/test/ref/test51.out | 3 + modules/core/test/ref/test52.out | 6 + modules/core/test/ref/test53.out | 3 + modules/core/test/ref/test54.out | 6 + modules/core/test/ref/test55.out | 8 + modules/core/test/ref/test56.out | 12 + modules/core/test/ref/test57.out | 3 + modules/core/test/ref/test58.out | 3 + modules/core/test/ref/test59.out | 3 + modules/core/test/ref/test60.out | 15 + modules/core/test/ref/test61.out | 9 + modules/core/test/ref/test62.out | 15 + modules/core/test/ref/test63.out | 10 + modules/core/test/ref/test64.out | 7 + modules/core/test/ref/test65.out | 7 + modules/core/test/ref/test66.out | 7 + modules/core/test/ref/test67.out | 5 + modules/core/test/ref/test68.out | 6 + modules/core/test/ref/test69.out | 10 + modules/database/Makefile.in | 3 + modules/database/NWGNUmakefile | 262 + modules/database/config.m4 | 8 + modules/database/mod_dbd.c | 995 + modules/database/mod_dbd.dep | 58 + modules/database/mod_dbd.dsp | 115 + modules/database/mod_dbd.h | 123 + modules/database/mod_dbd.mak | 353 + modules/dav/fs/Makefile.in | 3 + modules/dav/fs/NWGNUmakefile | 269 + modules/dav/fs/config6.m4 | 23 + modules/dav/fs/dbm.c | 800 + modules/dav/fs/lock.c | 1445 + modules/dav/fs/mod_dav_fs.c | 108 + modules/dav/fs/mod_dav_fs.dep | 203 + modules/dav/fs/mod_dav_fs.dsp | 135 + modules/dav/fs/mod_dav_fs.mak | 407 + modules/dav/fs/repos.c | 2283 + modules/dav/fs/repos.h | 84 + modules/dav/lock/Makefile.in | 3 + modules/dav/lock/NWGNUmakefile | 259 + modules/dav/lock/config6.m4 | 17 + modules/dav/lock/locks.c | 1237 + modules/dav/lock/locks.h | 33 + modules/dav/lock/mod_dav_lock.c | 104 + modules/dav/lock/mod_dav_lock.dep | 100 + modules/dav/lock/mod_dav_lock.dsp | 127 + modules/dav/lock/mod_dav_lock.mak | 389 + modules/dav/main/Makefile.in | 3 + modules/dav/main/NWGNUmakefile | 268 + modules/dav/main/config5.m4 | 21 + modules/dav/main/liveprop.c | 140 + modules/dav/main/mod_dav.c | 5271 ++ modules/dav/main/mod_dav.dep | 354 + modules/dav/main/mod_dav.dsp | 147 + modules/dav/main/mod_dav.h | 2671 + modules/dav/main/mod_dav.mak | 406 + modules/dav/main/props.c | 1179 + modules/dav/main/providers.c | 58 + modules/dav/main/std_liveprop.c | 226 + modules/dav/main/util.c | 2213 + modules/dav/main/util_lock.c | 798 + modules/debugging/Makefile.in | 3 + modules/debugging/NWGNUmakefile | 246 + modules/debugging/NWGNUmodbucketeer | 248 + modules/debugging/NWGNUmoddumpio | 248 + modules/debugging/README | 1 + modules/debugging/config.m4 | 7 + modules/debugging/mod_bucketeer.c | 187 + modules/debugging/mod_bucketeer.dep | 53 + modules/debugging/mod_bucketeer.dsp | 111 + modules/debugging/mod_bucketeer.mak | 353 + modules/debugging/mod_dumpio.c | 255 + modules/debugging/mod_dumpio.dep | 50 + modules/debugging/mod_dumpio.dsp | 111 + modules/debugging/mod_dumpio.mak | 353 + modules/echo/.indent.pro | 54 + modules/echo/Makefile.in | 3 + modules/echo/NWGNUmakefile | 257 + modules/echo/config.m4 | 9 + modules/echo/mod_echo.c | 218 + modules/echo/mod_echo.dep | 56 + modules/echo/mod_echo.dsp | 111 + modules/echo/mod_echo.mak | 353 + modules/examples/Makefile.in | 3 + modules/examples/NWGNUcase_flt | 256 + modules/examples/NWGNUcase_flt_in | 256 + modules/examples/NWGNUexample_hooks | 257 + modules/examples/NWGNUexample_ipc | 257 + modules/examples/NWGNUmakefile | 257 + modules/examples/README | 54 + modules/examples/config.m4 | 9 + modules/examples/mod_case_filter.c | 139 + modules/examples/mod_case_filter.dep | 46 + modules/examples/mod_case_filter.dsp | 111 + modules/examples/mod_case_filter.mak | 353 + modules/examples/mod_case_filter_in.c | 160 + modules/examples/mod_case_filter_in.dep | 46 + modules/examples/mod_case_filter_in.dsp | 111 + modules/examples/mod_case_filter_in.mak | 353 + modules/examples/mod_example_hooks.c | 1552 + modules/examples/mod_example_hooks.dep | 62 + modules/examples/mod_example_hooks.dsp | 111 + modules/examples/mod_example_hooks.mak | 353 + modules/examples/mod_example_ipc.c | 356 + modules/examples/mod_example_ipc.dep | 56 + modules/examples/mod_example_ipc.dsp | 111 + modules/examples/mod_example_ipc.mak | 353 + modules/experimental/.indent.pro | 54 + modules/experimental/Makefile.in | 3 + modules/experimental/NWGNUmakefile | 253 + modules/experimental/config.m4 | 4 + modules/filters/.indent.pro | 54 + modules/filters/Makefile.in | 3 + modules/filters/NWGNUcharsetl | 257 + modules/filters/NWGNUdeflate | 279 + modules/filters/NWGNUextfiltr | 248 + modules/filters/NWGNUmakefile | 273 + modules/filters/NWGNUmod_data | 248 + modules/filters/NWGNUmod_filter | 248 + modules/filters/NWGNUmod_request | 248 + modules/filters/NWGNUmodbuffer | 256 + modules/filters/NWGNUmodsed | 259 + modules/filters/NWGNUproxyhtml | 261 + modules/filters/NWGNUratelimit | 256 + modules/filters/NWGNUreflector | 256 + modules/filters/NWGNUreqtimeout | 256 + modules/filters/NWGNUsubstitute | 256 + modules/filters/NWGNUxml2enc | 258 + modules/filters/config.m4 | 197 + modules/filters/libsed.h | 172 + modules/filters/mod_brotli.c | 608 + modules/filters/mod_brotli.dep | 45 + modules/filters/mod_brotli.dsp | 111 + modules/filters/mod_brotli.mak | 353 + modules/filters/mod_buffer.c | 353 + modules/filters/mod_buffer.dep | 48 + modules/filters/mod_buffer.dsp | 111 + modules/filters/mod_buffer.mak | 353 + modules/filters/mod_charset_lite.c | 1142 + modules/filters/mod_charset_lite.dep | 60 + modules/filters/mod_charset_lite.dsp | 111 + modules/filters/mod_charset_lite.exp | 1 + modules/filters/mod_charset_lite.mak | 353 + modules/filters/mod_data.c | 255 + modules/filters/mod_data.dep | 55 + modules/filters/mod_data.dsp | 111 + modules/filters/mod_data.mak | 353 + modules/filters/mod_deflate.c | 1953 + modules/filters/mod_deflate.dep | 52 + modules/filters/mod_deflate.dsp | 111 + modules/filters/mod_deflate.exp | 1 + modules/filters/mod_deflate.mak | 353 + modules/filters/mod_ext_filter.c | 954 + modules/filters/mod_ext_filter.dep | 58 + modules/filters/mod_ext_filter.dsp | 111 + modules/filters/mod_ext_filter.exp | 1 + modules/filters/mod_ext_filter.mak | 353 + modules/filters/mod_filter.c | 767 + modules/filters/mod_filter.dep | 50 + modules/filters/mod_filter.dsp | 111 + modules/filters/mod_filter.mak | 353 + modules/filters/mod_include.c | 4238 ++ modules/filters/mod_include.dep | 63 + modules/filters/mod_include.dsp | 115 + modules/filters/mod_include.exp | 1 + modules/filters/mod_include.h | 120 + modules/filters/mod_include.mak | 353 + modules/filters/mod_proxy_html.c | 1353 + modules/filters/mod_proxy_html.dep | 58 + modules/filters/mod_proxy_html.dsp | 123 + modules/filters/mod_proxy_html.mak | 352 + modules/filters/mod_ratelimit.c | 340 + modules/filters/mod_ratelimit.dep | 45 + modules/filters/mod_ratelimit.dsp | 115 + modules/filters/mod_ratelimit.h | 51 + modules/filters/mod_ratelimit.mak | 353 + modules/filters/mod_reflector.c | 231 + modules/filters/mod_reflector.dep | 57 + modules/filters/mod_reflector.dsp | 111 + modules/filters/mod_reflector.mak | 353 + modules/filters/mod_reqtimeout.c | 670 + modules/filters/mod_reqtimeout.dep | 58 + modules/filters/mod_reqtimeout.dsp | 111 + modules/filters/mod_reqtimeout.mak | 353 + modules/filters/mod_request.c | 393 + modules/filters/mod_request.dep | 55 + modules/filters/mod_request.dsp | 115 + modules/filters/mod_request.mak | 353 + modules/filters/mod_sed.c | 537 + modules/filters/mod_sed.dep | 109 + modules/filters/mod_sed.dsp | 135 + modules/filters/mod_sed.mak | 380 + modules/filters/mod_substitute.c | 766 + modules/filters/mod_substitute.dep | 53 + modules/filters/mod_substitute.dsp | 111 + modules/filters/mod_substitute.mak | 353 + modules/filters/mod_xml2enc.c | 680 + modules/filters/mod_xml2enc.dep | 54 + modules/filters/mod_xml2enc.dsp | 123 + modules/filters/mod_xml2enc.h | 55 + modules/filters/mod_xml2enc.mak | 352 + modules/filters/regexp.c | 599 + modules/filters/regexp.h | 112 + modules/filters/sed.h | 61 + modules/filters/sed0.c | 1026 + modules/filters/sed1.c | 1110 + modules/generators/.indent.pro | 54 + modules/generators/Makefile.in | 3 + modules/generators/NWGNUautoindex | 249 + modules/generators/NWGNUinfo | 248 + modules/generators/NWGNUmakefile | 249 + modules/generators/NWGNUmod_asis | 249 + modules/generators/NWGNUmod_cgi | 249 + modules/generators/NWGNUstatus | 248 + modules/generators/cgi_common.h | 639 + modules/generators/config5.m4 | 92 + modules/generators/mod_asis.c | 128 + modules/generators/mod_asis.dep | 56 + modules/generators/mod_asis.dsp | 111 + modules/generators/mod_asis.exp | 1 + modules/generators/mod_asis.mak | 353 + modules/generators/mod_autoindex.c | 2350 + modules/generators/mod_autoindex.dep | 61 + modules/generators/mod_autoindex.dsp | 111 + modules/generators/mod_autoindex.exp | 1 + modules/generators/mod_autoindex.mak | 353 + modules/generators/mod_cgi.c | 780 + modules/generators/mod_cgi.dep | 64 + modules/generators/mod_cgi.dsp | 115 + modules/generators/mod_cgi.exp | 1 + modules/generators/mod_cgi.h | 67 + modules/generators/mod_cgi.mak | 353 + modules/generators/mod_cgid.c | 1809 + modules/generators/mod_cgid.exp | 1 + modules/generators/mod_info.c | 1018 + modules/generators/mod_info.dep | 66 + modules/generators/mod_info.dsp | 111 + modules/generators/mod_info.exp | 1 + modules/generators/mod_info.mak | 353 + modules/generators/mod_status.c | 1055 + modules/generators/mod_status.dep | 60 + modules/generators/mod_status.dsp | 111 + modules/generators/mod_status.exp | 1 + modules/generators/mod_status.h | 64 + modules/generators/mod_status.mak | 353 + modules/generators/mod_suexec.c | 139 + modules/generators/mod_suexec.h | 33 + modules/http/.indent.pro | 54 + modules/http/Makefile.in | 3 + modules/http/byterange_filter.c | 579 + modules/http/chunk_filter.c | 197 + modules/http/config.m4 | 20 + modules/http/http_core.c | 326 + modules/http/http_etag.c | 413 + modules/http/http_filters.c | 1957 + modules/http/http_protocol.c | 1677 + modules/http/http_request.c | 861 + modules/http/mod_mime.c | 1037 + modules/http/mod_mime.dep | 55 + modules/http/mod_mime.dsp | 111 + modules/http/mod_mime.exp | 1 + modules/http/mod_mime.mak | 353 + modules/http2/Makefile.in | 20 + modules/http2/NWGNUmakefile | 246 + modules/http2/NWGNUmod_http2 | 395 + modules/http2/NWGNUproxyht2 | 288 + modules/http2/README.h2 | 70 + modules/http2/config2.m4 | 239 + modules/http2/h2.h | 211 + modules/http2/h2_bucket_beam.c | 883 + modules/http2/h2_bucket_beam.h | 267 + modules/http2/h2_bucket_eos.c | 112 + modules/http2/h2_bucket_eos.h | 32 + modules/http2/h2_c1.c | 350 + modules/http2/h2_c1.h | 83 + modules/http2/h2_c1_io.c | 559 + modules/http2/h2_c1_io.h | 101 + modules/http2/h2_c2.c | 949 + modules/http2/h2_c2.h | 57 + modules/http2/h2_c2_filter.c | 1056 + modules/http2/h2_c2_filter.h | 68 + modules/http2/h2_config.c | 1083 + modules/http2/h2_config.h | 102 + modules/http2/h2_conn_ctx.c | 123 + modules/http2/h2_conn_ctx.h | 100 + modules/http2/h2_headers.c | 219 + modules/http2/h2_headers.h | 107 + modules/http2/h2_mplx.c | 1288 + modules/http2/h2_mplx.h | 235 + modules/http2/h2_private.h | 28 + modules/http2/h2_protocol.c | 485 + modules/http2/h2_protocol.h | 56 + modules/http2/h2_proxy_session.c | 1745 + modules/http2/h2_proxy_session.h | 136 + modules/http2/h2_proxy_util.c | 1355 + modules/http2/h2_proxy_util.h | 257 + modules/http2/h2_push.c | 877 + modules/http2/h2_push.h | 158 + modules/http2/h2_request.c | 593 + modules/http2/h2_request.h | 59 + modules/http2/h2_session.c | 2064 + modules/http2/h2_session.h | 209 + modules/http2/h2_stream.c | 1833 + modules/http2/h2_stream.h | 344 + modules/http2/h2_switch.c | 233 + modules/http2/h2_switch.h | 30 + modules/http2/h2_util.c | 1938 + modules/http2/h2_util.h | 519 + modules/http2/h2_version.h | 41 + modules/http2/h2_workers.c | 626 + modules/http2/h2_workers.h | 129 + modules/http2/h2_ws.c | 362 + modules/http2/h2_ws.h | 35 + modules/http2/mod_http2.c | 351 + modules/http2/mod_http2.dep | 1431 + modules/http2/mod_http2.dsp | 191 + modules/http2/mod_http2.h | 102 + modules/http2/mod_http2.mak | 533 + modules/http2/mod_proxy_http2.c | 483 + modules/http2/mod_proxy_http2.dep | 208 + modules/http2/mod_proxy_http2.dsp | 119 + modules/http2/mod_proxy_http2.h | 21 + modules/http2/mod_proxy_http2.mak | 427 + modules/ldap/Makefile.in | 3 + modules/ldap/NWGNUmakefile | 264 + modules/ldap/README.ldap | 47 + modules/ldap/config.m4 | 25 + modules/ldap/mod_ldap.dep | 192 + modules/ldap/mod_ldap.dsp | 127 + modules/ldap/mod_ldap.mak | 371 + modules/ldap/util_ldap.c | 3275 ++ modules/ldap/util_ldap_cache.c | 467 + modules/ldap/util_ldap_cache.h | 206 + modules/ldap/util_ldap_cache_mgr.c | 905 + modules/loggers/.indent.pro | 54 + modules/loggers/Makefile.in | 3 + modules/loggers/NWGNUforensic | 258 + modules/loggers/NWGNUlogdebug | 258 + modules/loggers/NWGNUmakefile | 247 + modules/loggers/NWGNUmodlogio | 258 + modules/loggers/config.m4 | 20 + modules/loggers/mod_log_config.c | 1857 + modules/loggers/mod_log_config.dep | 62 + modules/loggers/mod_log_config.dsp | 111 + modules/loggers/mod_log_config.exp | 1 + modules/loggers/mod_log_config.h | 74 + modules/loggers/mod_log_config.mak | 353 + modules/loggers/mod_log_debug.c | 295 + modules/loggers/mod_log_debug.dep | 54 + modules/loggers/mod_log_debug.dsp | 111 + modules/loggers/mod_log_debug.mak | 325 + modules/loggers/mod_log_forensic.c | 289 + modules/loggers/mod_log_forensic.dep | 53 + modules/loggers/mod_log_forensic.dsp | 111 + modules/loggers/mod_log_forensic.exp | 1 + modules/loggers/mod_log_forensic.mak | 353 + modules/loggers/mod_logio.c | 284 + modules/loggers/mod_logio.dep | 59 + modules/loggers/mod_logio.dsp | 111 + modules/loggers/mod_logio.mak | 353 + modules/lua/Makefile.in | 3 + modules/lua/NWGNUmakefile | 287 + modules/lua/README | 54 + modules/lua/config.m4 | 130 + modules/lua/docs/README | 12 + modules/lua/docs/basic-configuration.txt | 141 + modules/lua/docs/building-from-subversion.txt | 72 + modules/lua/docs/running-developer-tests.txt | 16 + modules/lua/docs/writing-handlers.txt | 49 + modules/lua/lua_apr.c | 110 + modules/lua/lua_apr.h | 36 + modules/lua/lua_config.c | 277 + modules/lua/lua_config.h | 31 + modules/lua/lua_dbd.c | 843 + modules/lua/lua_dbd.h | 66 + modules/lua/lua_passwd.c | 178 + modules/lua/lua_passwd.h | 90 + modules/lua/lua_request.c | 3053 ++ modules/lua/lua_request.h | 58 + modules/lua/lua_vmprep.c | 552 + modules/lua/lua_vmprep.h | 147 + modules/lua/mod_lua.c | 2197 + modules/lua/mod_lua.dep | 418 + modules/lua/mod_lua.dsp | 163 + modules/lua/mod_lua.h | 187 + modules/lua/mod_lua.mak | 407 + modules/lua/test/helpers.lua | 36 + modules/lua/test/htdocs/config_tests.lua | 37 + modules/lua/test/htdocs/filters.lua | 7 + modules/lua/test/htdocs/find_me.txt | 1 + modules/lua/test/htdocs/headers.lua | 6 + modules/lua/test/htdocs/hooks.lua | 29 + modules/lua/test/htdocs/other.lua | 21 + modules/lua/test/htdocs/simple.lua | 4 + modules/lua/test/htdocs/test.lua | 129 + modules/lua/test/lib/kangaroo.lua | 19 + modules/lua/test/moonunit.lua | 52 + modules/lua/test/test.lua | 126 + modules/lua/test/test_httpd.conf | 31 + modules/mappers/.indent.pro | 54 + modules/mappers/Makefile.in | 3 + modules/mappers/NWGNUactions | 248 + modules/mappers/NWGNUimagemap | 249 + modules/mappers/NWGNUmakefile | 250 + modules/mappers/NWGNUrewrite | 250 + modules/mappers/NWGNUspeling | 248 + modules/mappers/NWGNUuserdir | 249 + modules/mappers/NWGNUvhost | 249 + modules/mappers/config9.m4 | 24 + modules/mappers/mod_actions.c | 232 + modules/mappers/mod_actions.dep | 58 + modules/mappers/mod_actions.dsp | 111 + modules/mappers/mod_actions.exp | 1 + modules/mappers/mod_actions.mak | 353 + modules/mappers/mod_alias.c | 766 + modules/mappers/mod_alias.dep | 51 + modules/mappers/mod_alias.dsp | 111 + modules/mappers/mod_alias.exp | 1 + modules/mappers/mod_alias.mak | 353 + modules/mappers/mod_dir.c | 417 + modules/mappers/mod_dir.dep | 60 + modules/mappers/mod_dir.dsp | 111 + modules/mappers/mod_dir.exp | 1 + modules/mappers/mod_dir.mak | 353 + modules/mappers/mod_imagemap.c | 897 + modules/mappers/mod_imagemap.dep | 60 + modules/mappers/mod_imagemap.dsp | 111 + modules/mappers/mod_imagemap.exp | 1 + modules/mappers/mod_imagemap.mak | 353 + modules/mappers/mod_negotiation.c | 3223 ++ modules/mappers/mod_negotiation.dep | 58 + modules/mappers/mod_negotiation.dsp | 111 + modules/mappers/mod_negotiation.exp | 1 + modules/mappers/mod_negotiation.mak | 353 + modules/mappers/mod_rewrite.c | 5683 ++ modules/mappers/mod_rewrite.dep | 65 + modules/mappers/mod_rewrite.dsp | 111 + modules/mappers/mod_rewrite.exp | 1 + modules/mappers/mod_rewrite.h | 42 + modules/mappers/mod_rewrite.mak | 353 + modules/mappers/mod_speling.c | 528 + modules/mappers/mod_speling.dep | 51 + modules/mappers/mod_speling.dsp | 111 + modules/mappers/mod_speling.exp | 1 + modules/mappers/mod_speling.mak | 353 + modules/mappers/mod_userdir.c | 390 + modules/mappers/mod_userdir.dep | 46 + modules/mappers/mod_userdir.dsp | 111 + modules/mappers/mod_userdir.exp | 1 + modules/mappers/mod_userdir.mak | 353 + modules/mappers/mod_vhost_alias.c | 457 + modules/mappers/mod_vhost_alias.dep | 50 + modules/mappers/mod_vhost_alias.dsp | 111 + modules/mappers/mod_vhost_alias.exp | 1 + modules/mappers/mod_vhost_alias.mak | 353 + modules/md/Makefile.in | 20 + modules/md/config2.m4 | 311 + modules/md/md.h | 330 + modules/md/md_acme.c | 797 + modules/md/md_acme.h | 317 + modules/md/md_acme_acct.c | 749 + modules/md/md_acme_acct.h | 148 + modules/md/md_acme_authz.c | 715 + modules/md/md_acme_authz.h | 79 + modules/md/md_acme_drive.c | 1106 + modules/md/md_acme_drive.h | 55 + modules/md/md_acme_order.c | 562 + modules/md/md_acme_order.h | 91 + modules/md/md_acmev2_drive.c | 190 + modules/md/md_acmev2_drive.h | 27 + modules/md/md_core.c | 462 + modules/md/md_crypt.c | 2146 + modules/md/md_crypt.h | 253 + modules/md/md_curl.c | 653 + modules/md/md_curl.h | 24 + modules/md/md_event.c | 89 + modules/md/md_event.h | 46 + modules/md/md_http.c | 397 + modules/md/md_http.h | 272 + modules/md/md_json.c | 1311 + modules/md/md_json.h | 157 + modules/md/md_jws.c | 148 + modules/md/md_jws.h | 52 + modules/md/md_log.c | 78 + modules/md/md_log.h | 60 + modules/md/md_ocsp.c | 1059 + modules/md/md_ocsp.h | 71 + modules/md/md_reg.c | 1361 + modules/md/md_reg.h | 320 + modules/md/md_result.c | 285 + modules/md/md_result.h | 87 + modules/md/md_status.c | 653 + modules/md/md_status.h | 126 + modules/md/md_store.c | 385 + modules/md/md_store.h | 343 + modules/md/md_store_fs.c | 1169 + modules/md/md_store_fs.h | 65 + modules/md/md_tailscale.c | 383 + modules/md/md_tailscale.h | 25 + modules/md/md_time.c | 325 + modules/md/md_time.h | 77 + modules/md/md_util.c | 1566 + modules/md/md_util.h | 258 + modules/md/md_version.h | 43 + modules/md/mod_md.c | 1549 + modules/md/mod_md.dep | 5 + modules/md/mod_md.dsp | 223 + modules/md/mod_md.h | 20 + modules/md/mod_md.mak | 618 + modules/md/mod_md_config.c | 1452 + modules/md/mod_md_config.h | 139 + modules/md/mod_md_drive.c | 353 + modules/md/mod_md_drive.h | 35 + modules/md/mod_md_ocsp.c | 272 + modules/md/mod_md_ocsp.h | 33 + modules/md/mod_md_os.c | 88 + modules/md/mod_md_os.h | 37 + modules/md/mod_md_private.h | 24 + modules/md/mod_md_status.c | 987 + modules/md/mod_md_status.h | 27 + modules/metadata/.indent.pro | 54 + modules/metadata/Makefile.in | 3 + modules/metadata/NWGNUcernmeta | 248 + modules/metadata/NWGNUexpires | 248 + modules/metadata/NWGNUheaders | 249 + modules/metadata/NWGNUmakefile | 254 + modules/metadata/NWGNUmimemagi | 248 + modules/metadata/NWGNUmodident | 248 + modules/metadata/NWGNUmodversion | 248 + modules/metadata/NWGNUremoteip | 248 + modules/metadata/NWGNUuniqueid | 257 + modules/metadata/NWGNUusertrk | 248 + modules/metadata/config.m4 | 24 + modules/metadata/mod_cern_meta.c | 371 + modules/metadata/mod_cern_meta.dep | 55 + modules/metadata/mod_cern_meta.dsp | 111 + modules/metadata/mod_cern_meta.exp | 1 + modules/metadata/mod_cern_meta.mak | 353 + modules/metadata/mod_env.c | 189 + modules/metadata/mod_env.dep | 47 + modules/metadata/mod_env.dsp | 111 + modules/metadata/mod_env.exp | 1 + modules/metadata/mod_env.mak | 353 + modules/metadata/mod_expires.c | 571 + modules/metadata/mod_expires.dep | 54 + modules/metadata/mod_expires.dsp | 111 + modules/metadata/mod_expires.exp | 1 + modules/metadata/mod_expires.mak | 353 + modules/metadata/mod_headers.c | 1010 + modules/metadata/mod_headers.dep | 57 + modules/metadata/mod_headers.dsp | 111 + modules/metadata/mod_headers.exp | 1 + modules/metadata/mod_headers.mak | 353 + modules/metadata/mod_ident.c | 344 + modules/metadata/mod_ident.dep | 52 + modules/metadata/mod_ident.dsp | 111 + modules/metadata/mod_ident.exp | 1 + modules/metadata/mod_ident.mak | 353 + modules/metadata/mod_mime_magic.c | 2471 + modules/metadata/mod_mime_magic.dep | 58 + modules/metadata/mod_mime_magic.dsp | 111 + modules/metadata/mod_mime_magic.exp | 1 + modules/metadata/mod_mime_magic.mak | 353 + modules/metadata/mod_remoteip.c | 1267 + modules/metadata/mod_remoteip.dep | 53 + modules/metadata/mod_remoteip.dsp | 111 + modules/metadata/mod_remoteip.mak | 353 + modules/metadata/mod_setenvif.c | 658 + modules/metadata/mod_setenvif.dep | 56 + modules/metadata/mod_setenvif.dsp | 111 + modules/metadata/mod_setenvif.exp | 1 + modules/metadata/mod_setenvif.mak | 353 + modules/metadata/mod_unique_id.c | 336 + modules/metadata/mod_unique_id.dep | 50 + modules/metadata/mod_unique_id.dsp | 111 + modules/metadata/mod_unique_id.exp | 1 + modules/metadata/mod_unique_id.mak | 353 + modules/metadata/mod_usertrack.c | 504 + modules/metadata/mod_usertrack.dep | 51 + modules/metadata/mod_usertrack.dsp | 111 + modules/metadata/mod_usertrack.exp | 1 + modules/metadata/mod_usertrack.mak | 353 + modules/metadata/mod_version.c | 313 + modules/metadata/mod_version.dep | 45 + modules/metadata/mod_version.dsp | 111 + modules/metadata/mod_version.exp | 1 + modules/metadata/mod_version.mak | 353 + modules/proxy/.indent.pro | 58 + modules/proxy/CHANGES | 223 + modules/proxy/Makefile.in | 4 + modules/proxy/NWGNUmakefile | 259 + modules/proxy/NWGNUproxy | 337 + modules/proxy/NWGNUproxyajp | 264 + modules/proxy/NWGNUproxybalancer | 260 + modules/proxy/NWGNUproxycon | 251 + modules/proxy/NWGNUproxyexpress | 256 + modules/proxy/NWGNUproxyfcgi | 261 + modules/proxy/NWGNUproxyftp | 260 + modules/proxy/NWGNUproxyhcheck | 254 + modules/proxy/NWGNUproxyhtp | 260 + modules/proxy/NWGNUproxylbm_busy | 250 + modules/proxy/NWGNUproxylbm_hb | 251 + modules/proxy/NWGNUproxylbm_req | 251 + modules/proxy/NWGNUproxylbm_traf | 251 + modules/proxy/NWGNUproxyscgi | 260 + modules/proxy/NWGNUproxywstunnel | 250 + modules/proxy/ajp.h | 522 + modules/proxy/ajp_header.c | 903 + modules/proxy/ajp_header.h | 195 + modules/proxy/ajp_link.c | 115 + modules/proxy/ajp_msg.c | 641 + modules/proxy/ajp_utils.c | 137 + modules/proxy/balancers/Makefile.in | 3 + modules/proxy/balancers/config2.m4 | 8 + .../proxy/balancers/mod_lbmethod_bybusyness.c | 124 + .../balancers/mod_lbmethod_bybusyness.dep | 76 + .../balancers/mod_lbmethod_bybusyness.dsp | 123 + .../balancers/mod_lbmethod_bybusyness.mak | 408 + .../proxy/balancers/mod_lbmethod_byrequests.c | 165 + .../balancers/mod_lbmethod_byrequests.dep | 76 + .../balancers/mod_lbmethod_byrequests.dsp | 123 + .../balancers/mod_lbmethod_byrequests.mak | 408 + .../proxy/balancers/mod_lbmethod_bytraffic.c | 133 + .../balancers/mod_lbmethod_bytraffic.dep | 76 + .../balancers/mod_lbmethod_bytraffic.dsp | 123 + .../balancers/mod_lbmethod_bytraffic.mak | 408 + .../proxy/balancers/mod_lbmethod_heartbeat.c | 464 + .../balancers/mod_lbmethod_heartbeat.dep | 77 + .../balancers/mod_lbmethod_heartbeat.dsp | 123 + .../balancers/mod_lbmethod_heartbeat.mak | 408 + modules/proxy/config.m4 | 79 + modules/proxy/libproxy.exp | 1 + modules/proxy/mod_proxy.c | 3442 ++ modules/proxy/mod_proxy.dep | 153 + modules/proxy/mod_proxy.dsp | 127 + modules/proxy/mod_proxy.h | 1559 + modules/proxy/mod_proxy.mak | 361 + modules/proxy/mod_proxy_ajp.c | 877 + modules/proxy/mod_proxy_ajp.dep | 356 + modules/proxy/mod_proxy_ajp.dsp | 151 + modules/proxy/mod_proxy_ajp.mak | 416 + modules/proxy/mod_proxy_balancer.c | 2065 + modules/proxy/mod_proxy_balancer.dep | 76 + modules/proxy/mod_proxy_balancer.dsp | 123 + modules/proxy/mod_proxy_balancer.mak | 380 + modules/proxy/mod_proxy_connect.c | 404 + modules/proxy/mod_proxy_connect.dep | 73 + modules/proxy/mod_proxy_connect.dsp | 123 + modules/proxy/mod_proxy_connect.mak | 380 + modules/proxy/mod_proxy_express.c | 250 + modules/proxy/mod_proxy_express.dep | 74 + modules/proxy/mod_proxy_express.dsp | 123 + modules/proxy/mod_proxy_express.mak | 380 + modules/proxy/mod_proxy_fcgi.c | 1403 + modules/proxy/mod_proxy_fcgi.dep | 75 + modules/proxy/mod_proxy_fcgi.dsp | 123 + modules/proxy/mod_proxy_fcgi.mak | 380 + modules/proxy/mod_proxy_fdpass.c | 241 + modules/proxy/mod_proxy_fdpass.h | 41 + modules/proxy/mod_proxy_ftp.c | 2116 + modules/proxy/mod_proxy_ftp.dep | 74 + modules/proxy/mod_proxy_ftp.dsp | 123 + modules/proxy/mod_proxy_ftp.mak | 380 + modules/proxy/mod_proxy_hcheck.c | 1367 + modules/proxy/mod_proxy_hcheck.dep | 5 + modules/proxy/mod_proxy_hcheck.dsp | 123 + modules/proxy/mod_proxy_hcheck.mak | 380 + modules/proxy/mod_proxy_http.c | 2144 + modules/proxy/mod_proxy_http.dep | 73 + modules/proxy/mod_proxy_http.dsp | 123 + modules/proxy/mod_proxy_http.mak | 380 + modules/proxy/mod_proxy_scgi.c | 684 + modules/proxy/mod_proxy_scgi.dep | 75 + modules/proxy/mod_proxy_scgi.dsp | 123 + modules/proxy/mod_proxy_scgi.mak | 380 + modules/proxy/mod_proxy_uwsgi.c | 601 + modules/proxy/mod_proxy_uwsgi.dep | 75 + modules/proxy/mod_proxy_uwsgi.dsp | 123 + modules/proxy/mod_proxy_uwsgi.mak | 380 + modules/proxy/mod_proxy_wstunnel.c | 513 + modules/proxy/mod_proxy_wstunnel.dep | 73 + modules/proxy/mod_proxy_wstunnel.dsp | 123 + modules/proxy/mod_proxy_wstunnel.mak | 380 + modules/proxy/proxy_util.c | 5832 +++ modules/proxy/proxy_util.h | 62 + modules/proxy/scgi.h | 36 + modules/session/Makefile.in | 4 + modules/session/NWGNUmakefile | 257 + modules/session/NWGNUsession | 254 + modules/session/NWGNUsession_cookie | 253 + modules/session/NWGNUsession_crypto | 255 + modules/session/NWGNUsession_dbd | 253 + modules/session/config.m4 | 68 + modules/session/mod_session.c | 711 + modules/session/mod_session.dep | 56 + modules/session/mod_session.dsp | 115 + modules/session/mod_session.h | 189 + modules/session/mod_session.mak | 353 + modules/session/mod_session_cookie.c | 284 + modules/session/mod_session_cookie.dep | 49 + modules/session/mod_session_cookie.dsp | 111 + modules/session/mod_session_cookie.mak | 381 + modules/session/mod_session_crypto.c | 807 + modules/session/mod_session_crypto.dep | 57 + modules/session/mod_session_crypto.dsp | 111 + modules/session/mod_session_crypto.mak | 381 + modules/session/mod_session_dbd.c | 640 + modules/session/mod_session_dbd.dep | 60 + modules/session/mod_session_dbd.dsp | 111 + modules/session/mod_session_dbd.mak | 409 + modules/slotmem/Makefile.in | 3 + modules/slotmem/NWGNUmakefile | 246 + modules/slotmem/NWGNUslotmem_plain | 250 + modules/slotmem/NWGNUslotmem_shm | 250 + modules/slotmem/config.m4 | 10 + modules/slotmem/mod_slotmem_plain.c | 343 + modules/slotmem/mod_slotmem_plain.dep | 51 + modules/slotmem/mod_slotmem_plain.dsp | 111 + modules/slotmem/mod_slotmem_plain.mak | 353 + modules/slotmem/mod_slotmem_shm.c | 788 + modules/slotmem/mod_slotmem_shm.dep | 57 + modules/slotmem/mod_slotmem_shm.dsp | 111 + modules/slotmem/mod_slotmem_shm.mak | 353 + modules/ssl/Makefile.in | 20 + modules/ssl/NWGNUmakefile | 327 + modules/ssl/README | 106 + modules/ssl/README.dsov.fig | 346 + modules/ssl/README.dsov.ps | 1138 + modules/ssl/config.m4 | 57 + modules/ssl/mod_ssl.c | 772 + modules/ssl/mod_ssl.dep | 1086 + modules/ssl/mod_ssl.dsp | 195 + modules/ssl/mod_ssl.h | 120 + modules/ssl/mod_ssl.mak | 500 + modules/ssl/mod_ssl_openssl.h | 116 + modules/ssl/ssl_engine_config.c | 2165 + modules/ssl/ssl_engine_init.c | 2396 + modules/ssl/ssl_engine_io.c | 2484 + modules/ssl/ssl_engine_kernel.c | 2843 + modules/ssl/ssl_engine_log.c | 246 + modules/ssl/ssl_engine_mutex.c | 111 + modules/ssl/ssl_engine_ocsp.c | 312 + modules/ssl/ssl_engine_pphrase.c | 1060 + modules/ssl/ssl_engine_rand.c | 177 + modules/ssl/ssl_engine_vars.c | 1230 + modules/ssl/ssl_private.h | 1221 + modules/ssl/ssl_scache.c | 239 + modules/ssl/ssl_util.c | 485 + modules/ssl/ssl_util_ocsp.c | 425 + modules/ssl/ssl_util_ssl.c | 630 + modules/ssl/ssl_util_ssl.h | 107 + modules/ssl/ssl_util_stapling.c | 971 + modules/test/.indent.pro | 54 + modules/test/Makefile.in | 3 + modules/test/NWGNUmakefile | 257 + modules/test/NWGNUoptfnexport | 256 + modules/test/NWGNUoptfnimport | 256 + modules/test/NWGNUopthookexport | 256 + modules/test/NWGNUopthookimport | 256 + modules/test/README | 1 + modules/test/config.m4 | 13 + modules/test/mod_dialup.c | 306 + modules/test/mod_optional_fn_export.c | 48 + modules/test/mod_optional_fn_export.h | 19 + modules/test/mod_optional_fn_import.c | 55 + modules/test/mod_optional_hook_export.c | 44 + modules/test/mod_optional_hook_export.h | 24 + modules/test/mod_optional_hook_import.c | 45 + os/.indent.pro | 54 + os/Makefile.in | 4 + os/bs2000/ebcdic.c | 210 + os/bs2000/ebcdic.h | 33 + os/bs2000/os.c | 136 + os/bs2000/os.h | 40 + os/config.m4 | 26 + os/netware/apache.xdc | Bin 0 -> 128 bytes os/netware/modules.c | 117 + os/netware/netware_config_layout.h | 31 + os/netware/os.h | 57 + os/netware/pre_nw.h | 70 + os/netware/util_nw.c | 112 + os/os2/Makefile.in | 5 + os/os2/config.m4 | 3 + os/os2/core.mk | 7 + os/os2/core_header.def | 19 + os/os2/os.h | 40 + os/os2/util_os2.c | 39 + os/unix/Makefile.in | 5 + os/unix/config.m4 | 7 + os/unix/os.h | 52 + os/unix/unixd.c | 733 + os/unix/unixd.h | 142 + os/win32/BaseAddr.ref | 135 + os/win32/Makefile.in | 5 + os/win32/ap_regkey.c | 642 + os/win32/modules.c | 56 + os/win32/os.h | 136 + os/win32/util_win32.c | 103 + os/win32/win32_config_layout.h | 31 + server/.indent.pro | 54 + server/Makefile.in | 105 + server/NWGNUmakefile | 261 + server/buildmark.c | 29 + server/config.c | 2557 + server/config.m4 | 19 + server/connection.c | 219 + server/core.c | 5813 ++ server/core_filters.c | 868 + server/eoc_bucket.c | 55 + server/eor_bucket.c | 115 + server/error_bucket.c | 77 + server/gen_test_char.c | 192 + server/gen_test_char.dep | 7 + server/gen_test_char.dsp | 94 + server/gen_test_char.mak | 234 + server/listen.c | 977 + server/log.c | 2009 + server/main.c | 875 + server/mpm/MPM.NAMING | 14 + server/mpm/Makefile.in | 4 + server/mpm/config.m4 | 128 + server/mpm/config2.m4 | 89 + server/mpm/event/Makefile.in | 1 + server/mpm/event/config.m4 | 15 + server/mpm/event/config3.m4 | 7 + server/mpm/event/event.c | 4165 ++ server/mpm/event/mpm_default.h | 56 + server/mpm/mpmt_os2/Makefile.in | 1 + server/mpm/mpmt_os2/config.m4 | 10 + server/mpm/mpmt_os2/config5.m4 | 3 + server/mpm/mpmt_os2/mpm_default.h | 57 + server/mpm/mpmt_os2/mpmt_os2.c | 614 + server/mpm/mpmt_os2/mpmt_os2_child.c | 490 + server/mpm/netware/mpm_default.h | 78 + server/mpm/netware/mpm_netware.c | 1365 + server/mpm/prefork/Makefile.in | 1 + server/mpm/prefork/config.m4 | 7 + server/mpm/prefork/config3.m4 | 1 + server/mpm/prefork/mpm_default.h | 51 + server/mpm/prefork/prefork.c | 1563 + server/mpm/winnt/Makefile.in | 1 + server/mpm/winnt/child.c | 1306 + server/mpm/winnt/config.m4 | 10 + server/mpm/winnt/config3.m4 | 2 + server/mpm/winnt/mpm_default.h | 60 + server/mpm/winnt/mpm_winnt.c | 1783 + server/mpm/winnt/mpm_winnt.h | 96 + server/mpm/winnt/nt_eventlog.c | 172 + server/mpm/winnt/service.c | 1241 + server/mpm/worker/Makefile.in | 2 + server/mpm/worker/config.m4 | 11 + server/mpm/worker/config3.m4 | 5 + server/mpm/worker/mpm_default.h | 55 + server/mpm/worker/worker.c | 2472 + server/mpm_common.c | 578 + server/mpm_fdqueue.c | 534 + server/mpm_fdqueue.h | 110 + server/mpm_unix.c | 1112 + server/protocol.c | 2605 + server/provider.c | 198 + server/request.c | 2572 + server/scoreboard.c | 713 + server/ssl.c | 285 + server/util.c | 3779 ++ server/util_cfgtree.c | 46 + server/util_charset.c | 28 + server/util_cookies.c | 290 + server/util_debug.c | 236 + server/util_ebcdic.c | 117 + server/util_expr_eval.c | 1831 + server/util_expr_parse.c | 2132 + server/util_expr_parse.h | 104 + server/util_expr_parse.y | 217 + server/util_expr_private.h | 141 + server/util_expr_scan.c | 2669 + server/util_expr_scan.l | 400 + server/util_fcgi.c | 290 + server/util_filter.c | 733 + server/util_md5.c | 166 + server/util_mutex.c | 561 + server/util_pcre.c | 547 + server/util_regex.c | 211 + server/util_script.c | 946 + server/util_time.c | 331 + server/util_xml.c | 140 + server/vhost.c | 1311 + srclib/Makefile.in | 5 + support/.indent.pro | 54 + support/Makefile.in | 89 + support/NWGNUab | 330 + support/NWGNUhtcacheclean | 253 + support/NWGNUhtdbm | 252 + support/NWGNUhtdigest | 251 + support/NWGNUhtpasswd | 252 + support/NWGNUhttxt2dbm | 251 + support/NWGNUlogres | 258 + support/NWGNUmakefile | 51 + support/NWGNUrotlogs | 250 + support/README | 65 + support/SHA1/README.sha1 | 34 + support/SHA1/convert-sha1.pl | 36 + support/SHA1/htpasswd-sha1.pl | 22 + support/SHA1/ldif-sha1.example | 19 + support/ab.c | 2752 + support/ab.dep | 37 + support/ab.dsp | 106 + support/ab.mak | 317 + support/abs.dep | 37 + support/abs.dsp | 144 + support/abs.mak | 374 + support/apachectl.in | 106 + support/apxs.in | 801 + support/check_forensic | 51 + support/checkgid.c | 110 + support/config.m4 | 151 + support/dbmmanage.in | 312 + support/envvars-std.in | 28 + support/fcgistarter.c | 220 + support/fcgistarter.dep | 29 + support/fcgistarter.dsp | 106 + support/fcgistarter.mak | 317 + support/htcacheclean.c | 1840 + support/htcacheclean.dep | 37 + support/htcacheclean.dsp | 106 + support/htcacheclean.mak | 317 + support/htdbm.c | 472 + support/htdbm.dep | 58 + support/htdbm.dsp | 110 + support/htdbm.mak | 326 + support/htdigest.c | 303 + support/htdigest.dep | 27 + support/htdigest.dsp | 106 + support/htdigest.mak | 317 + support/htpasswd.c | 528 + support/htpasswd.dep | 57 + support/htpasswd.dsp | 110 + support/htpasswd.mak | 326 + support/httxt2dbm.c | 335 + support/httxt2dbm.dep | 26 + support/httxt2dbm.dsp | 106 + support/httxt2dbm.mak | 317 + support/list_hooks.pl | 101 + support/log_server_status.in | 76 + support/logresolve.c | 329 + support/logresolve.dep | 26 + support/logresolve.dsp | 106 + support/logresolve.mak | 317 + support/logresolve.pl.in | 225 + support/passwd_common.c | 391 + support/passwd_common.h | 134 + support/phf_abuse_log.cgi.in | 38 + support/rotatelogs.c | 810 + support/rotatelogs.dep | 28 + support/rotatelogs.dsp | 106 + support/rotatelogs.mak | 317 + support/split-logfile.in | 69 + support/suexec.c | 685 + support/suexec.h | 109 + support/win32/ApacheMonitor.c | 1671 + support/win32/ApacheMonitor.dep | 18 + support/win32/ApacheMonitor.dsp | 143 + support/win32/ApacheMonitor.h | 78 + support/win32/ApacheMonitor.ico | Bin 0 -> 1078 bytes support/win32/ApacheMonitor.mak | 309 + support/win32/ApacheMonitor.manifest | 10 + support/win32/ApacheMonitor.rc | 103 + support/win32/apache_header.bmp | Bin 0 -> 6498 bytes support/win32/aprun.ico | Bin 0 -> 318 bytes support/win32/apstop.ico | Bin 0 -> 318 bytes support/win32/srun.bmp | Bin 0 -> 246 bytes support/win32/sstop.bmp | Bin 0 -> 246 bytes support/win32/wintty.c | 374 + support/win32/wintty.dep | 5 + support/win32/wintty.dsp | 106 + support/win32/wintty.mak | 317 + test/.indent.pro | 54 + test/Makefile.in | 26 + test/README | 3 + test/README.ci | 163 + test/README.pytest | 139 + test/check_chunked | 58 + test/clients/.gitignore | 1 + test/clients/Makefile.in | 20 + test/clients/h2ws.c | 1109 + test/cls.c | 182 + test/conftest.py | 31 + test/make_sni.sh | 396 + test/modules/core/__init__.py | 1 + test/modules/core/conftest.py | 35 + test/modules/core/env.py | 25 + test/modules/core/test_001_encoding.py | 92 + test/modules/core/test_002_restarts.py | 150 + test/modules/http1/__init__.py | 0 test/modules/http1/conftest.py | 41 + test/modules/http1/env.py | 81 + test/modules/http1/htdocs/cgi/files/empty.txt | 0 test/modules/http1/htdocs/cgi/hello.py | 15 + .../modules/http1/htdocs/cgi/requestparser.py | 57 + test/modules/http1/htdocs/cgi/upload.py | 55 + test/modules/http1/mod_h1test/mod_h1test.c | 129 + test/modules/http1/mod_h1test/mod_h1test.slo | 0 test/modules/http1/test_001_alive.py | 20 + test/modules/http1/test_003_get.py | 27 + test/modules/http1/test_004_post.py | 53 + test/modules/http1/test_005_trailers.py | 42 + test/modules/http1/test_006_unsafe.py | 134 + test/modules/http1/test_007_strict.py | 126 + test/modules/http2/.gitignore | 3 + test/modules/http2/Makefile.in | 20 + test/modules/http2/__init__.py | 0 test/modules/http2/conftest.py | 39 + test/modules/http2/env.py | 147 + test/modules/http2/htdocs/cgi/alive.json | 4 + test/modules/http2/htdocs/cgi/echo.py | 16 + test/modules/http2/htdocs/cgi/echohd.py | 22 + test/modules/http2/htdocs/cgi/env.py | 41 + test/modules/http2/htdocs/cgi/files/empty.txt | 0 test/modules/http2/htdocs/cgi/hecho.py | 48 + test/modules/http2/htdocs/cgi/hello.py | 25 + test/modules/http2/htdocs/cgi/mnot164.py | 16 + test/modules/http2/htdocs/cgi/necho.py | 56 + .../modules/http2/htdocs/cgi/requestparser.py | 57 + test/modules/http2/htdocs/cgi/ssi/include.inc | 1 + test/modules/http2/htdocs/cgi/ssi/test.html | 9 + test/modules/http2/htdocs/cgi/upload.py | 55 + test/modules/http2/htdocs/cgi/xxx/test.json | 1 + test/modules/http2/htdocs/noh2/alive.json | 5 + test/modules/http2/htdocs/noh2/index.html | 9 + test/modules/http2/mod_h2test/mod_h2test.c | 588 + test/modules/http2/mod_h2test/mod_h2test.h | 21 + test/modules/http2/test_001_httpd_alive.py | 22 + test/modules/http2/test_002_curl_basics.py | 71 + test/modules/http2/test_003_get.py | 265 + test/modules/http2/test_004_post.py | 201 + test/modules/http2/test_005_files.py | 48 + test/modules/http2/test_006_assets.py | 75 + test/modules/http2/test_007_ssi.py | 42 + test/modules/http2/test_008_ranges.py | 191 + test/modules/http2/test_009_timing.py | 75 + test/modules/http2/test_100_conn_reuse.py | 69 + test/modules/http2/test_101_ssl_reneg.py | 184 + test/modules/http2/test_102_require.py | 47 + test/modules/http2/test_103_upgrade.py | 121 + test/modules/http2/test_104_padding.py | 104 + test/modules/http2/test_105_timeout.py | 166 + test/modules/http2/test_106_shutdown.py | 81 + test/modules/http2/test_107_frame_lengths.py | 51 + test/modules/http2/test_200_header_invalid.py | 286 + .../http2/test_201_header_conditional.py | 70 + test/modules/http2/test_202_trailer.py | 93 + test/modules/http2/test_203_rfc9113.py | 61 + test/modules/http2/test_300_interim.py | 40 + test/modules/http2/test_400_push.py | 200 + test/modules/http2/test_401_early_hints.py | 83 + test/modules/http2/test_500_proxy.py | 169 + .../http2/test_501_proxy_serverheader.py | 36 + test/modules/http2/test_502_proxy_port.py | 41 + test/modules/http2/test_503_proxy_fwd.py | 79 + test/modules/http2/test_600_h2proxy.py | 200 + .../modules/http2/test_601_h2proxy_twisted.py | 99 + test/modules/http2/test_700_load_get.py | 97 + .../http2/test_710_load_post_static.py | 65 + test/modules/http2/test_711_load_post_cgi.py | 73 + test/modules/http2/test_712_buffering.py | 58 + test/modules/http2/test_800_websockets.py | 362 + test/modules/http2/ws_server.py | 104 + test/modules/md/__init__.py | 0 test/modules/md/conftest.py | 59 + .../accounts/ACME-localhost-0000/account.json | 6 + .../accounts/ACME-localhost-0000/account.pem | 54 + .../archive/7007-1502285564.org.1/md.json | 18 + .../domains/7007-1502285564.org/cert.pem | 32 + .../domains/7007-1502285564.org/chain.pem | 27 + .../domains/7007-1502285564.org/md.json | 23 + .../domains/7007-1502285564.org/pkey.pem | 52 + .../data/store_migrate/1.0/sample1/httpd.json | 6 + .../store_migrate/1.0/sample1/md_store.json | 7 + test/modules/md/data/test_920/002.pubcert | 58 + .../md/data/test_conf_validate/test_014.conf | 8 + .../md/data/test_drive/test1.example.org.conf | 6 + test/modules/md/data/test_roundtrip/temp.conf | 27 + test/modules/md/dns01.py | 62 + test/modules/md/dns01_v2.py | 62 + test/modules/md/http_challenge_foobar.py | 27 + test/modules/md/md_acme.py | 125 + test/modules/md/md_cert_util.py | 209 + test/modules/md/md_certs.py | 444 + test/modules/md/md_conf.py | 83 + test/modules/md/md_env.py | 623 + test/modules/md/message.py | 26 + test/modules/md/msg_fail_on.py | 28 + test/modules/md/notifail.py | 16 + test/modules/md/notify.py | 18 + .../md/pebble/pebble-eab.json.template | 16 + test/modules/md/pebble/pebble.json.template | 12 + test/modules/md/test_001_store.py | 213 + test/modules/md/test_010_store_migrate.py | 43 + test/modules/md/test_100_reg_add.py | 152 + test/modules/md/test_110_reg_update.py | 273 + test/modules/md/test_120_reg_list.py | 87 + test/modules/md/test_202_acmev2_regs.py | 132 + test/modules/md/test_300_conf_validate.py | 547 + test/modules/md/test_310_conf_store.py | 850 + test/modules/md/test_502_acmev2_drive.py | 553 + test/modules/md/test_602_roundtrip.py | 143 + test/modules/md/test_702_auto.py | 848 + test/modules/md/test_720_wildcard.py | 282 + test/modules/md/test_730_static.py | 134 + test/modules/md/test_740_acme_errors.py | 90 + test/modules/md/test_741_setup_errors.py | 84 + test/modules/md/test_750_eab.py | 436 + test/modules/md/test_751_sectigo.py | 181 + test/modules/md/test_752_zerossl.py | 202 + test/modules/md/test_780_tailscale.py | 198 + test/modules/md/test_790_failover.py | 105 + test/modules/md/test_800_must_staple.py | 84 + test/modules/md/test_801_stapling.py | 396 + test/modules/md/test_810_ec.py | 153 + test/modules/md/test_820_locks.py | 73 + test/modules/md/test_900_notify.py | 136 + test/modules/md/test_901_message.py | 333 + test/modules/md/test_910_cleanups.py | 54 + test/modules/md/test_920_status.py | 255 + test/modules/proxy/__init__.py | 0 test/modules/proxy/conftest.py | 36 + test/modules/proxy/env.py | 53 + test/modules/proxy/test_01_http.py | 96 + test/modules/proxy/test_02_unix.py | 193 + test/pyhttpd/__init__.py | 0 test/pyhttpd/certs.py | 513 + test/pyhttpd/conf.py | 269 + test/pyhttpd/conf/httpd.conf.template | 60 + test/pyhttpd/conf/mime.types | 1589 + test/pyhttpd/conf/stop.conf.template | 46 + test/pyhttpd/conf/test.conf | 1 + test/pyhttpd/config.ini.in | 32 + test/pyhttpd/curl.py | 136 + test/pyhttpd/env.py | 921 + test/pyhttpd/htdocs/alive.json | 4 + test/pyhttpd/htdocs/forbidden.html | 11 + test/pyhttpd/htdocs/index.html | 9 + test/pyhttpd/htdocs/test1/001.html | 10 + test/pyhttpd/htdocs/test1/002.jpg | Bin 0 -> 90364 bytes test/pyhttpd/htdocs/test1/003.html | 11 + test/pyhttpd/htdocs/test1/003/003_img.jpg | Bin 0 -> 90364 bytes test/pyhttpd/htdocs/test1/004.html | 23 + test/pyhttpd/htdocs/test1/004/gophertiles.jpg | Bin 0 -> 742 bytes test/pyhttpd/htdocs/test1/006.html | 23 + test/pyhttpd/htdocs/test1/006/006.css | 21 + test/pyhttpd/htdocs/test1/006/006.js | 31 + test/pyhttpd/htdocs/test1/006/header.html | 1 + test/pyhttpd/htdocs/test1/007.html | 21 + test/pyhttpd/htdocs/test1/007/007.py | 29 + test/pyhttpd/htdocs/test1/009.py | 21 + test/pyhttpd/htdocs/test1/alive.json | 5 + test/pyhttpd/htdocs/test1/index.html | 46 + test/pyhttpd/htdocs/test2/006/006.css | 21 + test/pyhttpd/htdocs/test2/10%abnormal.txt | 0 test/pyhttpd/htdocs/test2/alive.json | 4 + test/pyhttpd/htdocs/test2/x%2f.test | 0 test/pyhttpd/log.py | 152 + test/pyhttpd/mod_aptest/mod_aptest.c | 66 + test/pyhttpd/nghttp.py | 304 + test/pyhttpd/result.py | 92 + test/pyhttpd/ws_util.py | 137 + test/tcpdumpscii.txt | 50 + test/test-writev.c | 101 + test/test_find.c | 78 + test/test_limits.c | 200 + test/test_parser.c | 75 + test/test_select.c | 46 + test/test_travis_conditions.sh | 42 + test/time-sem.c | 593 + test/travis_Dockerfile_slapd | 9 + test/travis_Dockerfile_slapd.centos | 5 + test/travis_before_linux.sh | 157 + test/travis_run_linux.sh | 257 + 3104 files changed, 900776 insertions(+) create mode 100644 .deps create mode 100644 .gdbinit create mode 100644 .github/workflows/linux.yml create mode 100644 .github/workflows/windows.yml create mode 100644 .gitignore create mode 100644 ABOUT_APACHE create mode 100644 Apache-apr2.dsw create mode 100644 Apache.dsw create mode 100644 BuildAll.dsp create mode 100644 BuildBin.dsp create mode 100644 CHANGES create mode 100644 CMakeLists.txt create mode 100644 INSTALL create mode 100644 InstallBin.dsp create mode 100644 LAYOUT create mode 100644 LICENSE create mode 100644 Makefile.in create mode 100644 Makefile.win create mode 100644 NOTICE create mode 100644 NWGNUmakefile create mode 100644 README create mode 100644 README.CHANGES create mode 100644 README.cmake create mode 100644 README.platforms create mode 100644 ROADMAP create mode 100644 VERSIONING create mode 100644 acinclude.m4 create mode 100644 ap.d create mode 100644 apache_probes.d create mode 100644 build/NWGNUenvironment.inc create mode 100644 build/NWGNUhead.inc create mode 100644 build/NWGNUmakefile create mode 100644 build/NWGNUscripts.inc create mode 100644 build/NWGNUtail.inc create mode 100755 build/PrintPath create mode 100644 build/aix/README create mode 100644 build/aix/aixinfo create mode 100755 build/aix/aixproto.ksh create mode 100755 build/aix/buildaix.ksh create mode 100755 build/aix/mkinstallp.ksh create mode 100644 build/apr_common.m4 create mode 100755 build/binbuild.sh create mode 100755 build/bsd_makefile create mode 100644 build/build-modules-c.awk create mode 100755 build/buildinfo.sh create mode 100755 build/config-stubs create mode 100755 build/config.guess create mode 100755 build/config.sub create mode 100644 build/config_vars.sh.in create mode 100644 build/cpR_noreplace.pl create mode 100644 build/default.pl create mode 100755 build/fastgen.sh create mode 100644 build/find_apr.m4 create mode 100644 build/find_apu.m4 create mode 100755 build/get-version.sh create mode 100755 build/install-bindist.sh.in create mode 100755 build/install.sh create mode 100644 build/installwinconf.awk create mode 100755 build/instdso.sh create mode 100644 build/library.mk create mode 100644 build/ltlib.mk create mode 100644 build/ltmain.sh create mode 100644 build/make_exports.awk create mode 100644 build/make_nw_export.awk create mode 100644 build/make_var_export.awk create mode 100644 build/mkconfNW.awk create mode 100644 build/mkdep.perl create mode 100755 build/mkdir.sh create mode 100644 build/nw_export.inc create mode 100644 build/nw_ver.awk create mode 100644 build/pkg/README create mode 100755 build/pkg/buildpkg.sh create mode 100644 build/pkg/pkginfo.in create mode 100644 build/program.mk create mode 100755 build/rpm/htcacheclean.init create mode 100755 build/rpm/httpd.init create mode 100644 build/rpm/httpd.logrotate create mode 100644 build/rpm/httpd.spec.in create mode 100644 build/rules.mk.in create mode 100644 build/special.mk create mode 100755 build/sysv_makefile create mode 100644 build/win32/apache.ico create mode 100644 build/win32/httpd.rc create mode 100755 buildconf create mode 100644 config.layout create mode 100755 configure create mode 100644 configure.in create mode 100644 docs/cgi-examples/printenv create mode 100644 docs/cgi-examples/printenv.vbs create mode 100644 docs/cgi-examples/printenv.wsf create mode 100644 docs/cgi-examples/test-cgi create mode 100644 docs/conf/charset.conv create mode 100644 docs/conf/extra/httpd-autoindex.conf.in create mode 100644 docs/conf/extra/httpd-dav.conf.in create mode 100644 docs/conf/extra/httpd-default.conf.in create mode 100644 docs/conf/extra/httpd-info.conf.in create mode 100644 docs/conf/extra/httpd-languages.conf.in create mode 100644 docs/conf/extra/httpd-manual.conf.in create mode 100644 docs/conf/extra/httpd-mpm.conf.in create mode 100644 docs/conf/extra/httpd-multilang-errordoc.conf.in create mode 100644 docs/conf/extra/httpd-ssl.conf.in create mode 100644 docs/conf/extra/httpd-userdir.conf.in create mode 100644 docs/conf/extra/httpd-vhosts.conf.in create mode 100644 docs/conf/extra/proxy-html.conf.in create mode 100644 docs/conf/httpd.conf.in create mode 100644 docs/conf/magic create mode 100644 docs/conf/mime.types create mode 100644 docs/docroot/index.html create mode 100644 docs/doxygen.conf create mode 100644 docs/error/HTTP_BAD_GATEWAY.html.var create mode 100644 docs/error/HTTP_BAD_REQUEST.html.var create mode 100644 docs/error/HTTP_FORBIDDEN.html.var create mode 100644 docs/error/HTTP_GONE.html.var create mode 100644 docs/error/HTTP_INTERNAL_SERVER_ERROR.html.var create mode 100644 docs/error/HTTP_LENGTH_REQUIRED.html.var create mode 100644 docs/error/HTTP_METHOD_NOT_ALLOWED.html.var create mode 100644 docs/error/HTTP_NOT_FOUND.html.var create mode 100644 docs/error/HTTP_NOT_IMPLEMENTED.html.var create mode 100644 docs/error/HTTP_PRECONDITION_FAILED.html.var create mode 100644 docs/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var create mode 100644 docs/error/HTTP_REQUEST_TIME_OUT.html.var create mode 100644 docs/error/HTTP_REQUEST_URI_TOO_LARGE.html.var create mode 100644 docs/error/HTTP_SERVICE_UNAVAILABLE.html.var create mode 100644 docs/error/HTTP_UNAUTHORIZED.html.var create mode 100644 docs/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var create mode 100644 docs/error/HTTP_VARIANT_ALSO_VARIES.html.var create mode 100644 docs/error/README create mode 100644 docs/error/contact.html.var create mode 100644 docs/error/include/bottom.html create mode 100644 docs/error/include/spacer.html create mode 100644 docs/error/include/top.html create mode 100644 docs/icons/README create mode 100644 docs/icons/README.html create mode 100644 docs/icons/a.gif create mode 100644 docs/icons/a.png create mode 100644 docs/icons/alert.black.gif create mode 100644 docs/icons/alert.black.png create mode 100644 docs/icons/alert.red.gif create mode 100644 docs/icons/alert.red.png create mode 100644 docs/icons/apache_pb.gif create mode 100644 docs/icons/apache_pb.png create mode 100644 docs/icons/apache_pb.svg create mode 100644 docs/icons/apache_pb2.gif create mode 100644 docs/icons/apache_pb2.png create mode 100644 docs/icons/back.gif create mode 100644 docs/icons/back.png create mode 100644 docs/icons/ball.gray.gif create mode 100644 docs/icons/ball.gray.png create mode 100644 docs/icons/ball.red.gif create mode 100644 docs/icons/ball.red.png create mode 100644 docs/icons/binary.gif create mode 100644 docs/icons/binary.png create mode 100644 docs/icons/binhex.gif create mode 100644 docs/icons/binhex.png create mode 100644 docs/icons/blank.gif create mode 100644 docs/icons/blank.png create mode 100644 docs/icons/bomb.gif create mode 100644 docs/icons/bomb.png create mode 100644 docs/icons/box1.gif create mode 100644 docs/icons/box1.png create mode 100644 docs/icons/box2.gif create mode 100644 docs/icons/box2.png create mode 100644 docs/icons/broken.gif create mode 100644 docs/icons/broken.png create mode 100644 docs/icons/burst.gif create mode 100644 docs/icons/burst.png create mode 100644 docs/icons/c.gif create mode 100644 docs/icons/c.png create mode 100644 docs/icons/comp.blue.gif create mode 100644 docs/icons/comp.blue.png create mode 100644 docs/icons/comp.gray.gif create mode 100644 docs/icons/comp.gray.png create mode 100644 docs/icons/compressed.gif create mode 100644 docs/icons/compressed.png create mode 100644 docs/icons/continued.gif create mode 100644 docs/icons/continued.png create mode 100644 docs/icons/dir.gif create mode 100644 docs/icons/dir.png create mode 100644 docs/icons/diskimg.gif create mode 100644 docs/icons/diskimg.png create mode 100644 docs/icons/down.gif create mode 100644 docs/icons/down.png create mode 100644 docs/icons/dvi.gif create mode 100644 docs/icons/dvi.png create mode 100644 docs/icons/f.gif create mode 100644 docs/icons/f.png create mode 100644 docs/icons/folder.gif create mode 100644 docs/icons/folder.open.gif create mode 100644 docs/icons/folder.open.png create mode 100644 docs/icons/folder.png create mode 100644 docs/icons/folder.sec.gif create mode 100644 docs/icons/folder.sec.png create mode 100644 docs/icons/forward.gif create mode 100644 docs/icons/forward.png create mode 100644 docs/icons/generic.gif create mode 100644 docs/icons/generic.png create mode 100644 docs/icons/generic.red.gif create mode 100644 docs/icons/generic.red.png create mode 100644 docs/icons/generic.sec.gif create mode 100644 docs/icons/generic.sec.png create mode 100644 docs/icons/hand.right.gif create mode 100644 docs/icons/hand.right.png create mode 100644 docs/icons/hand.up.gif create mode 100644 docs/icons/hand.up.png create mode 100644 docs/icons/icon.sheet.gif create mode 100644 docs/icons/icon.sheet.png create mode 100644 docs/icons/image1.gif create mode 100644 docs/icons/image1.png create mode 100644 docs/icons/image2.gif create mode 100644 docs/icons/image2.png create mode 100644 docs/icons/image3.gif create mode 100644 docs/icons/image3.png create mode 100644 docs/icons/index.gif create mode 100644 docs/icons/index.png create mode 100644 docs/icons/layout.gif create mode 100644 docs/icons/layout.png create mode 100644 docs/icons/left.gif create mode 100644 docs/icons/left.png create mode 100644 docs/icons/link.gif create mode 100644 docs/icons/link.png create mode 100644 docs/icons/movie.gif create mode 100644 docs/icons/movie.png create mode 100644 docs/icons/odf6odb.png create mode 100644 docs/icons/odf6odc.png create mode 100644 docs/icons/odf6odf.png create mode 100644 docs/icons/odf6odg.png create mode 100644 docs/icons/odf6odi.png create mode 100644 docs/icons/odf6odm.png create mode 100644 docs/icons/odf6odp.png create mode 100644 docs/icons/odf6ods.png create mode 100644 docs/icons/odf6odt.png create mode 100644 docs/icons/odf6otc.png create mode 100644 docs/icons/odf6otf.png create mode 100644 docs/icons/odf6otg.png create mode 100644 docs/icons/odf6oth.png create mode 100644 docs/icons/odf6oti.png create mode 100644 docs/icons/odf6otp.png create mode 100644 docs/icons/odf6ots.png create mode 100644 docs/icons/odf6ott.png create mode 100644 docs/icons/p.gif create mode 100644 docs/icons/p.png create mode 100644 docs/icons/patch.gif create mode 100644 docs/icons/patch.png create mode 100644 docs/icons/pdf.gif create mode 100644 docs/icons/pdf.png create mode 100644 docs/icons/pie0.gif create mode 100644 docs/icons/pie0.png create mode 100644 docs/icons/pie1.gif create mode 100644 docs/icons/pie1.png create mode 100644 docs/icons/pie2.gif create mode 100644 docs/icons/pie2.png create mode 100644 docs/icons/pie3.gif create mode 100644 docs/icons/pie3.png create mode 100644 docs/icons/pie4.gif create mode 100644 docs/icons/pie4.png create mode 100644 docs/icons/pie5.gif create mode 100644 docs/icons/pie5.png create mode 100644 docs/icons/pie6.gif create mode 100644 docs/icons/pie6.png create mode 100644 docs/icons/pie7.gif create mode 100644 docs/icons/pie7.png create mode 100644 docs/icons/pie8.gif create mode 100644 docs/icons/pie8.png create mode 100644 docs/icons/portal.gif create mode 100644 docs/icons/portal.png create mode 100644 docs/icons/ps.gif create mode 100644 docs/icons/ps.png create mode 100644 docs/icons/quill.gif create mode 100644 docs/icons/quill.png create mode 100644 docs/icons/right.gif create mode 100644 docs/icons/right.png create mode 100644 docs/icons/screw1.gif create mode 100644 docs/icons/screw1.png create mode 100644 docs/icons/screw2.gif create mode 100644 docs/icons/screw2.png create mode 100644 docs/icons/script.gif create mode 100644 docs/icons/script.png create mode 100644 docs/icons/small/back.gif create mode 100644 docs/icons/small/back.png create mode 100644 docs/icons/small/binary.gif create mode 100644 docs/icons/small/binary.png create mode 100644 docs/icons/small/binhex.gif create mode 100644 docs/icons/small/binhex.png create mode 100644 docs/icons/small/blank.gif create mode 100644 docs/icons/small/blank.png create mode 100644 docs/icons/small/broken.gif create mode 100644 docs/icons/small/broken.png create mode 100644 docs/icons/small/burst.gif create mode 100644 docs/icons/small/burst.png create mode 100644 docs/icons/small/comp1.gif create mode 100644 docs/icons/small/comp1.png create mode 100644 docs/icons/small/comp2.gif create mode 100644 docs/icons/small/comp2.png create mode 100644 docs/icons/small/compressed.gif create mode 100644 docs/icons/small/compressed.png create mode 100644 docs/icons/small/continued.gif create mode 100644 docs/icons/small/continued.png create mode 100644 docs/icons/small/doc.gif create mode 100644 docs/icons/small/doc.png create mode 100644 docs/icons/small/folder.gif create mode 100644 docs/icons/small/folder.png create mode 100644 docs/icons/small/folder2.gif create mode 100644 docs/icons/small/folder2.png create mode 100644 docs/icons/small/forward.gif create mode 100644 docs/icons/small/forward.png create mode 100644 docs/icons/small/generic.gif create mode 100644 docs/icons/small/generic.png create mode 100644 docs/icons/small/generic2.gif create mode 100644 docs/icons/small/generic2.png create mode 100644 docs/icons/small/generic3.gif create mode 100644 docs/icons/small/generic3.png create mode 100644 docs/icons/small/image.gif create mode 100644 docs/icons/small/image.png create mode 100644 docs/icons/small/image2.gif create mode 100644 docs/icons/small/image2.png create mode 100644 docs/icons/small/index.gif create mode 100644 docs/icons/small/index.png create mode 100644 docs/icons/small/key.gif create mode 100644 docs/icons/small/key.png create mode 100644 docs/icons/small/movie.gif create mode 100644 docs/icons/small/movie.png create mode 100644 docs/icons/small/patch.gif create mode 100644 docs/icons/small/patch.png create mode 100644 docs/icons/small/ps.gif create mode 100644 docs/icons/small/ps.png create mode 100644 docs/icons/small/rainbow.gif create mode 100644 docs/icons/small/rainbow.png create mode 100644 docs/icons/small/sound.gif create mode 100644 docs/icons/small/sound.png create mode 100644 docs/icons/small/sound2.gif create mode 100644 docs/icons/small/sound2.png create mode 100644 docs/icons/small/tar.gif create mode 100644 docs/icons/small/tar.png create mode 100644 docs/icons/small/text.gif create mode 100644 docs/icons/small/text.png create mode 100644 docs/icons/small/transfer.gif create mode 100644 docs/icons/small/transfer.png create mode 100644 docs/icons/small/unknown.gif create mode 100644 docs/icons/small/unknown.png create mode 100644 docs/icons/small/uu.gif create mode 100644 docs/icons/small/uu.png create mode 100644 docs/icons/sound1.gif create mode 100644 docs/icons/sound1.png create mode 100644 docs/icons/sound2.gif create mode 100644 docs/icons/sound2.png create mode 100644 docs/icons/sphere1.gif create mode 100644 docs/icons/sphere1.png create mode 100644 docs/icons/sphere2.gif create mode 100644 docs/icons/sphere2.png create mode 100644 docs/icons/svg.png create mode 100644 docs/icons/tar.gif create mode 100644 docs/icons/tar.png create mode 100644 docs/icons/tex.gif create mode 100644 docs/icons/tex.png create mode 100644 docs/icons/text.gif create mode 100644 docs/icons/text.png create mode 100644 docs/icons/transfer.gif create mode 100644 docs/icons/transfer.png create mode 100644 docs/icons/unknown.gif create mode 100644 docs/icons/unknown.png create mode 100644 docs/icons/up.gif create mode 100644 docs/icons/up.png create mode 100644 docs/icons/uu.gif create mode 100644 docs/icons/uu.png create mode 100644 docs/icons/uuencoded.gif create mode 100644 docs/icons/uuencoded.png create mode 100644 docs/icons/world1.gif create mode 100644 docs/icons/world1.png create mode 100644 docs/icons/world2.gif create mode 100644 docs/icons/world2.png create mode 100644 docs/icons/xml.png create mode 100644 docs/man/ab.1 create mode 100644 docs/man/apachectl.8 create mode 100644 docs/man/apxs.1 create mode 100644 docs/man/dbmmanage.1 create mode 100644 docs/man/fcgistarter.8 create mode 100644 docs/man/htcacheclean.8 create mode 100644 docs/man/htdbm.1 create mode 100644 docs/man/htdigest.1 create mode 100644 docs/man/htpasswd.1 create mode 100644 docs/man/httpd.8 create mode 100644 docs/man/httxt2dbm.1 create mode 100644 docs/man/logresolve.1 create mode 100644 docs/man/rotatelogs.8 create mode 100644 docs/man/suexec.8 create mode 100644 docs/man/tr/ab.1 create mode 100644 docs/man/tr/apachectl.8 create mode 100644 docs/man/tr/apxs.1 create mode 100644 docs/man/tr/dbmmanage.1 create mode 100644 docs/man/tr/fcgistarter.8 create mode 100644 docs/man/tr/htcacheclean.8 create mode 100644 docs/man/tr/htdbm.1 create mode 100644 docs/man/tr/htdigest.1 create mode 100644 docs/man/tr/htpasswd.1 create mode 100644 docs/man/tr/httpd.8 create mode 100644 docs/man/tr/httxt2dbm.1 create mode 100644 docs/man/tr/logresolve.1 create mode 100644 docs/man/tr/rotatelogs.8 create mode 100644 docs/man/tr/suexec.8 create mode 100644 docs/manual/BUILDING create mode 100644 docs/manual/LICENSE create mode 100644 docs/manual/bind.html create mode 100644 docs/manual/bind.html.de create mode 100644 docs/manual/bind.html.en create mode 100644 docs/manual/bind.html.fr.utf8 create mode 100644 docs/manual/bind.html.ja.utf8 create mode 100644 docs/manual/bind.html.ko.euc-kr create mode 100644 docs/manual/bind.html.tr.utf8 create mode 100644 docs/manual/caching.html create mode 100644 docs/manual/caching.html.en create mode 100644 docs/manual/caching.html.fr.utf8 create mode 100644 docs/manual/caching.html.tr.utf8 create mode 100644 docs/manual/configuring.html create mode 100644 docs/manual/configuring.html.de create mode 100644 docs/manual/configuring.html.en create mode 100644 docs/manual/configuring.html.fr.utf8 create mode 100644 docs/manual/configuring.html.ja.utf8 create mode 100644 docs/manual/configuring.html.ko.euc-kr create mode 100644 docs/manual/configuring.html.tr.utf8 create mode 100644 docs/manual/content-negotiation.html create mode 100644 docs/manual/content-negotiation.html.en create mode 100644 docs/manual/content-negotiation.html.fr.utf8 create mode 100644 docs/manual/content-negotiation.html.ja.utf8 create mode 100644 docs/manual/content-negotiation.html.ko.euc-kr create mode 100644 docs/manual/content-negotiation.html.tr.utf8 create mode 100644 docs/manual/convenience.map create mode 100644 docs/manual/custom-error.html create mode 100644 docs/manual/custom-error.html.en create mode 100644 docs/manual/custom-error.html.es create mode 100644 docs/manual/custom-error.html.fr.utf8 create mode 100644 docs/manual/custom-error.html.ja.utf8 create mode 100644 docs/manual/custom-error.html.ko.euc-kr create mode 100644 docs/manual/custom-error.html.tr.utf8 create mode 100644 docs/manual/developer/API.html create mode 100644 docs/manual/developer/API.html.en create mode 100644 docs/manual/developer/debugging.html create mode 100644 docs/manual/developer/debugging.html.en create mode 100644 docs/manual/developer/documenting.html create mode 100644 docs/manual/developer/documenting.html.en create mode 100644 docs/manual/developer/documenting.html.zh-cn.utf8 create mode 100644 docs/manual/developer/filters.html create mode 100644 docs/manual/developer/filters.html.en create mode 100644 docs/manual/developer/hooks.html create mode 100644 docs/manual/developer/hooks.html.en create mode 100644 docs/manual/developer/index.html create mode 100644 docs/manual/developer/index.html.en create mode 100644 docs/manual/developer/index.html.zh-cn.utf8 create mode 100644 docs/manual/developer/modguide.html create mode 100644 docs/manual/developer/modguide.html.en create mode 100644 docs/manual/developer/modules.html create mode 100644 docs/manual/developer/modules.html.en create mode 100644 docs/manual/developer/modules.html.ja.utf8 create mode 100644 docs/manual/developer/new_api_2_4.html create mode 100644 docs/manual/developer/new_api_2_4.html.en create mode 100644 docs/manual/developer/output-filters.html create mode 100644 docs/manual/developer/output-filters.html.en create mode 100644 docs/manual/developer/request.html create mode 100644 docs/manual/developer/request.html.en create mode 100644 docs/manual/developer/thread_safety.html create mode 100644 docs/manual/developer/thread_safety.html.en create mode 100644 docs/manual/dns-caveats.html create mode 100644 docs/manual/dns-caveats.html.en create mode 100644 docs/manual/dns-caveats.html.fr.utf8 create mode 100644 docs/manual/dns-caveats.html.ja.utf8 create mode 100644 docs/manual/dns-caveats.html.ko.euc-kr create mode 100644 docs/manual/dns-caveats.html.tr.utf8 create mode 100644 docs/manual/dso.html create mode 100644 docs/manual/dso.html.en create mode 100644 docs/manual/dso.html.fr.utf8 create mode 100644 docs/manual/dso.html.ja.utf8 create mode 100644 docs/manual/dso.html.ko.euc-kr create mode 100644 docs/manual/dso.html.tr.utf8 create mode 100644 docs/manual/env.html create mode 100644 docs/manual/env.html.en create mode 100644 docs/manual/env.html.fr.utf8 create mode 100644 docs/manual/env.html.ja.utf8 create mode 100644 docs/manual/env.html.ko.euc-kr create mode 100644 docs/manual/env.html.tr.utf8 create mode 100644 docs/manual/expr.html create mode 100644 docs/manual/expr.html.en create mode 100644 docs/manual/expr.html.fr.utf8 create mode 100644 docs/manual/faq/index.html create mode 100644 docs/manual/faq/index.html.en create mode 100644 docs/manual/faq/index.html.es create mode 100644 docs/manual/faq/index.html.fr.utf8 create mode 100644 docs/manual/faq/index.html.tr.utf8 create mode 100644 docs/manual/faq/index.html.zh-cn.utf8 create mode 100644 docs/manual/filter.html create mode 100644 docs/manual/filter.html.en create mode 100644 docs/manual/filter.html.es create mode 100644 docs/manual/filter.html.fr.utf8 create mode 100644 docs/manual/filter.html.ja.utf8 create mode 100644 docs/manual/filter.html.ko.euc-kr create mode 100644 docs/manual/filter.html.tr.utf8 create mode 100644 docs/manual/getting-started.html create mode 100644 docs/manual/getting-started.html.en create mode 100644 docs/manual/getting-started.html.fr.utf8 create mode 100644 docs/manual/getting-started.html.ru.utf8 create mode 100644 docs/manual/glossary.html create mode 100644 docs/manual/glossary.html.de create mode 100644 docs/manual/glossary.html.en create mode 100644 docs/manual/glossary.html.es create mode 100644 docs/manual/glossary.html.fr.utf8 create mode 100644 docs/manual/glossary.html.ja.utf8 create mode 100644 docs/manual/glossary.html.ko.euc-kr create mode 100644 docs/manual/glossary.html.tr.utf8 create mode 100644 docs/manual/handler.html create mode 100644 docs/manual/handler.html.en create mode 100644 docs/manual/handler.html.es create mode 100644 docs/manual/handler.html.fr.utf8 create mode 100644 docs/manual/handler.html.ja.utf8 create mode 100644 docs/manual/handler.html.ko.euc-kr create mode 100644 docs/manual/handler.html.tr.utf8 create mode 100644 docs/manual/handler.html.zh-cn.utf8 create mode 100644 docs/manual/howto/access.html create mode 100644 docs/manual/howto/access.html.en create mode 100644 docs/manual/howto/access.html.es create mode 100644 docs/manual/howto/access.html.fr.utf8 create mode 100644 docs/manual/howto/auth.html create mode 100644 docs/manual/howto/auth.html.en create mode 100644 docs/manual/howto/auth.html.es create mode 100644 docs/manual/howto/auth.html.fr.utf8 create mode 100644 docs/manual/howto/auth.html.ja.utf8 create mode 100644 docs/manual/howto/auth.html.ko.euc-kr create mode 100644 docs/manual/howto/auth.html.tr.utf8 create mode 100644 docs/manual/howto/cgi.html create mode 100644 docs/manual/howto/cgi.html.en create mode 100644 docs/manual/howto/cgi.html.es create mode 100644 docs/manual/howto/cgi.html.fr.utf8 create mode 100644 docs/manual/howto/cgi.html.ja.utf8 create mode 100644 docs/manual/howto/cgi.html.ko.euc-kr create mode 100644 docs/manual/howto/htaccess.html create mode 100644 docs/manual/howto/htaccess.html.en create mode 100644 docs/manual/howto/htaccess.html.es create mode 100644 docs/manual/howto/htaccess.html.fr.utf8 create mode 100644 docs/manual/howto/htaccess.html.ja.utf8 create mode 100644 docs/manual/howto/htaccess.html.ko.euc-kr create mode 100644 docs/manual/howto/htaccess.html.pt-br create mode 100644 docs/manual/howto/http2.html create mode 100644 docs/manual/howto/http2.html.en create mode 100644 docs/manual/howto/http2.html.es create mode 100644 docs/manual/howto/http2.html.fr.utf8 create mode 100644 docs/manual/howto/index.html create mode 100644 docs/manual/howto/index.html.en create mode 100644 docs/manual/howto/index.html.es create mode 100644 docs/manual/howto/index.html.fr.utf8 create mode 100644 docs/manual/howto/index.html.ja.utf8 create mode 100644 docs/manual/howto/index.html.ko.euc-kr create mode 100644 docs/manual/howto/index.html.zh-cn.utf8 create mode 100644 docs/manual/howto/public_html.html create mode 100644 docs/manual/howto/public_html.html.en create mode 100644 docs/manual/howto/public_html.html.es create mode 100644 docs/manual/howto/public_html.html.fr.utf8 create mode 100644 docs/manual/howto/public_html.html.ja.utf8 create mode 100644 docs/manual/howto/public_html.html.ko.euc-kr create mode 100644 docs/manual/howto/public_html.html.tr.utf8 create mode 100644 docs/manual/howto/reverse_proxy.html create mode 100644 docs/manual/howto/reverse_proxy.html.en create mode 100644 docs/manual/howto/reverse_proxy.html.fr.utf8 create mode 100644 docs/manual/howto/ssi.html create mode 100644 docs/manual/howto/ssi.html.en create mode 100644 docs/manual/howto/ssi.html.es create mode 100644 docs/manual/howto/ssi.html.fr.utf8 create mode 100644 docs/manual/howto/ssi.html.ja.utf8 create mode 100644 docs/manual/howto/ssi.html.ko.euc-kr create mode 100644 docs/manual/images/apache_header.gif create mode 100644 docs/manual/images/bal-man-b.png create mode 100644 docs/manual/images/bal-man-w.png create mode 100644 docs/manual/images/bal-man.png create mode 100644 docs/manual/images/build_a_mod_2.png create mode 100644 docs/manual/images/build_a_mod_3.png create mode 100644 docs/manual/images/build_a_mod_4.png create mode 100644 docs/manual/images/caching_fig1.gif create mode 100644 docs/manual/images/caching_fig1.png create mode 100644 docs/manual/images/caching_fig1.tr.png create mode 100644 docs/manual/images/custom_errordocs.png create mode 100644 docs/manual/images/down.gif create mode 100644 docs/manual/images/favicon.ico create mode 100644 docs/manual/images/feather.gif create mode 100644 docs/manual/images/feather.png create mode 100644 docs/manual/images/filter_arch.png create mode 100644 docs/manual/images/filter_arch.tr.png create mode 100644 docs/manual/images/home.gif create mode 100644 docs/manual/images/index.gif create mode 100644 docs/manual/images/left.gif create mode 100644 docs/manual/images/mod_filter_new.gif create mode 100644 docs/manual/images/mod_filter_new.png create mode 100644 docs/manual/images/mod_filter_new.tr.png create mode 100644 docs/manual/images/mod_filter_old.gif create mode 100644 docs/manual/images/mod_filter_old.png create mode 100644 docs/manual/images/mod_rewrite_fig1.gif create mode 100644 docs/manual/images/mod_rewrite_fig1.png create mode 100644 docs/manual/images/mod_rewrite_fig2.gif create mode 100644 docs/manual/images/mod_rewrite_fig2.png create mode 100644 docs/manual/images/pixel.gif create mode 100644 docs/manual/images/reverse-proxy-arch.png create mode 100644 docs/manual/images/rewrite_backreferences.png create mode 100644 docs/manual/images/rewrite_process_uri.png create mode 100644 docs/manual/images/rewrite_rule_flow.png create mode 100644 docs/manual/images/right.gif create mode 100644 docs/manual/images/ssl_intro_fig1.gif create mode 100644 docs/manual/images/ssl_intro_fig1.png create mode 100644 docs/manual/images/ssl_intro_fig2.gif create mode 100644 docs/manual/images/ssl_intro_fig2.png create mode 100644 docs/manual/images/ssl_intro_fig3.gif create mode 100644 docs/manual/images/ssl_intro_fig3.png create mode 100644 docs/manual/images/sub.gif create mode 100644 docs/manual/images/syntax_rewritecond.png create mode 100644 docs/manual/images/syntax_rewriterule.png create mode 100644 docs/manual/images/up.gif create mode 100644 docs/manual/index.html create mode 100644 docs/manual/index.html.da create mode 100644 docs/manual/index.html.de create mode 100644 docs/manual/index.html.en create mode 100644 docs/manual/index.html.es create mode 100644 docs/manual/index.html.fr.utf8 create mode 100644 docs/manual/index.html.ja.utf8 create mode 100644 docs/manual/index.html.ko.euc-kr create mode 100644 docs/manual/index.html.pt-br create mode 100644 docs/manual/index.html.ru.utf8 create mode 100644 docs/manual/index.html.tr.utf8 create mode 100644 docs/manual/index.html.zh-cn.utf8 create mode 100644 docs/manual/install.html create mode 100644 docs/manual/install.html.de create mode 100644 docs/manual/install.html.en create mode 100644 docs/manual/install.html.es create mode 100644 docs/manual/install.html.fr.utf8 create mode 100644 docs/manual/install.html.ja.utf8 create mode 100644 docs/manual/install.html.ko.euc-kr create mode 100644 docs/manual/install.html.tr.utf8 create mode 100644 docs/manual/invoking.html create mode 100644 docs/manual/invoking.html.de create mode 100644 docs/manual/invoking.html.en create mode 100644 docs/manual/invoking.html.es create mode 100644 docs/manual/invoking.html.fr.utf8 create mode 100644 docs/manual/invoking.html.ja.utf8 create mode 100644 docs/manual/invoking.html.ko.euc-kr create mode 100644 docs/manual/invoking.html.tr.utf8 create mode 100644 docs/manual/license.html create mode 100644 docs/manual/license.html.en create mode 100644 docs/manual/logs.html create mode 100644 docs/manual/logs.html.en create mode 100644 docs/manual/logs.html.fr.utf8 create mode 100644 docs/manual/logs.html.ja.utf8 create mode 100644 docs/manual/logs.html.ko.euc-kr create mode 100644 docs/manual/logs.html.tr.utf8 create mode 100644 docs/manual/misc/index.html create mode 100644 docs/manual/misc/index.html.en create mode 100644 docs/manual/misc/index.html.es create mode 100644 docs/manual/misc/index.html.fr.utf8 create mode 100644 docs/manual/misc/index.html.ko.euc-kr create mode 100644 docs/manual/misc/index.html.tr.utf8 create mode 100644 docs/manual/misc/index.html.zh-cn.utf8 create mode 100644 docs/manual/misc/password_encryptions.html create mode 100644 docs/manual/misc/password_encryptions.html.en create mode 100644 docs/manual/misc/password_encryptions.html.fr.utf8 create mode 100644 docs/manual/misc/perf-tuning.html create mode 100644 docs/manual/misc/perf-tuning.html.en create mode 100644 docs/manual/misc/perf-tuning.html.fr.utf8 create mode 100644 docs/manual/misc/perf-tuning.html.ko.euc-kr create mode 100644 docs/manual/misc/perf-tuning.html.tr.utf8 create mode 100644 docs/manual/misc/relevant_standards.html create mode 100644 docs/manual/misc/relevant_standards.html.en create mode 100644 docs/manual/misc/relevant_standards.html.fr.utf8 create mode 100644 docs/manual/misc/relevant_standards.html.ko.euc-kr create mode 100644 docs/manual/misc/security_tips.html create mode 100644 docs/manual/misc/security_tips.html.en create mode 100644 docs/manual/misc/security_tips.html.fr.utf8 create mode 100644 docs/manual/misc/security_tips.html.ko.euc-kr create mode 100644 docs/manual/misc/security_tips.html.tr.utf8 create mode 100644 docs/manual/mod/core.html create mode 100644 docs/manual/mod/core.html.de create mode 100644 docs/manual/mod/core.html.en create mode 100644 docs/manual/mod/core.html.es create mode 100644 docs/manual/mod/core.html.fr.utf8 create mode 100644 docs/manual/mod/core.html.ja.utf8 create mode 100644 docs/manual/mod/core.html.tr.utf8 create mode 100644 docs/manual/mod/directive-dict.html create mode 100644 docs/manual/mod/directive-dict.html.en create mode 100644 docs/manual/mod/directive-dict.html.es create mode 100644 docs/manual/mod/directive-dict.html.fr.utf8 create mode 100644 docs/manual/mod/directive-dict.html.ja.utf8 create mode 100644 docs/manual/mod/directive-dict.html.ko.euc-kr create mode 100644 docs/manual/mod/directive-dict.html.tr.utf8 create mode 100644 docs/manual/mod/directives.html create mode 100644 docs/manual/mod/directives.html.de create mode 100644 docs/manual/mod/directives.html.en create mode 100644 docs/manual/mod/directives.html.es create mode 100644 docs/manual/mod/directives.html.fr.utf8 create mode 100644 docs/manual/mod/directives.html.ja.utf8 create mode 100644 docs/manual/mod/directives.html.ko.euc-kr create mode 100644 docs/manual/mod/directives.html.tr.utf8 create mode 100644 docs/manual/mod/directives.html.zh-cn.utf8 create mode 100644 docs/manual/mod/event.html create mode 100644 docs/manual/mod/event.html.en create mode 100644 docs/manual/mod/event.html.fr.utf8 create mode 100644 docs/manual/mod/index.html create mode 100644 docs/manual/mod/index.html.de create mode 100644 docs/manual/mod/index.html.en create mode 100644 docs/manual/mod/index.html.es create mode 100644 docs/manual/mod/index.html.fr.utf8 create mode 100644 docs/manual/mod/index.html.ja.utf8 create mode 100644 docs/manual/mod/index.html.ko.euc-kr create mode 100644 docs/manual/mod/index.html.tr.utf8 create mode 100644 docs/manual/mod/index.html.zh-cn.utf8 create mode 100644 docs/manual/mod/mod_access_compat.html create mode 100644 docs/manual/mod/mod_access_compat.html.en create mode 100644 docs/manual/mod/mod_access_compat.html.fr.utf8 create mode 100644 docs/manual/mod/mod_access_compat.html.ja.utf8 create mode 100644 docs/manual/mod/mod_actions.html create mode 100644 docs/manual/mod/mod_actions.html.de create mode 100644 docs/manual/mod/mod_actions.html.en create mode 100644 docs/manual/mod/mod_actions.html.fr.utf8 create mode 100644 docs/manual/mod/mod_actions.html.ja.utf8 create mode 100644 docs/manual/mod/mod_actions.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_alias.html create mode 100644 docs/manual/mod/mod_alias.html.en create mode 100644 docs/manual/mod/mod_alias.html.fr.utf8 create mode 100644 docs/manual/mod/mod_alias.html.ja.utf8 create mode 100644 docs/manual/mod/mod_alias.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_alias.html.tr.utf8 create mode 100644 docs/manual/mod/mod_allowmethods.html create mode 100644 docs/manual/mod/mod_allowmethods.html.en create mode 100644 docs/manual/mod/mod_allowmethods.html.fr.utf8 create mode 100644 docs/manual/mod/mod_asis.html create mode 100644 docs/manual/mod/mod_asis.html.en create mode 100644 docs/manual/mod/mod_asis.html.fr.utf8 create mode 100644 docs/manual/mod/mod_asis.html.ja.utf8 create mode 100644 docs/manual/mod/mod_asis.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_auth_basic.html create mode 100644 docs/manual/mod/mod_auth_basic.html.en create mode 100644 docs/manual/mod/mod_auth_basic.html.fr.utf8 create mode 100644 docs/manual/mod/mod_auth_basic.html.ja.utf8 create mode 100644 docs/manual/mod/mod_auth_basic.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_auth_digest.html create mode 100644 docs/manual/mod/mod_auth_digest.html.en create mode 100644 docs/manual/mod/mod_auth_digest.html.fr.utf8 create mode 100644 docs/manual/mod/mod_auth_digest.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_auth_form.html create mode 100644 docs/manual/mod/mod_auth_form.html.en create mode 100644 docs/manual/mod/mod_auth_form.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authn_anon.html create mode 100644 docs/manual/mod/mod_authn_anon.html.en create mode 100644 docs/manual/mod/mod_authn_anon.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authn_anon.html.ja.utf8 create mode 100644 docs/manual/mod/mod_authn_anon.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_authn_core.html create mode 100644 docs/manual/mod/mod_authn_core.html.en create mode 100644 docs/manual/mod/mod_authn_core.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authn_dbd.html create mode 100644 docs/manual/mod/mod_authn_dbd.html.en create mode 100644 docs/manual/mod/mod_authn_dbd.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authn_dbm.html create mode 100644 docs/manual/mod/mod_authn_dbm.html.en create mode 100644 docs/manual/mod/mod_authn_dbm.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authn_dbm.html.ja.utf8 create mode 100644 docs/manual/mod/mod_authn_dbm.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_authn_file.html create mode 100644 docs/manual/mod/mod_authn_file.html.en create mode 100644 docs/manual/mod/mod_authn_file.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authn_file.html.ja.utf8 create mode 100644 docs/manual/mod/mod_authn_file.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_authn_socache.html create mode 100644 docs/manual/mod/mod_authn_socache.html.en create mode 100644 docs/manual/mod/mod_authn_socache.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authnz_fcgi.html create mode 100644 docs/manual/mod/mod_authnz_fcgi.html.en create mode 100644 docs/manual/mod/mod_authnz_fcgi.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authnz_ldap.html create mode 100644 docs/manual/mod/mod_authnz_ldap.html.en create mode 100644 docs/manual/mod/mod_authnz_ldap.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authz_core.html create mode 100644 docs/manual/mod/mod_authz_core.html.en create mode 100644 docs/manual/mod/mod_authz_core.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authz_dbd.html create mode 100644 docs/manual/mod/mod_authz_dbd.html.en create mode 100644 docs/manual/mod/mod_authz_dbd.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authz_dbm.html create mode 100644 docs/manual/mod/mod_authz_dbm.html.en create mode 100644 docs/manual/mod/mod_authz_dbm.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authz_dbm.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_authz_groupfile.html create mode 100644 docs/manual/mod/mod_authz_groupfile.html.en create mode 100644 docs/manual/mod/mod_authz_groupfile.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authz_groupfile.html.ja.utf8 create mode 100644 docs/manual/mod/mod_authz_groupfile.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_authz_host.html create mode 100644 docs/manual/mod/mod_authz_host.html.en create mode 100644 docs/manual/mod/mod_authz_host.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authz_owner.html create mode 100644 docs/manual/mod/mod_authz_owner.html.en create mode 100644 docs/manual/mod/mod_authz_owner.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authz_owner.html.ja.utf8 create mode 100644 docs/manual/mod/mod_authz_owner.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_authz_user.html create mode 100644 docs/manual/mod/mod_authz_user.html.en create mode 100644 docs/manual/mod/mod_authz_user.html.fr.utf8 create mode 100644 docs/manual/mod/mod_authz_user.html.ja.utf8 create mode 100644 docs/manual/mod/mod_authz_user.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_autoindex.html create mode 100644 docs/manual/mod/mod_autoindex.html.en create mode 100644 docs/manual/mod/mod_autoindex.html.fr.utf8 create mode 100644 docs/manual/mod/mod_autoindex.html.ja.utf8 create mode 100644 docs/manual/mod/mod_autoindex.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_autoindex.html.tr.utf8 create mode 100644 docs/manual/mod/mod_brotli.html create mode 100644 docs/manual/mod/mod_brotli.html.en create mode 100644 docs/manual/mod/mod_brotli.html.fr.utf8 create mode 100644 docs/manual/mod/mod_buffer.html create mode 100644 docs/manual/mod/mod_buffer.html.en create mode 100644 docs/manual/mod/mod_buffer.html.fr.utf8 create mode 100644 docs/manual/mod/mod_cache.html create mode 100644 docs/manual/mod/mod_cache.html.en create mode 100644 docs/manual/mod/mod_cache.html.fr.utf8 create mode 100644 docs/manual/mod/mod_cache.html.ja.utf8 create mode 100644 docs/manual/mod/mod_cache.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_cache_disk.html create mode 100644 docs/manual/mod/mod_cache_disk.html.en create mode 100644 docs/manual/mod/mod_cache_disk.html.fr.utf8 create mode 100644 docs/manual/mod/mod_cache_disk.html.ja.utf8 create mode 100644 docs/manual/mod/mod_cache_disk.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_cache_socache.html create mode 100644 docs/manual/mod/mod_cache_socache.html.en create mode 100644 docs/manual/mod/mod_cache_socache.html.fr.utf8 create mode 100644 docs/manual/mod/mod_cern_meta.html create mode 100644 docs/manual/mod/mod_cern_meta.html.en create mode 100644 docs/manual/mod/mod_cern_meta.html.fr.utf8 create mode 100644 docs/manual/mod/mod_cern_meta.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_cgi.html create mode 100644 docs/manual/mod/mod_cgi.html.en create mode 100644 docs/manual/mod/mod_cgi.html.fr.utf8 create mode 100644 docs/manual/mod/mod_cgi.html.ja.utf8 create mode 100644 docs/manual/mod/mod_cgi.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_cgid.html create mode 100644 docs/manual/mod/mod_cgid.html.en create mode 100644 docs/manual/mod/mod_cgid.html.fr.utf8 create mode 100644 docs/manual/mod/mod_cgid.html.ja.utf8 create mode 100644 docs/manual/mod/mod_cgid.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_charset_lite.html create mode 100644 docs/manual/mod/mod_charset_lite.html.en create mode 100644 docs/manual/mod/mod_charset_lite.html.fr.utf8 create mode 100644 docs/manual/mod/mod_charset_lite.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_data.html create mode 100644 docs/manual/mod/mod_data.html.en create mode 100644 docs/manual/mod/mod_data.html.fr.utf8 create mode 100644 docs/manual/mod/mod_dav.html create mode 100644 docs/manual/mod/mod_dav.html.en create mode 100644 docs/manual/mod/mod_dav.html.fr.utf8 create mode 100644 docs/manual/mod/mod_dav.html.ja.utf8 create mode 100644 docs/manual/mod/mod_dav.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_dav_fs.html create mode 100644 docs/manual/mod/mod_dav_fs.html.en create mode 100644 docs/manual/mod/mod_dav_fs.html.fr.utf8 create mode 100644 docs/manual/mod/mod_dav_fs.html.ja.utf8 create mode 100644 docs/manual/mod/mod_dav_fs.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_dav_lock.html create mode 100644 docs/manual/mod/mod_dav_lock.html.en create mode 100644 docs/manual/mod/mod_dav_lock.html.fr.utf8 create mode 100644 docs/manual/mod/mod_dav_lock.html.ja.utf8 create mode 100644 docs/manual/mod/mod_dbd.html create mode 100644 docs/manual/mod/mod_dbd.html.en create mode 100644 docs/manual/mod/mod_dbd.html.fr.utf8 create mode 100644 docs/manual/mod/mod_deflate.html create mode 100644 docs/manual/mod/mod_deflate.html.en create mode 100644 docs/manual/mod/mod_deflate.html.fr.utf8 create mode 100644 docs/manual/mod/mod_deflate.html.ja.utf8 create mode 100644 docs/manual/mod/mod_deflate.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_dialup.html create mode 100644 docs/manual/mod/mod_dialup.html.en create mode 100644 docs/manual/mod/mod_dialup.html.fr.utf8 create mode 100644 docs/manual/mod/mod_dir.html create mode 100644 docs/manual/mod/mod_dir.html.en create mode 100644 docs/manual/mod/mod_dir.html.fr.utf8 create mode 100644 docs/manual/mod/mod_dir.html.ja.utf8 create mode 100644 docs/manual/mod/mod_dir.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_dir.html.tr.utf8 create mode 100644 docs/manual/mod/mod_dumpio.html create mode 100644 docs/manual/mod/mod_dumpio.html.en create mode 100644 docs/manual/mod/mod_dumpio.html.fr.utf8 create mode 100644 docs/manual/mod/mod_dumpio.html.ja.utf8 create mode 100644 docs/manual/mod/mod_echo.html create mode 100644 docs/manual/mod/mod_echo.html.en create mode 100644 docs/manual/mod/mod_echo.html.fr.utf8 create mode 100644 docs/manual/mod/mod_echo.html.ja.utf8 create mode 100644 docs/manual/mod/mod_echo.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_env.html create mode 100644 docs/manual/mod/mod_env.html.en create mode 100644 docs/manual/mod/mod_env.html.fr.utf8 create mode 100644 docs/manual/mod/mod_env.html.ja.utf8 create mode 100644 docs/manual/mod/mod_env.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_env.html.tr.utf8 create mode 100644 docs/manual/mod/mod_example_hooks.html create mode 100644 docs/manual/mod/mod_example_hooks.html.en create mode 100644 docs/manual/mod/mod_example_hooks.html.fr.utf8 create mode 100644 docs/manual/mod/mod_example_hooks.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_expires.html create mode 100644 docs/manual/mod/mod_expires.html.en create mode 100644 docs/manual/mod/mod_expires.html.fr.utf8 create mode 100644 docs/manual/mod/mod_expires.html.ja.utf8 create mode 100644 docs/manual/mod/mod_expires.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_ext_filter.html create mode 100644 docs/manual/mod/mod_ext_filter.html.en create mode 100644 docs/manual/mod/mod_ext_filter.html.fr.utf8 create mode 100644 docs/manual/mod/mod_ext_filter.html.ja.utf8 create mode 100644 docs/manual/mod/mod_ext_filter.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_file_cache.html create mode 100644 docs/manual/mod/mod_file_cache.html.en create mode 100644 docs/manual/mod/mod_file_cache.html.fr.utf8 create mode 100644 docs/manual/mod/mod_file_cache.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_filter.html create mode 100644 docs/manual/mod/mod_filter.html.en create mode 100644 docs/manual/mod/mod_filter.html.fr.utf8 create mode 100644 docs/manual/mod/mod_headers.html create mode 100644 docs/manual/mod/mod_headers.html.en create mode 100644 docs/manual/mod/mod_headers.html.fr.utf8 create mode 100644 docs/manual/mod/mod_headers.html.ja.utf8 create mode 100644 docs/manual/mod/mod_headers.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_heartbeat.html create mode 100644 docs/manual/mod/mod_heartbeat.html.en create mode 100644 docs/manual/mod/mod_heartbeat.html.fr.utf8 create mode 100644 docs/manual/mod/mod_heartmonitor.html create mode 100644 docs/manual/mod/mod_heartmonitor.html.en create mode 100644 docs/manual/mod/mod_heartmonitor.html.fr.utf8 create mode 100644 docs/manual/mod/mod_http2.html create mode 100644 docs/manual/mod/mod_http2.html.en create mode 100644 docs/manual/mod/mod_http2.html.fr.utf8 create mode 100644 docs/manual/mod/mod_ident.html create mode 100644 docs/manual/mod/mod_ident.html.en create mode 100644 docs/manual/mod/mod_ident.html.fr.utf8 create mode 100644 docs/manual/mod/mod_ident.html.ja.utf8 create mode 100644 docs/manual/mod/mod_ident.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_imagemap.html create mode 100644 docs/manual/mod/mod_imagemap.html.en create mode 100644 docs/manual/mod/mod_imagemap.html.fr.utf8 create mode 100644 docs/manual/mod/mod_imagemap.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_include.html create mode 100644 docs/manual/mod/mod_include.html.en create mode 100644 docs/manual/mod/mod_include.html.fr.utf8 create mode 100644 docs/manual/mod/mod_include.html.ja.utf8 create mode 100644 docs/manual/mod/mod_info.html create mode 100644 docs/manual/mod/mod_info.html.en create mode 100644 docs/manual/mod/mod_info.html.fr.utf8 create mode 100644 docs/manual/mod/mod_info.html.ja.utf8 create mode 100644 docs/manual/mod/mod_info.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_isapi.html create mode 100644 docs/manual/mod/mod_isapi.html.en create mode 100644 docs/manual/mod/mod_isapi.html.fr.utf8 create mode 100644 docs/manual/mod/mod_isapi.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_lbmethod_bybusyness.html create mode 100644 docs/manual/mod/mod_lbmethod_bybusyness.html.en create mode 100644 docs/manual/mod/mod_lbmethod_bybusyness.html.fr.utf8 create mode 100644 docs/manual/mod/mod_lbmethod_byrequests.html create mode 100644 docs/manual/mod/mod_lbmethod_byrequests.html.en create mode 100644 docs/manual/mod/mod_lbmethod_byrequests.html.fr.utf8 create mode 100644 docs/manual/mod/mod_lbmethod_bytraffic.html create mode 100644 docs/manual/mod/mod_lbmethod_bytraffic.html.en create mode 100644 docs/manual/mod/mod_lbmethod_bytraffic.html.fr.utf8 create mode 100644 docs/manual/mod/mod_lbmethod_heartbeat.html create mode 100644 docs/manual/mod/mod_lbmethod_heartbeat.html.en create mode 100644 docs/manual/mod/mod_lbmethod_heartbeat.html.fr.utf8 create mode 100644 docs/manual/mod/mod_ldap.html create mode 100644 docs/manual/mod/mod_ldap.html.en create mode 100644 docs/manual/mod/mod_ldap.html.fr.utf8 create mode 100644 docs/manual/mod/mod_log_config.html create mode 100644 docs/manual/mod/mod_log_config.html.en create mode 100644 docs/manual/mod/mod_log_config.html.fr.utf8 create mode 100644 docs/manual/mod/mod_log_config.html.ja.utf8 create mode 100644 docs/manual/mod/mod_log_config.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_log_config.html.tr.utf8 create mode 100644 docs/manual/mod/mod_log_debug.html create mode 100644 docs/manual/mod/mod_log_debug.html.en create mode 100644 docs/manual/mod/mod_log_debug.html.fr.utf8 create mode 100644 docs/manual/mod/mod_log_forensic.html create mode 100644 docs/manual/mod/mod_log_forensic.html.en create mode 100644 docs/manual/mod/mod_log_forensic.html.fr.utf8 create mode 100644 docs/manual/mod/mod_log_forensic.html.ja.utf8 create mode 100644 docs/manual/mod/mod_log_forensic.html.tr.utf8 create mode 100644 docs/manual/mod/mod_logio.html create mode 100644 docs/manual/mod/mod_logio.html.en create mode 100644 docs/manual/mod/mod_logio.html.fr.utf8 create mode 100644 docs/manual/mod/mod_logio.html.ja.utf8 create mode 100644 docs/manual/mod/mod_logio.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_logio.html.tr.utf8 create mode 100644 docs/manual/mod/mod_lua.html create mode 100644 docs/manual/mod/mod_lua.html.en create mode 100644 docs/manual/mod/mod_lua.html.fr.utf8 create mode 100644 docs/manual/mod/mod_macro.html create mode 100644 docs/manual/mod/mod_macro.html.en create mode 100644 docs/manual/mod/mod_macro.html.fr.utf8 create mode 100644 docs/manual/mod/mod_md.html create mode 100644 docs/manual/mod/mod_md.html.en create mode 100644 docs/manual/mod/mod_md.html.fr.utf8 create mode 100644 docs/manual/mod/mod_mime.html create mode 100644 docs/manual/mod/mod_mime.html.en create mode 100644 docs/manual/mod/mod_mime.html.fr.utf8 create mode 100644 docs/manual/mod/mod_mime.html.ja.utf8 create mode 100644 docs/manual/mod/mod_mime_magic.html create mode 100644 docs/manual/mod/mod_mime_magic.html.en create mode 100644 docs/manual/mod/mod_mime_magic.html.fr.utf8 create mode 100644 docs/manual/mod/mod_negotiation.html create mode 100644 docs/manual/mod/mod_negotiation.html.en create mode 100644 docs/manual/mod/mod_negotiation.html.fr.utf8 create mode 100644 docs/manual/mod/mod_negotiation.html.ja.utf8 create mode 100644 docs/manual/mod/mod_nw_ssl.html create mode 100644 docs/manual/mod/mod_nw_ssl.html.en create mode 100644 docs/manual/mod/mod_nw_ssl.html.fr.utf8 create mode 100644 docs/manual/mod/mod_privileges.html create mode 100644 docs/manual/mod/mod_privileges.html.en create mode 100644 docs/manual/mod/mod_privileges.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy.html create mode 100644 docs/manual/mod/mod_proxy.html.en create mode 100644 docs/manual/mod/mod_proxy.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy.html.ja.utf8 create mode 100644 docs/manual/mod/mod_proxy_ajp.html create mode 100644 docs/manual/mod/mod_proxy_ajp.html.en create mode 100644 docs/manual/mod/mod_proxy_ajp.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy_ajp.html.ja.utf8 create mode 100644 docs/manual/mod/mod_proxy_balancer.html create mode 100644 docs/manual/mod/mod_proxy_balancer.html.en create mode 100644 docs/manual/mod/mod_proxy_balancer.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy_balancer.html.ja.utf8 create mode 100644 docs/manual/mod/mod_proxy_connect.html create mode 100644 docs/manual/mod/mod_proxy_connect.html.en create mode 100644 docs/manual/mod/mod_proxy_connect.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy_connect.html.ja.utf8 create mode 100644 docs/manual/mod/mod_proxy_express.html create mode 100644 docs/manual/mod/mod_proxy_express.html.en create mode 100644 docs/manual/mod/mod_proxy_express.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy_fcgi.html create mode 100644 docs/manual/mod/mod_proxy_fcgi.html.en create mode 100644 docs/manual/mod/mod_proxy_fcgi.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy_fdpass.html create mode 100644 docs/manual/mod/mod_proxy_fdpass.html.en create mode 100644 docs/manual/mod/mod_proxy_fdpass.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy_ftp.html create mode 100644 docs/manual/mod/mod_proxy_ftp.html.en create mode 100644 docs/manual/mod/mod_proxy_ftp.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy_hcheck.html create mode 100644 docs/manual/mod/mod_proxy_hcheck.html.en create mode 100644 docs/manual/mod/mod_proxy_hcheck.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy_html.html create mode 100644 docs/manual/mod/mod_proxy_html.html.en create mode 100644 docs/manual/mod/mod_proxy_html.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy_http.html create mode 100644 docs/manual/mod/mod_proxy_http.html.en create mode 100644 docs/manual/mod/mod_proxy_http.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy_http2.html create mode 100644 docs/manual/mod/mod_proxy_http2.html.en create mode 100644 docs/manual/mod/mod_proxy_http2.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy_scgi.html create mode 100644 docs/manual/mod/mod_proxy_scgi.html.en create mode 100644 docs/manual/mod/mod_proxy_scgi.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy_uwsgi.html create mode 100644 docs/manual/mod/mod_proxy_uwsgi.html.en create mode 100644 docs/manual/mod/mod_proxy_uwsgi.html.fr.utf8 create mode 100644 docs/manual/mod/mod_proxy_wstunnel.html create mode 100644 docs/manual/mod/mod_proxy_wstunnel.html.en create mode 100644 docs/manual/mod/mod_proxy_wstunnel.html.fr.utf8 create mode 100644 docs/manual/mod/mod_ratelimit.html create mode 100644 docs/manual/mod/mod_ratelimit.html.en create mode 100644 docs/manual/mod/mod_ratelimit.html.fr.utf8 create mode 100644 docs/manual/mod/mod_reflector.html create mode 100644 docs/manual/mod/mod_reflector.html.en create mode 100644 docs/manual/mod/mod_reflector.html.fr.utf8 create mode 100644 docs/manual/mod/mod_remoteip.html create mode 100644 docs/manual/mod/mod_remoteip.html.en create mode 100644 docs/manual/mod/mod_remoteip.html.fr.utf8 create mode 100644 docs/manual/mod/mod_reqtimeout.html create mode 100644 docs/manual/mod/mod_reqtimeout.html.en create mode 100644 docs/manual/mod/mod_reqtimeout.html.fr.utf8 create mode 100644 docs/manual/mod/mod_request.html create mode 100644 docs/manual/mod/mod_request.html.en create mode 100644 docs/manual/mod/mod_request.html.fr.utf8 create mode 100644 docs/manual/mod/mod_request.html.tr.utf8 create mode 100644 docs/manual/mod/mod_rewrite.html create mode 100644 docs/manual/mod/mod_rewrite.html.en create mode 100644 docs/manual/mod/mod_rewrite.html.fr.utf8 create mode 100644 docs/manual/mod/mod_sed.html create mode 100644 docs/manual/mod/mod_sed.html.en create mode 100644 docs/manual/mod/mod_sed.html.fr.utf8 create mode 100644 docs/manual/mod/mod_session.html create mode 100644 docs/manual/mod/mod_session.html.en create mode 100644 docs/manual/mod/mod_session.html.fr.utf8 create mode 100644 docs/manual/mod/mod_session_cookie.html create mode 100644 docs/manual/mod/mod_session_cookie.html.en create mode 100644 docs/manual/mod/mod_session_cookie.html.fr.utf8 create mode 100644 docs/manual/mod/mod_session_crypto.html create mode 100644 docs/manual/mod/mod_session_crypto.html.en create mode 100644 docs/manual/mod/mod_session_crypto.html.fr.utf8 create mode 100644 docs/manual/mod/mod_session_dbd.html create mode 100644 docs/manual/mod/mod_session_dbd.html.en create mode 100644 docs/manual/mod/mod_session_dbd.html.fr.utf8 create mode 100644 docs/manual/mod/mod_setenvif.html create mode 100644 docs/manual/mod/mod_setenvif.html.en create mode 100644 docs/manual/mod/mod_setenvif.html.fr.utf8 create mode 100644 docs/manual/mod/mod_setenvif.html.ja.utf8 create mode 100644 docs/manual/mod/mod_setenvif.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_setenvif.html.tr.utf8 create mode 100644 docs/manual/mod/mod_slotmem_plain.html create mode 100644 docs/manual/mod/mod_slotmem_plain.html.en create mode 100644 docs/manual/mod/mod_slotmem_plain.html.fr.utf8 create mode 100644 docs/manual/mod/mod_slotmem_shm.html create mode 100644 docs/manual/mod/mod_slotmem_shm.html.en create mode 100644 docs/manual/mod/mod_slotmem_shm.html.fr.utf8 create mode 100644 docs/manual/mod/mod_so.html create mode 100644 docs/manual/mod/mod_so.html.en create mode 100644 docs/manual/mod/mod_so.html.fr.utf8 create mode 100644 docs/manual/mod/mod_so.html.ja.utf8 create mode 100644 docs/manual/mod/mod_so.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_so.html.tr.utf8 create mode 100644 docs/manual/mod/mod_socache_dbm.html create mode 100644 docs/manual/mod/mod_socache_dbm.html.en create mode 100644 docs/manual/mod/mod_socache_dbm.html.fr.utf8 create mode 100644 docs/manual/mod/mod_socache_dc.html create mode 100644 docs/manual/mod/mod_socache_dc.html.en create mode 100644 docs/manual/mod/mod_socache_dc.html.fr.utf8 create mode 100644 docs/manual/mod/mod_socache_memcache.html create mode 100644 docs/manual/mod/mod_socache_memcache.html.en create mode 100644 docs/manual/mod/mod_socache_memcache.html.fr.utf8 create mode 100644 docs/manual/mod/mod_socache_redis.html create mode 100644 docs/manual/mod/mod_socache_redis.html.en create mode 100644 docs/manual/mod/mod_socache_redis.html.fr.utf8 create mode 100644 docs/manual/mod/mod_socache_shmcb.html create mode 100644 docs/manual/mod/mod_socache_shmcb.html.en create mode 100644 docs/manual/mod/mod_socache_shmcb.html.fr.utf8 create mode 100644 docs/manual/mod/mod_speling.html create mode 100644 docs/manual/mod/mod_speling.html.en create mode 100644 docs/manual/mod/mod_speling.html.fr.utf8 create mode 100644 docs/manual/mod/mod_speling.html.ja.utf8 create mode 100644 docs/manual/mod/mod_speling.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_ssl.html create mode 100644 docs/manual/mod/mod_ssl.html.en create mode 100644 docs/manual/mod/mod_ssl.html.fr.utf8 create mode 100644 docs/manual/mod/mod_status.html create mode 100644 docs/manual/mod/mod_status.html.en create mode 100644 docs/manual/mod/mod_status.html.fr.utf8 create mode 100644 docs/manual/mod/mod_status.html.ja.utf8 create mode 100644 docs/manual/mod/mod_status.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_status.html.tr.utf8 create mode 100644 docs/manual/mod/mod_substitute.html create mode 100644 docs/manual/mod/mod_substitute.html.en create mode 100644 docs/manual/mod/mod_substitute.html.fr.utf8 create mode 100644 docs/manual/mod/mod_suexec.html create mode 100644 docs/manual/mod/mod_suexec.html.en create mode 100644 docs/manual/mod/mod_suexec.html.fr.utf8 create mode 100644 docs/manual/mod/mod_suexec.html.ja.utf8 create mode 100644 docs/manual/mod/mod_suexec.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_suexec.html.tr.utf8 create mode 100644 docs/manual/mod/mod_systemd.html create mode 100644 docs/manual/mod/mod_systemd.html.en create mode 100644 docs/manual/mod/mod_systemd.html.fr.utf8 create mode 100644 docs/manual/mod/mod_unique_id.html create mode 100644 docs/manual/mod/mod_unique_id.html.en create mode 100644 docs/manual/mod/mod_unique_id.html.fr.utf8 create mode 100644 docs/manual/mod/mod_unique_id.html.ja.utf8 create mode 100644 docs/manual/mod/mod_unique_id.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_unixd.html create mode 100644 docs/manual/mod/mod_unixd.html.en create mode 100644 docs/manual/mod/mod_unixd.html.fr.utf8 create mode 100644 docs/manual/mod/mod_unixd.html.tr.utf8 create mode 100644 docs/manual/mod/mod_userdir.html create mode 100644 docs/manual/mod/mod_userdir.html.en create mode 100644 docs/manual/mod/mod_userdir.html.fr.utf8 create mode 100644 docs/manual/mod/mod_userdir.html.ja.utf8 create mode 100644 docs/manual/mod/mod_userdir.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_userdir.html.tr.utf8 create mode 100644 docs/manual/mod/mod_usertrack.html create mode 100644 docs/manual/mod/mod_usertrack.html.en create mode 100644 docs/manual/mod/mod_usertrack.html.fr.utf8 create mode 100644 docs/manual/mod/mod_version.html create mode 100644 docs/manual/mod/mod_version.html.en create mode 100644 docs/manual/mod/mod_version.html.fr.utf8 create mode 100644 docs/manual/mod/mod_version.html.ja.utf8 create mode 100644 docs/manual/mod/mod_version.html.ko.euc-kr create mode 100644 docs/manual/mod/mod_vhost_alias.html create mode 100644 docs/manual/mod/mod_vhost_alias.html.en create mode 100644 docs/manual/mod/mod_vhost_alias.html.fr.utf8 create mode 100644 docs/manual/mod/mod_vhost_alias.html.tr.utf8 create mode 100644 docs/manual/mod/mod_watchdog.html create mode 100644 docs/manual/mod/mod_watchdog.html.en create mode 100644 docs/manual/mod/mod_watchdog.html.fr.utf8 create mode 100644 docs/manual/mod/mod_xml2enc.html create mode 100644 docs/manual/mod/mod_xml2enc.html.en create mode 100644 docs/manual/mod/mod_xml2enc.html.fr.utf8 create mode 100644 docs/manual/mod/module-dict.html create mode 100644 docs/manual/mod/module-dict.html.en create mode 100644 docs/manual/mod/module-dict.html.fr.utf8 create mode 100644 docs/manual/mod/module-dict.html.ja.utf8 create mode 100644 docs/manual/mod/module-dict.html.ko.euc-kr create mode 100644 docs/manual/mod/module-dict.html.tr.utf8 create mode 100644 docs/manual/mod/mpm_common.html create mode 100644 docs/manual/mod/mpm_common.html.de create mode 100644 docs/manual/mod/mpm_common.html.en create mode 100644 docs/manual/mod/mpm_common.html.fr.utf8 create mode 100644 docs/manual/mod/mpm_common.html.ja.utf8 create mode 100644 docs/manual/mod/mpm_common.html.tr.utf8 create mode 100644 docs/manual/mod/mpm_netware.html create mode 100644 docs/manual/mod/mpm_netware.html.en create mode 100644 docs/manual/mod/mpm_netware.html.fr.utf8 create mode 100644 docs/manual/mod/mpm_winnt.html create mode 100644 docs/manual/mod/mpm_winnt.html.de create mode 100644 docs/manual/mod/mpm_winnt.html.en create mode 100644 docs/manual/mod/mpm_winnt.html.fr.utf8 create mode 100644 docs/manual/mod/mpm_winnt.html.ja.utf8 create mode 100644 docs/manual/mod/mpmt_os2.html create mode 100644 docs/manual/mod/mpmt_os2.html.en create mode 100644 docs/manual/mod/mpmt_os2.html.fr.utf8 create mode 100644 docs/manual/mod/overrides.html create mode 100644 docs/manual/mod/overrides.html.en create mode 100644 docs/manual/mod/overrides.html.fr.utf8 create mode 100644 docs/manual/mod/prefork.html create mode 100644 docs/manual/mod/prefork.html.de create mode 100644 docs/manual/mod/prefork.html.en create mode 100644 docs/manual/mod/prefork.html.fr.utf8 create mode 100644 docs/manual/mod/prefork.html.ja.utf8 create mode 100644 docs/manual/mod/prefork.html.tr.utf8 create mode 100644 docs/manual/mod/quickreference.html create mode 100644 docs/manual/mod/quickreference.html.de create mode 100644 docs/manual/mod/quickreference.html.en create mode 100644 docs/manual/mod/quickreference.html.es create mode 100644 docs/manual/mod/quickreference.html.fr.utf8 create mode 100644 docs/manual/mod/quickreference.html.ja.utf8 create mode 100644 docs/manual/mod/quickreference.html.ko.euc-kr create mode 100644 docs/manual/mod/quickreference.html.tr.utf8 create mode 100644 docs/manual/mod/quickreference.html.zh-cn.utf8 create mode 100644 docs/manual/mod/worker.html create mode 100644 docs/manual/mod/worker.html.de create mode 100644 docs/manual/mod/worker.html.en create mode 100644 docs/manual/mod/worker.html.fr.utf8 create mode 100644 docs/manual/mod/worker.html.ja.utf8 create mode 100644 docs/manual/mod/worker.html.tr.utf8 create mode 100644 docs/manual/mpm.html create mode 100644 docs/manual/mpm.html.de create mode 100644 docs/manual/mpm.html.en create mode 100644 docs/manual/mpm.html.es create mode 100644 docs/manual/mpm.html.fr.utf8 create mode 100644 docs/manual/mpm.html.ja.utf8 create mode 100644 docs/manual/mpm.html.ko.euc-kr create mode 100644 docs/manual/mpm.html.tr.utf8 create mode 100644 docs/manual/mpm.html.zh-cn.utf8 create mode 100644 docs/manual/new_features_2_0.html create mode 100644 docs/manual/new_features_2_0.html.de create mode 100644 docs/manual/new_features_2_0.html.en create mode 100644 docs/manual/new_features_2_0.html.fr.utf8 create mode 100644 docs/manual/new_features_2_0.html.ja.utf8 create mode 100644 docs/manual/new_features_2_0.html.ko.euc-kr create mode 100644 docs/manual/new_features_2_0.html.pt-br create mode 100644 docs/manual/new_features_2_0.html.tr.utf8 create mode 100644 docs/manual/new_features_2_2.html create mode 100644 docs/manual/new_features_2_2.html.en create mode 100644 docs/manual/new_features_2_2.html.fr.utf8 create mode 100644 docs/manual/new_features_2_2.html.ko.euc-kr create mode 100644 docs/manual/new_features_2_2.html.pt-br create mode 100644 docs/manual/new_features_2_2.html.tr.utf8 create mode 100644 docs/manual/new_features_2_4.html create mode 100644 docs/manual/new_features_2_4.html.en create mode 100644 docs/manual/new_features_2_4.html.fr.utf8 create mode 100644 docs/manual/new_features_2_4.html.tr.utf8 create mode 100644 docs/manual/platform/ebcdic.html create mode 100644 docs/manual/platform/ebcdic.html.en create mode 100644 docs/manual/platform/ebcdic.html.ko.euc-kr create mode 100644 docs/manual/platform/index.html create mode 100644 docs/manual/platform/index.html.en create mode 100644 docs/manual/platform/index.html.fr.utf8 create mode 100644 docs/manual/platform/index.html.ko.euc-kr create mode 100644 docs/manual/platform/index.html.zh-cn.utf8 create mode 100644 docs/manual/platform/netware.html create mode 100644 docs/manual/platform/netware.html.en create mode 100644 docs/manual/platform/netware.html.fr.utf8 create mode 100644 docs/manual/platform/netware.html.ko.euc-kr create mode 100644 docs/manual/platform/perf-hp.html create mode 100644 docs/manual/platform/perf-hp.html.en create mode 100644 docs/manual/platform/perf-hp.html.fr.utf8 create mode 100644 docs/manual/platform/perf-hp.html.ko.euc-kr create mode 100644 docs/manual/platform/rpm.html create mode 100644 docs/manual/platform/rpm.html.en create mode 100644 docs/manual/platform/rpm.html.fr.utf8 create mode 100644 docs/manual/platform/win_compiling.html create mode 100644 docs/manual/platform/win_compiling.html.en create mode 100644 docs/manual/platform/win_compiling.html.fr.utf8 create mode 100644 docs/manual/platform/win_compiling.html.ko.euc-kr create mode 100644 docs/manual/platform/windows.html create mode 100644 docs/manual/platform/windows.html.en create mode 100644 docs/manual/platform/windows.html.fr.utf8 create mode 100644 docs/manual/platform/windows.html.ko.euc-kr create mode 100644 docs/manual/programs/ab.html create mode 100644 docs/manual/programs/ab.html.en create mode 100644 docs/manual/programs/ab.html.fr.utf8 create mode 100644 docs/manual/programs/ab.html.ko.euc-kr create mode 100644 docs/manual/programs/ab.html.tr.utf8 create mode 100644 docs/manual/programs/apachectl.html create mode 100644 docs/manual/programs/apachectl.html.en create mode 100644 docs/manual/programs/apachectl.html.fr.utf8 create mode 100644 docs/manual/programs/apachectl.html.ko.euc-kr create mode 100644 docs/manual/programs/apachectl.html.tr.utf8 create mode 100644 docs/manual/programs/apxs.html create mode 100644 docs/manual/programs/apxs.html.en create mode 100644 docs/manual/programs/apxs.html.fr.utf8 create mode 100644 docs/manual/programs/apxs.html.ko.euc-kr create mode 100644 docs/manual/programs/apxs.html.tr.utf8 create mode 100644 docs/manual/programs/configure.html create mode 100644 docs/manual/programs/configure.html.en create mode 100644 docs/manual/programs/configure.html.fr.utf8 create mode 100644 docs/manual/programs/configure.html.ko.euc-kr create mode 100644 docs/manual/programs/configure.html.tr.utf8 create mode 100644 docs/manual/programs/dbmmanage.html create mode 100644 docs/manual/programs/dbmmanage.html.en create mode 100644 docs/manual/programs/dbmmanage.html.fr.utf8 create mode 100644 docs/manual/programs/dbmmanage.html.ko.euc-kr create mode 100644 docs/manual/programs/dbmmanage.html.tr.utf8 create mode 100644 docs/manual/programs/fcgistarter.html create mode 100644 docs/manual/programs/fcgistarter.html.en create mode 100644 docs/manual/programs/fcgistarter.html.fr.utf8 create mode 100644 docs/manual/programs/fcgistarter.html.tr.utf8 create mode 100644 docs/manual/programs/htcacheclean.html create mode 100644 docs/manual/programs/htcacheclean.html.en create mode 100644 docs/manual/programs/htcacheclean.html.fr.utf8 create mode 100644 docs/manual/programs/htcacheclean.html.ko.euc-kr create mode 100644 docs/manual/programs/htcacheclean.html.tr.utf8 create mode 100644 docs/manual/programs/htdbm.html create mode 100644 docs/manual/programs/htdbm.html.en create mode 100644 docs/manual/programs/htdbm.html.fr.utf8 create mode 100644 docs/manual/programs/htdbm.html.tr.utf8 create mode 100644 docs/manual/programs/htdigest.html create mode 100644 docs/manual/programs/htdigest.html.en create mode 100644 docs/manual/programs/htdigest.html.fr.utf8 create mode 100644 docs/manual/programs/htdigest.html.ko.euc-kr create mode 100644 docs/manual/programs/htdigest.html.tr.utf8 create mode 100644 docs/manual/programs/htpasswd.html create mode 100644 docs/manual/programs/htpasswd.html.en create mode 100644 docs/manual/programs/htpasswd.html.fr.utf8 create mode 100644 docs/manual/programs/htpasswd.html.ko.euc-kr create mode 100644 docs/manual/programs/htpasswd.html.tr.utf8 create mode 100644 docs/manual/programs/httpd.html create mode 100644 docs/manual/programs/httpd.html.en create mode 100644 docs/manual/programs/httpd.html.fr.utf8 create mode 100644 docs/manual/programs/httpd.html.ko.euc-kr create mode 100644 docs/manual/programs/httpd.html.tr.utf8 create mode 100644 docs/manual/programs/httxt2dbm.html create mode 100644 docs/manual/programs/httxt2dbm.html.en create mode 100644 docs/manual/programs/httxt2dbm.html.fr.utf8 create mode 100644 docs/manual/programs/httxt2dbm.html.tr.utf8 create mode 100644 docs/manual/programs/index.html create mode 100644 docs/manual/programs/index.html.en create mode 100644 docs/manual/programs/index.html.es create mode 100644 docs/manual/programs/index.html.fr.utf8 create mode 100644 docs/manual/programs/index.html.ko.euc-kr create mode 100644 docs/manual/programs/index.html.tr.utf8 create mode 100644 docs/manual/programs/index.html.zh-cn.utf8 create mode 100644 docs/manual/programs/log_server_status.html create mode 100644 docs/manual/programs/log_server_status.html.en create mode 100644 docs/manual/programs/log_server_status.html.fr.utf8 create mode 100644 docs/manual/programs/logresolve.html create mode 100644 docs/manual/programs/logresolve.html.en create mode 100644 docs/manual/programs/logresolve.html.fr.utf8 create mode 100644 docs/manual/programs/logresolve.html.ko.euc-kr create mode 100644 docs/manual/programs/logresolve.html.tr.utf8 create mode 100644 docs/manual/programs/other.html create mode 100644 docs/manual/programs/other.html.en create mode 100644 docs/manual/programs/other.html.fr.utf8 create mode 100644 docs/manual/programs/other.html.ko.euc-kr create mode 100644 docs/manual/programs/other.html.tr.utf8 create mode 100644 docs/manual/programs/rotatelogs.html create mode 100644 docs/manual/programs/rotatelogs.html.en create mode 100644 docs/manual/programs/rotatelogs.html.fr.utf8 create mode 100644 docs/manual/programs/rotatelogs.html.ko.euc-kr create mode 100644 docs/manual/programs/rotatelogs.html.tr.utf8 create mode 100644 docs/manual/programs/split-logfile.html create mode 100644 docs/manual/programs/split-logfile.html.en create mode 100644 docs/manual/programs/split-logfile.html.fr.utf8 create mode 100644 docs/manual/programs/suexec.html create mode 100644 docs/manual/programs/suexec.html.en create mode 100644 docs/manual/programs/suexec.html.fr.utf8 create mode 100644 docs/manual/programs/suexec.html.ko.euc-kr create mode 100644 docs/manual/programs/suexec.html.tr.utf8 create mode 100644 docs/manual/rewrite/access.html create mode 100644 docs/manual/rewrite/access.html.en create mode 100644 docs/manual/rewrite/access.html.fr.utf8 create mode 100644 docs/manual/rewrite/advanced.html create mode 100644 docs/manual/rewrite/advanced.html.en create mode 100644 docs/manual/rewrite/advanced.html.fr.utf8 create mode 100644 docs/manual/rewrite/avoid.html create mode 100644 docs/manual/rewrite/avoid.html.en create mode 100644 docs/manual/rewrite/avoid.html.fr.utf8 create mode 100644 docs/manual/rewrite/flags.html create mode 100644 docs/manual/rewrite/flags.html.en create mode 100644 docs/manual/rewrite/flags.html.fr.utf8 create mode 100644 docs/manual/rewrite/htaccess.html create mode 100644 docs/manual/rewrite/htaccess.html.en create mode 100644 docs/manual/rewrite/htaccess.html.fr.utf8 create mode 100644 docs/manual/rewrite/index.html create mode 100644 docs/manual/rewrite/index.html.en create mode 100644 docs/manual/rewrite/index.html.fr.utf8 create mode 100644 docs/manual/rewrite/index.html.tr.utf8 create mode 100644 docs/manual/rewrite/index.html.zh-cn.utf8 create mode 100644 docs/manual/rewrite/intro.html create mode 100644 docs/manual/rewrite/intro.html.en create mode 100644 docs/manual/rewrite/intro.html.fr.utf8 create mode 100644 docs/manual/rewrite/proxy.html create mode 100644 docs/manual/rewrite/proxy.html.en create mode 100644 docs/manual/rewrite/proxy.html.fr.utf8 create mode 100644 docs/manual/rewrite/remapping.html create mode 100644 docs/manual/rewrite/remapping.html.en create mode 100644 docs/manual/rewrite/remapping.html.fr.utf8 create mode 100644 docs/manual/rewrite/rewritemap.html create mode 100644 docs/manual/rewrite/rewritemap.html.en create mode 100644 docs/manual/rewrite/rewritemap.html.fr.utf8 create mode 100644 docs/manual/rewrite/tech.html create mode 100644 docs/manual/rewrite/tech.html.en create mode 100644 docs/manual/rewrite/tech.html.fr.utf8 create mode 100644 docs/manual/rewrite/vhosts.html create mode 100644 docs/manual/rewrite/vhosts.html.en create mode 100644 docs/manual/rewrite/vhosts.html.fr.utf8 create mode 100644 docs/manual/sections.html create mode 100644 docs/manual/sections.html.en create mode 100644 docs/manual/sections.html.fr.utf8 create mode 100644 docs/manual/sections.html.ja.utf8 create mode 100644 docs/manual/sections.html.ko.euc-kr create mode 100644 docs/manual/sections.html.tr.utf8 create mode 100644 docs/manual/server-wide.html create mode 100644 docs/manual/server-wide.html.en create mode 100644 docs/manual/server-wide.html.fr.utf8 create mode 100644 docs/manual/server-wide.html.ja.utf8 create mode 100644 docs/manual/server-wide.html.ko.euc-kr create mode 100644 docs/manual/server-wide.html.tr.utf8 create mode 100644 docs/manual/sitemap.html create mode 100644 docs/manual/sitemap.html.de create mode 100644 docs/manual/sitemap.html.en create mode 100644 docs/manual/sitemap.html.es create mode 100644 docs/manual/sitemap.html.fr.utf8 create mode 100644 docs/manual/sitemap.html.ja.utf8 create mode 100644 docs/manual/sitemap.html.ko.euc-kr create mode 100644 docs/manual/sitemap.html.tr.utf8 create mode 100644 docs/manual/sitemap.html.zh-cn.utf8 create mode 100644 docs/manual/socache.html create mode 100644 docs/manual/socache.html.en create mode 100644 docs/manual/socache.html.fr.utf8 create mode 100644 docs/manual/ssl/index.html create mode 100644 docs/manual/ssl/index.html.en create mode 100644 docs/manual/ssl/index.html.fr.utf8 create mode 100644 docs/manual/ssl/index.html.ja.utf8 create mode 100644 docs/manual/ssl/index.html.tr.utf8 create mode 100644 docs/manual/ssl/index.html.zh-cn.utf8 create mode 100644 docs/manual/ssl/ssl_compat.html create mode 100644 docs/manual/ssl/ssl_compat.html.en create mode 100644 docs/manual/ssl/ssl_compat.html.fr.utf8 create mode 100644 docs/manual/ssl/ssl_faq.html create mode 100644 docs/manual/ssl/ssl_faq.html.en create mode 100644 docs/manual/ssl/ssl_faq.html.fr.utf8 create mode 100644 docs/manual/ssl/ssl_howto.html create mode 100644 docs/manual/ssl/ssl_howto.html.en create mode 100644 docs/manual/ssl/ssl_howto.html.fr.utf8 create mode 100644 docs/manual/ssl/ssl_intro.html create mode 100644 docs/manual/ssl/ssl_intro.html.en create mode 100644 docs/manual/ssl/ssl_intro.html.fr.utf8 create mode 100644 docs/manual/ssl/ssl_intro.html.ja.utf8 create mode 100644 docs/manual/stopping.html create mode 100644 docs/manual/stopping.html.de create mode 100644 docs/manual/stopping.html.en create mode 100644 docs/manual/stopping.html.es create mode 100644 docs/manual/stopping.html.fr.utf8 create mode 100644 docs/manual/stopping.html.ja.utf8 create mode 100644 docs/manual/stopping.html.ko.euc-kr create mode 100644 docs/manual/stopping.html.tr.utf8 create mode 100644 docs/manual/style/build.properties create mode 100644 docs/manual/style/common.dtd create mode 100644 docs/manual/style/css/manual-chm.css create mode 100644 docs/manual/style/css/manual-loose-100pc.css create mode 100644 docs/manual/style/css/manual-print.css create mode 100644 docs/manual/style/css/manual-zip-100pc.css create mode 100644 docs/manual/style/css/manual-zip.css create mode 100644 docs/manual/style/css/manual.css create mode 100644 docs/manual/style/css/prettify.css create mode 100644 docs/manual/style/faq.dtd create mode 100644 docs/manual/style/lang.dtd create mode 100644 docs/manual/style/latex/atbeginend.sty create mode 100644 docs/manual/style/manualpage.dtd create mode 100644 docs/manual/style/modulesynopsis.dtd create mode 100644 docs/manual/style/scripts/MINIFY create mode 100644 docs/manual/style/scripts/prettify.js create mode 100644 docs/manual/style/scripts/prettify.min.js create mode 100644 docs/manual/style/sitemap.dtd create mode 100644 docs/manual/style/version.ent create mode 100644 docs/manual/suexec.html create mode 100644 docs/manual/suexec.html.en create mode 100644 docs/manual/suexec.html.fr.utf8 create mode 100644 docs/manual/suexec.html.ja.utf8 create mode 100644 docs/manual/suexec.html.ko.euc-kr create mode 100644 docs/manual/suexec.html.tr.utf8 create mode 100644 docs/manual/upgrading.html create mode 100644 docs/manual/upgrading.html.en create mode 100644 docs/manual/upgrading.html.fr.utf8 create mode 100644 docs/manual/urlmapping.html create mode 100644 docs/manual/urlmapping.html.en create mode 100644 docs/manual/urlmapping.html.fr.utf8 create mode 100644 docs/manual/urlmapping.html.ja.utf8 create mode 100644 docs/manual/urlmapping.html.ko.euc-kr create mode 100644 docs/manual/urlmapping.html.tr.utf8 create mode 100644 docs/manual/vhosts/details.html create mode 100644 docs/manual/vhosts/details.html.en create mode 100644 docs/manual/vhosts/details.html.fr.utf8 create mode 100644 docs/manual/vhosts/details.html.ko.euc-kr create mode 100644 docs/manual/vhosts/details.html.tr.utf8 create mode 100644 docs/manual/vhosts/examples.html create mode 100644 docs/manual/vhosts/examples.html.en create mode 100644 docs/manual/vhosts/examples.html.fr.utf8 create mode 100644 docs/manual/vhosts/examples.html.ja.utf8 create mode 100644 docs/manual/vhosts/examples.html.ko.euc-kr create mode 100644 docs/manual/vhosts/examples.html.tr.utf8 create mode 100644 docs/manual/vhosts/fd-limits.html create mode 100644 docs/manual/vhosts/fd-limits.html.en create mode 100644 docs/manual/vhosts/fd-limits.html.fr.utf8 create mode 100644 docs/manual/vhosts/fd-limits.html.ja.utf8 create mode 100644 docs/manual/vhosts/fd-limits.html.ko.euc-kr create mode 100644 docs/manual/vhosts/fd-limits.html.tr.utf8 create mode 100644 docs/manual/vhosts/index.html create mode 100644 docs/manual/vhosts/index.html.de create mode 100644 docs/manual/vhosts/index.html.en create mode 100644 docs/manual/vhosts/index.html.fr.utf8 create mode 100644 docs/manual/vhosts/index.html.ja.utf8 create mode 100644 docs/manual/vhosts/index.html.ko.euc-kr create mode 100644 docs/manual/vhosts/index.html.tr.utf8 create mode 100644 docs/manual/vhosts/index.html.zh-cn.utf8 create mode 100644 docs/manual/vhosts/ip-based.html create mode 100644 docs/manual/vhosts/ip-based.html.en create mode 100644 docs/manual/vhosts/ip-based.html.fr.utf8 create mode 100644 docs/manual/vhosts/ip-based.html.ja.utf8 create mode 100644 docs/manual/vhosts/ip-based.html.ko.euc-kr create mode 100644 docs/manual/vhosts/ip-based.html.tr.utf8 create mode 100644 docs/manual/vhosts/mass.html create mode 100644 docs/manual/vhosts/mass.html.en create mode 100644 docs/manual/vhosts/mass.html.fr.utf8 create mode 100644 docs/manual/vhosts/mass.html.ko.euc-kr create mode 100644 docs/manual/vhosts/mass.html.tr.utf8 create mode 100644 docs/manual/vhosts/name-based.html create mode 100644 docs/manual/vhosts/name-based.html.de create mode 100644 docs/manual/vhosts/name-based.html.en create mode 100644 docs/manual/vhosts/name-based.html.fr.utf8 create mode 100644 docs/manual/vhosts/name-based.html.ja.utf8 create mode 100644 docs/manual/vhosts/name-based.html.ko.euc-kr create mode 100644 docs/manual/vhosts/name-based.html.tr.utf8 create mode 100644 docs/server-status/README.md create mode 100644 docs/server-status/feather.png create mode 100644 docs/server-status/server-status.lua create mode 100644 emacs-style create mode 100644 httpd.dep create mode 100644 httpd.dsp create mode 100644 httpd.mak create mode 100644 httpd.spec create mode 100644 include/.indent.pro create mode 100644 include/ap_compat.h create mode 100644 include/ap_config.h create mode 100644 include/ap_config_auto.h.in create mode 100644 include/ap_config_layout.h.in create mode 100644 include/ap_expr.h create mode 100644 include/ap_hooks.h create mode 100644 include/ap_listen.h create mode 100644 include/ap_mmn.h create mode 100644 include/ap_mpm.h create mode 100644 include/ap_provider.h create mode 100644 include/ap_regex.h create mode 100644 include/ap_regkey.h create mode 100644 include/ap_release.h create mode 100644 include/ap_slotmem.h create mode 100644 include/ap_socache.h create mode 100644 include/apache_noprobes.h create mode 100644 include/heartbeat.h create mode 100644 include/http_config.h create mode 100644 include/http_connection.h create mode 100644 include/http_core.h create mode 100644 include/http_log.h create mode 100644 include/http_main.h create mode 100644 include/http_protocol.h create mode 100644 include/http_request.h create mode 100644 include/http_ssl.h create mode 100644 include/http_vhost.h create mode 100644 include/httpd.h create mode 100644 include/mod_auth.h create mode 100644 include/mod_core.h create mode 100644 include/mod_request.h create mode 100644 include/mpm_common.h create mode 100644 include/scoreboard.h create mode 100644 include/util_cfgtree.h create mode 100644 include/util_charset.h create mode 100644 include/util_cookies.h create mode 100644 include/util_ebcdic.h create mode 100644 include/util_fcgi.h create mode 100644 include/util_filter.h create mode 100644 include/util_ldap.h create mode 100644 include/util_md5.h create mode 100644 include/util_mutex.h create mode 100644 include/util_script.h create mode 100644 include/util_time.h create mode 100644 include/util_varbuf.h create mode 100644 include/util_xml.h create mode 100644 libhttpd.dep create mode 100644 libhttpd.dsp create mode 100644 libhttpd.mak create mode 100644 modules/Makefile.in create mode 100644 modules/NWGNUmakefile create mode 100644 modules/README create mode 100644 modules/aaa/.indent.pro create mode 100644 modules/aaa/Makefile.in create mode 100644 modules/aaa/NWGNUaccesscompat create mode 100644 modules/aaa/NWGNUallowmethods create mode 100644 modules/aaa/NWGNUauthbasc create mode 100644 modules/aaa/NWGNUauthdigt create mode 100644 modules/aaa/NWGNUauthform create mode 100644 modules/aaa/NWGNUauthnano create mode 100644 modules/aaa/NWGNUauthndbd create mode 100644 modules/aaa/NWGNUauthndbm create mode 100644 modules/aaa/NWGNUauthnfil create mode 100644 modules/aaa/NWGNUauthnsocache create mode 100644 modules/aaa/NWGNUauthnzldap create mode 100644 modules/aaa/NWGNUauthzdbd create mode 100644 modules/aaa/NWGNUauthzdbm create mode 100644 modules/aaa/NWGNUauthzgrp create mode 100644 modules/aaa/NWGNUauthzusr create mode 100644 modules/aaa/NWGNUmakefile create mode 100644 modules/aaa/config.m4 create mode 100644 modules/aaa/mod_access_compat.c create mode 100644 modules/aaa/mod_access_compat.dep create mode 100644 modules/aaa/mod_access_compat.dsp create mode 100644 modules/aaa/mod_access_compat.mak create mode 100644 modules/aaa/mod_allowmethods.c create mode 100644 modules/aaa/mod_allowmethods.dep create mode 100644 modules/aaa/mod_allowmethods.dsp create mode 100644 modules/aaa/mod_allowmethods.mak create mode 100644 modules/aaa/mod_auth_basic.c create mode 100644 modules/aaa/mod_auth_basic.dep create mode 100644 modules/aaa/mod_auth_basic.dsp create mode 100644 modules/aaa/mod_auth_basic.mak create mode 100644 modules/aaa/mod_auth_digest.c create mode 100644 modules/aaa/mod_auth_digest.dep create mode 100644 modules/aaa/mod_auth_digest.dsp create mode 100644 modules/aaa/mod_auth_digest.mak create mode 100644 modules/aaa/mod_auth_form.c create mode 100644 modules/aaa/mod_auth_form.dep create mode 100644 modules/aaa/mod_auth_form.dsp create mode 100644 modules/aaa/mod_auth_form.mak create mode 100644 modules/aaa/mod_authn_anon.c create mode 100644 modules/aaa/mod_authn_anon.dep create mode 100644 modules/aaa/mod_authn_anon.dsp create mode 100644 modules/aaa/mod_authn_anon.mak create mode 100644 modules/aaa/mod_authn_core.c create mode 100644 modules/aaa/mod_authn_core.dep create mode 100644 modules/aaa/mod_authn_core.dsp create mode 100644 modules/aaa/mod_authn_core.mak create mode 100644 modules/aaa/mod_authn_dbd.c create mode 100644 modules/aaa/mod_authn_dbd.dep create mode 100644 modules/aaa/mod_authn_dbd.dsp create mode 100644 modules/aaa/mod_authn_dbd.mak create mode 100644 modules/aaa/mod_authn_dbm.c create mode 100644 modules/aaa/mod_authn_dbm.dep create mode 100644 modules/aaa/mod_authn_dbm.dsp create mode 100644 modules/aaa/mod_authn_dbm.mak create mode 100644 modules/aaa/mod_authn_file.c create mode 100644 modules/aaa/mod_authn_file.dep create mode 100644 modules/aaa/mod_authn_file.dsp create mode 100644 modules/aaa/mod_authn_file.mak create mode 100644 modules/aaa/mod_authn_socache.c create mode 100644 modules/aaa/mod_authn_socache.dep create mode 100644 modules/aaa/mod_authn_socache.dsp create mode 100644 modules/aaa/mod_authn_socache.mak create mode 100644 modules/aaa/mod_authnz_fcgi.c create mode 100644 modules/aaa/mod_authnz_fcgi.dep create mode 100644 modules/aaa/mod_authnz_fcgi.dsp create mode 100644 modules/aaa/mod_authnz_fcgi.mak create mode 100644 modules/aaa/mod_authnz_ldap.c create mode 100644 modules/aaa/mod_authnz_ldap.dep create mode 100644 modules/aaa/mod_authnz_ldap.dsp create mode 100644 modules/aaa/mod_authnz_ldap.mak create mode 100644 modules/aaa/mod_authz_core.c create mode 100644 modules/aaa/mod_authz_core.dep create mode 100644 modules/aaa/mod_authz_core.dsp create mode 100644 modules/aaa/mod_authz_core.mak create mode 100644 modules/aaa/mod_authz_dbd.c create mode 100644 modules/aaa/mod_authz_dbd.dep create mode 100644 modules/aaa/mod_authz_dbd.dsp create mode 100644 modules/aaa/mod_authz_dbd.h create mode 100644 modules/aaa/mod_authz_dbd.mak create mode 100644 modules/aaa/mod_authz_dbm.c create mode 100644 modules/aaa/mod_authz_dbm.dep create mode 100644 modules/aaa/mod_authz_dbm.dsp create mode 100644 modules/aaa/mod_authz_dbm.mak create mode 100644 modules/aaa/mod_authz_groupfile.c create mode 100644 modules/aaa/mod_authz_groupfile.dep create mode 100644 modules/aaa/mod_authz_groupfile.dsp create mode 100644 modules/aaa/mod_authz_groupfile.mak create mode 100644 modules/aaa/mod_authz_host.c create mode 100644 modules/aaa/mod_authz_host.dep create mode 100644 modules/aaa/mod_authz_host.dsp create mode 100644 modules/aaa/mod_authz_host.mak create mode 100644 modules/aaa/mod_authz_owner.c create mode 100644 modules/aaa/mod_authz_owner.dep create mode 100644 modules/aaa/mod_authz_owner.dsp create mode 100644 modules/aaa/mod_authz_owner.h create mode 100644 modules/aaa/mod_authz_owner.mak create mode 100644 modules/aaa/mod_authz_user.c create mode 100644 modules/aaa/mod_authz_user.dep create mode 100644 modules/aaa/mod_authz_user.dsp create mode 100644 modules/aaa/mod_authz_user.mak create mode 100644 modules/arch/netware/libprews.c create mode 100644 modules/arch/netware/mod_netware.c create mode 100644 modules/arch/netware/mod_nw_ssl.c create mode 100644 modules/arch/unix/Makefile.in create mode 100644 modules/arch/unix/config5.m4 create mode 100644 modules/arch/unix/mod_privileges.c create mode 100644 modules/arch/unix/mod_systemd.c create mode 100644 modules/arch/unix/mod_unixd.c create mode 100644 modules/arch/unix/mod_unixd.h create mode 100644 modules/arch/win32/Makefile.in create mode 100644 modules/arch/win32/config.m4 create mode 100644 modules/arch/win32/mod_isapi.c create mode 100644 modules/arch/win32/mod_isapi.dep create mode 100644 modules/arch/win32/mod_isapi.dsp create mode 100644 modules/arch/win32/mod_isapi.h create mode 100644 modules/arch/win32/mod_isapi.mak create mode 100644 modules/arch/win32/mod_win32.c create mode 100644 modules/cache/.indent.pro create mode 100644 modules/cache/Makefile.in create mode 100644 modules/cache/NWGNUcach_dsk create mode 100644 modules/cache/NWGNUcach_socache create mode 100644 modules/cache/NWGNUmakefile create mode 100644 modules/cache/NWGNUmod_cach create mode 100644 modules/cache/NWGNUsocachdbm create mode 100644 modules/cache/NWGNUsocachmem create mode 100644 modules/cache/NWGNUsocachshmcb create mode 100644 modules/cache/cache_common.h create mode 100644 modules/cache/cache_disk_common.h create mode 100644 modules/cache/cache_socache_common.h create mode 100644 modules/cache/cache_storage.c create mode 100644 modules/cache/cache_storage.h create mode 100644 modules/cache/cache_util.c create mode 100644 modules/cache/cache_util.h create mode 100644 modules/cache/config.m4 create mode 100644 modules/cache/mod_cache.c create mode 100644 modules/cache/mod_cache.dep create mode 100644 modules/cache/mod_cache.dsp create mode 100644 modules/cache/mod_cache.h create mode 100644 modules/cache/mod_cache.mak create mode 100644 modules/cache/mod_cache_disk.c create mode 100644 modules/cache/mod_cache_disk.dep create mode 100644 modules/cache/mod_cache_disk.dsp create mode 100644 modules/cache/mod_cache_disk.h create mode 100644 modules/cache/mod_cache_disk.mak create mode 100644 modules/cache/mod_cache_socache.c create mode 100644 modules/cache/mod_cache_socache.dep create mode 100644 modules/cache/mod_cache_socache.dsp create mode 100644 modules/cache/mod_cache_socache.mak create mode 100644 modules/cache/mod_file_cache.c create mode 100644 modules/cache/mod_file_cache.dep create mode 100644 modules/cache/mod_file_cache.dsp create mode 100644 modules/cache/mod_file_cache.exp create mode 100644 modules/cache/mod_file_cache.mak create mode 100644 modules/cache/mod_socache_dbm.c create mode 100644 modules/cache/mod_socache_dbm.dep create mode 100644 modules/cache/mod_socache_dbm.dsp create mode 100644 modules/cache/mod_socache_dbm.mak create mode 100644 modules/cache/mod_socache_dc.c create mode 100644 modules/cache/mod_socache_dc.dep create mode 100644 modules/cache/mod_socache_dc.dsp create mode 100644 modules/cache/mod_socache_dc.mak create mode 100644 modules/cache/mod_socache_memcache.c create mode 100644 modules/cache/mod_socache_memcache.dep create mode 100644 modules/cache/mod_socache_memcache.dsp create mode 100644 modules/cache/mod_socache_memcache.mak create mode 100644 modules/cache/mod_socache_redis.c create mode 100644 modules/cache/mod_socache_redis.dep create mode 100644 modules/cache/mod_socache_redis.dsp create mode 100644 modules/cache/mod_socache_redis.mak create mode 100644 modules/cache/mod_socache_shmcb.c create mode 100644 modules/cache/mod_socache_shmcb.dep create mode 100644 modules/cache/mod_socache_shmcb.dsp create mode 100644 modules/cache/mod_socache_shmcb.mak create mode 100644 modules/cluster/Makefile.in create mode 100644 modules/cluster/NWGNUmakefile create mode 100644 modules/cluster/NWGNUmodheartbeat create mode 100644 modules/cluster/NWGNUmodheartmonitor create mode 100644 modules/cluster/README.heartbeat create mode 100644 modules/cluster/README.heartmonitor create mode 100644 modules/cluster/config5.m4 create mode 100644 modules/cluster/mod_heartbeat.c create mode 100644 modules/cluster/mod_heartbeat.dep create mode 100644 modules/cluster/mod_heartbeat.dsp create mode 100644 modules/cluster/mod_heartbeat.mak create mode 100644 modules/cluster/mod_heartmonitor.c create mode 100644 modules/cluster/mod_heartmonitor.dep create mode 100644 modules/cluster/mod_heartmonitor.dsp create mode 100644 modules/cluster/mod_heartmonitor.mak create mode 100644 modules/config7.m4 create mode 100644 modules/core/Makefile.in create mode 100644 modules/core/NWGNUmakefile create mode 100644 modules/core/config.m4 create mode 100644 modules/core/mod_macro.c create mode 100644 modules/core/mod_macro.dep create mode 100644 modules/core/mod_macro.dsp create mode 100644 modules/core/mod_macro.mak create mode 100644 modules/core/mod_so.c create mode 100644 modules/core/mod_so.h create mode 100644 modules/core/mod_watchdog.c create mode 100644 modules/core/mod_watchdog.dep create mode 100644 modules/core/mod_watchdog.dsp create mode 100644 modules/core/mod_watchdog.h create mode 100644 modules/core/mod_watchdog.mak create mode 100644 modules/core/test/Makefile create mode 100644 modules/core/test/conf/inc63_1.conf create mode 100644 modules/core/test/conf/inc63_2.conf create mode 100644 modules/core/test/conf/test01.conf create mode 100644 modules/core/test/conf/test02.conf create mode 100644 modules/core/test/conf/test03.conf create mode 100644 modules/core/test/conf/test04.conf create mode 100644 modules/core/test/conf/test05.conf create mode 100644 modules/core/test/conf/test06.conf create mode 100644 modules/core/test/conf/test07.conf create mode 100644 modules/core/test/conf/test08.conf create mode 100644 modules/core/test/conf/test09.conf create mode 100644 modules/core/test/conf/test10.conf create mode 100644 modules/core/test/conf/test11.conf create mode 100644 modules/core/test/conf/test12.conf create mode 100644 modules/core/test/conf/test13.conf create mode 100644 modules/core/test/conf/test14.conf create mode 100644 modules/core/test/conf/test15.conf create mode 100644 modules/core/test/conf/test16.conf create mode 100644 modules/core/test/conf/test17.conf create mode 100644 modules/core/test/conf/test18.conf create mode 100644 modules/core/test/conf/test19.conf create mode 100644 modules/core/test/conf/test20.conf create mode 100644 modules/core/test/conf/test21.conf create mode 100644 modules/core/test/conf/test22.conf create mode 100644 modules/core/test/conf/test23.conf create mode 100644 modules/core/test/conf/test24.conf create mode 100644 modules/core/test/conf/test25.conf create mode 100644 modules/core/test/conf/test26.conf create mode 100644 modules/core/test/conf/test27.conf create mode 100644 modules/core/test/conf/test28.conf create mode 100644 modules/core/test/conf/test29.conf create mode 100644 modules/core/test/conf/test30.conf create mode 100644 modules/core/test/conf/test31.conf create mode 100644 modules/core/test/conf/test32.conf create mode 100644 modules/core/test/conf/test33.conf create mode 100644 modules/core/test/conf/test34.conf create mode 100644 modules/core/test/conf/test35.conf create mode 100644 modules/core/test/conf/test36.conf create mode 100644 modules/core/test/conf/test37.conf create mode 100644 modules/core/test/conf/test38.conf create mode 100644 modules/core/test/conf/test39.conf create mode 100644 modules/core/test/conf/test40.conf create mode 100644 modules/core/test/conf/test41.conf create mode 100644 modules/core/test/conf/test42.conf create mode 100644 modules/core/test/conf/test43.conf create mode 100644 modules/core/test/conf/test44.conf create mode 100644 modules/core/test/conf/test45.conf create mode 100644 modules/core/test/conf/test46.conf create mode 100644 modules/core/test/conf/test47.conf create mode 100644 modules/core/test/conf/test48.conf create mode 100644 modules/core/test/conf/test49.conf create mode 100644 modules/core/test/conf/test50.conf create mode 100644 modules/core/test/conf/test51.conf create mode 100644 modules/core/test/conf/test52.conf create mode 100644 modules/core/test/conf/test53.conf create mode 100644 modules/core/test/conf/test54.conf create mode 100644 modules/core/test/conf/test55.conf create mode 100644 modules/core/test/conf/test56.conf create mode 100644 modules/core/test/conf/test57.conf create mode 100644 modules/core/test/conf/test58.conf create mode 100644 modules/core/test/conf/test59.conf create mode 100644 modules/core/test/conf/test60.conf create mode 100644 modules/core/test/conf/test61.conf create mode 100644 modules/core/test/conf/test62.conf create mode 100644 modules/core/test/conf/test63.conf create mode 100644 modules/core/test/conf/test64.conf create mode 100644 modules/core/test/conf/test65.conf create mode 100644 modules/core/test/conf/test66.conf create mode 100644 modules/core/test/conf/test67.conf create mode 100644 modules/core/test/conf/test68.conf create mode 100644 modules/core/test/conf/test69.conf create mode 100644 modules/core/test/ref/test01.out create mode 100644 modules/core/test/ref/test02.out create mode 100644 modules/core/test/ref/test03.out create mode 100644 modules/core/test/ref/test04.out create mode 100644 modules/core/test/ref/test05.out create mode 100644 modules/core/test/ref/test06.out create mode 100644 modules/core/test/ref/test07.out create mode 100644 modules/core/test/ref/test08.out create mode 100644 modules/core/test/ref/test09.out create mode 100644 modules/core/test/ref/test10.out create mode 100644 modules/core/test/ref/test11.out create mode 100644 modules/core/test/ref/test12.out create mode 100644 modules/core/test/ref/test13.out create mode 100644 modules/core/test/ref/test14.out create mode 100644 modules/core/test/ref/test15.out create mode 100644 modules/core/test/ref/test16.out create mode 100644 modules/core/test/ref/test17.out create mode 100644 modules/core/test/ref/test18.out create mode 100644 modules/core/test/ref/test19.out create mode 100644 modules/core/test/ref/test20.out create mode 100644 modules/core/test/ref/test21.out create mode 100644 modules/core/test/ref/test22.out create mode 100644 modules/core/test/ref/test23.out create mode 100644 modules/core/test/ref/test24.out create mode 100644 modules/core/test/ref/test25.out create mode 100644 modules/core/test/ref/test26.out create mode 100644 modules/core/test/ref/test27.out create mode 100644 modules/core/test/ref/test28.out create mode 100644 modules/core/test/ref/test29.out create mode 100644 modules/core/test/ref/test30.out create mode 100644 modules/core/test/ref/test31.out create mode 100644 modules/core/test/ref/test32.out create mode 100644 modules/core/test/ref/test33.out create mode 100644 modules/core/test/ref/test34.out create mode 100644 modules/core/test/ref/test35.out create mode 100644 modules/core/test/ref/test36.out create mode 100644 modules/core/test/ref/test37.out create mode 100644 modules/core/test/ref/test38.out create mode 100644 modules/core/test/ref/test39.out create mode 100644 modules/core/test/ref/test40.out create mode 100644 modules/core/test/ref/test41.out create mode 100644 modules/core/test/ref/test42.out create mode 100644 modules/core/test/ref/test43.out create mode 100644 modules/core/test/ref/test44.out create mode 100644 modules/core/test/ref/test45.out create mode 100644 modules/core/test/ref/test46.out create mode 100644 modules/core/test/ref/test47.out create mode 100644 modules/core/test/ref/test48.out create mode 100644 modules/core/test/ref/test49.out create mode 100644 modules/core/test/ref/test50.out create mode 100644 modules/core/test/ref/test51.out create mode 100644 modules/core/test/ref/test52.out create mode 100644 modules/core/test/ref/test53.out create mode 100644 modules/core/test/ref/test54.out create mode 100644 modules/core/test/ref/test55.out create mode 100644 modules/core/test/ref/test56.out create mode 100644 modules/core/test/ref/test57.out create mode 100644 modules/core/test/ref/test58.out create mode 100644 modules/core/test/ref/test59.out create mode 100644 modules/core/test/ref/test60.out create mode 100644 modules/core/test/ref/test61.out create mode 100644 modules/core/test/ref/test62.out create mode 100644 modules/core/test/ref/test63.out create mode 100644 modules/core/test/ref/test64.out create mode 100644 modules/core/test/ref/test65.out create mode 100644 modules/core/test/ref/test66.out create mode 100644 modules/core/test/ref/test67.out create mode 100644 modules/core/test/ref/test68.out create mode 100644 modules/core/test/ref/test69.out create mode 100644 modules/database/Makefile.in create mode 100644 modules/database/NWGNUmakefile create mode 100644 modules/database/config.m4 create mode 100644 modules/database/mod_dbd.c create mode 100644 modules/database/mod_dbd.dep create mode 100644 modules/database/mod_dbd.dsp create mode 100644 modules/database/mod_dbd.h create mode 100644 modules/database/mod_dbd.mak create mode 100644 modules/dav/fs/Makefile.in create mode 100644 modules/dav/fs/NWGNUmakefile create mode 100644 modules/dav/fs/config6.m4 create mode 100644 modules/dav/fs/dbm.c create mode 100644 modules/dav/fs/lock.c create mode 100644 modules/dav/fs/mod_dav_fs.c create mode 100644 modules/dav/fs/mod_dav_fs.dep create mode 100644 modules/dav/fs/mod_dav_fs.dsp create mode 100644 modules/dav/fs/mod_dav_fs.mak create mode 100644 modules/dav/fs/repos.c create mode 100644 modules/dav/fs/repos.h create mode 100644 modules/dav/lock/Makefile.in create mode 100644 modules/dav/lock/NWGNUmakefile create mode 100644 modules/dav/lock/config6.m4 create mode 100644 modules/dav/lock/locks.c create mode 100644 modules/dav/lock/locks.h create mode 100644 modules/dav/lock/mod_dav_lock.c create mode 100644 modules/dav/lock/mod_dav_lock.dep create mode 100644 modules/dav/lock/mod_dav_lock.dsp create mode 100644 modules/dav/lock/mod_dav_lock.mak create mode 100644 modules/dav/main/Makefile.in create mode 100644 modules/dav/main/NWGNUmakefile create mode 100644 modules/dav/main/config5.m4 create mode 100644 modules/dav/main/liveprop.c create mode 100644 modules/dav/main/mod_dav.c create mode 100644 modules/dav/main/mod_dav.dep create mode 100644 modules/dav/main/mod_dav.dsp create mode 100644 modules/dav/main/mod_dav.h create mode 100644 modules/dav/main/mod_dav.mak create mode 100644 modules/dav/main/props.c create mode 100644 modules/dav/main/providers.c create mode 100644 modules/dav/main/std_liveprop.c create mode 100644 modules/dav/main/util.c create mode 100644 modules/dav/main/util_lock.c create mode 100644 modules/debugging/Makefile.in create mode 100644 modules/debugging/NWGNUmakefile create mode 100644 modules/debugging/NWGNUmodbucketeer create mode 100644 modules/debugging/NWGNUmoddumpio create mode 100644 modules/debugging/README create mode 100644 modules/debugging/config.m4 create mode 100644 modules/debugging/mod_bucketeer.c create mode 100644 modules/debugging/mod_bucketeer.dep create mode 100644 modules/debugging/mod_bucketeer.dsp create mode 100644 modules/debugging/mod_bucketeer.mak create mode 100644 modules/debugging/mod_dumpio.c create mode 100644 modules/debugging/mod_dumpio.dep create mode 100644 modules/debugging/mod_dumpio.dsp create mode 100644 modules/debugging/mod_dumpio.mak create mode 100644 modules/echo/.indent.pro create mode 100644 modules/echo/Makefile.in create mode 100644 modules/echo/NWGNUmakefile create mode 100644 modules/echo/config.m4 create mode 100644 modules/echo/mod_echo.c create mode 100644 modules/echo/mod_echo.dep create mode 100644 modules/echo/mod_echo.dsp create mode 100644 modules/echo/mod_echo.mak create mode 100644 modules/examples/Makefile.in create mode 100644 modules/examples/NWGNUcase_flt create mode 100644 modules/examples/NWGNUcase_flt_in create mode 100644 modules/examples/NWGNUexample_hooks create mode 100644 modules/examples/NWGNUexample_ipc create mode 100644 modules/examples/NWGNUmakefile create mode 100644 modules/examples/README create mode 100644 modules/examples/config.m4 create mode 100644 modules/examples/mod_case_filter.c create mode 100644 modules/examples/mod_case_filter.dep create mode 100644 modules/examples/mod_case_filter.dsp create mode 100644 modules/examples/mod_case_filter.mak create mode 100644 modules/examples/mod_case_filter_in.c create mode 100644 modules/examples/mod_case_filter_in.dep create mode 100644 modules/examples/mod_case_filter_in.dsp create mode 100644 modules/examples/mod_case_filter_in.mak create mode 100644 modules/examples/mod_example_hooks.c create mode 100644 modules/examples/mod_example_hooks.dep create mode 100644 modules/examples/mod_example_hooks.dsp create mode 100644 modules/examples/mod_example_hooks.mak create mode 100644 modules/examples/mod_example_ipc.c create mode 100644 modules/examples/mod_example_ipc.dep create mode 100644 modules/examples/mod_example_ipc.dsp create mode 100644 modules/examples/mod_example_ipc.mak create mode 100644 modules/experimental/.indent.pro create mode 100644 modules/experimental/Makefile.in create mode 100644 modules/experimental/NWGNUmakefile create mode 100644 modules/experimental/config.m4 create mode 100644 modules/filters/.indent.pro create mode 100644 modules/filters/Makefile.in create mode 100644 modules/filters/NWGNUcharsetl create mode 100644 modules/filters/NWGNUdeflate create mode 100644 modules/filters/NWGNUextfiltr create mode 100644 modules/filters/NWGNUmakefile create mode 100644 modules/filters/NWGNUmod_data create mode 100644 modules/filters/NWGNUmod_filter create mode 100644 modules/filters/NWGNUmod_request create mode 100644 modules/filters/NWGNUmodbuffer create mode 100644 modules/filters/NWGNUmodsed create mode 100644 modules/filters/NWGNUproxyhtml create mode 100644 modules/filters/NWGNUratelimit create mode 100644 modules/filters/NWGNUreflector create mode 100644 modules/filters/NWGNUreqtimeout create mode 100644 modules/filters/NWGNUsubstitute create mode 100644 modules/filters/NWGNUxml2enc create mode 100644 modules/filters/config.m4 create mode 100644 modules/filters/libsed.h create mode 100644 modules/filters/mod_brotli.c create mode 100644 modules/filters/mod_brotli.dep create mode 100644 modules/filters/mod_brotli.dsp create mode 100644 modules/filters/mod_brotli.mak create mode 100644 modules/filters/mod_buffer.c create mode 100644 modules/filters/mod_buffer.dep create mode 100644 modules/filters/mod_buffer.dsp create mode 100644 modules/filters/mod_buffer.mak create mode 100644 modules/filters/mod_charset_lite.c create mode 100644 modules/filters/mod_charset_lite.dep create mode 100644 modules/filters/mod_charset_lite.dsp create mode 100644 modules/filters/mod_charset_lite.exp create mode 100644 modules/filters/mod_charset_lite.mak create mode 100644 modules/filters/mod_data.c create mode 100644 modules/filters/mod_data.dep create mode 100644 modules/filters/mod_data.dsp create mode 100644 modules/filters/mod_data.mak create mode 100644 modules/filters/mod_deflate.c create mode 100644 modules/filters/mod_deflate.dep create mode 100644 modules/filters/mod_deflate.dsp create mode 100644 modules/filters/mod_deflate.exp create mode 100644 modules/filters/mod_deflate.mak create mode 100644 modules/filters/mod_ext_filter.c create mode 100644 modules/filters/mod_ext_filter.dep create mode 100644 modules/filters/mod_ext_filter.dsp create mode 100644 modules/filters/mod_ext_filter.exp create mode 100644 modules/filters/mod_ext_filter.mak create mode 100644 modules/filters/mod_filter.c create mode 100644 modules/filters/mod_filter.dep create mode 100644 modules/filters/mod_filter.dsp create mode 100644 modules/filters/mod_filter.mak create mode 100644 modules/filters/mod_include.c create mode 100644 modules/filters/mod_include.dep create mode 100644 modules/filters/mod_include.dsp create mode 100644 modules/filters/mod_include.exp create mode 100644 modules/filters/mod_include.h create mode 100644 modules/filters/mod_include.mak create mode 100644 modules/filters/mod_proxy_html.c create mode 100644 modules/filters/mod_proxy_html.dep create mode 100644 modules/filters/mod_proxy_html.dsp create mode 100644 modules/filters/mod_proxy_html.mak create mode 100644 modules/filters/mod_ratelimit.c create mode 100644 modules/filters/mod_ratelimit.dep create mode 100644 modules/filters/mod_ratelimit.dsp create mode 100644 modules/filters/mod_ratelimit.h create mode 100644 modules/filters/mod_ratelimit.mak create mode 100644 modules/filters/mod_reflector.c create mode 100644 modules/filters/mod_reflector.dep create mode 100644 modules/filters/mod_reflector.dsp create mode 100644 modules/filters/mod_reflector.mak create mode 100644 modules/filters/mod_reqtimeout.c create mode 100644 modules/filters/mod_reqtimeout.dep create mode 100644 modules/filters/mod_reqtimeout.dsp create mode 100644 modules/filters/mod_reqtimeout.mak create mode 100644 modules/filters/mod_request.c create mode 100644 modules/filters/mod_request.dep create mode 100644 modules/filters/mod_request.dsp create mode 100644 modules/filters/mod_request.mak create mode 100644 modules/filters/mod_sed.c create mode 100644 modules/filters/mod_sed.dep create mode 100644 modules/filters/mod_sed.dsp create mode 100644 modules/filters/mod_sed.mak create mode 100644 modules/filters/mod_substitute.c create mode 100644 modules/filters/mod_substitute.dep create mode 100644 modules/filters/mod_substitute.dsp create mode 100644 modules/filters/mod_substitute.mak create mode 100644 modules/filters/mod_xml2enc.c create mode 100644 modules/filters/mod_xml2enc.dep create mode 100644 modules/filters/mod_xml2enc.dsp create mode 100644 modules/filters/mod_xml2enc.h create mode 100644 modules/filters/mod_xml2enc.mak create mode 100644 modules/filters/regexp.c create mode 100644 modules/filters/regexp.h create mode 100644 modules/filters/sed.h create mode 100644 modules/filters/sed0.c create mode 100644 modules/filters/sed1.c create mode 100644 modules/generators/.indent.pro create mode 100644 modules/generators/Makefile.in create mode 100644 modules/generators/NWGNUautoindex create mode 100644 modules/generators/NWGNUinfo create mode 100644 modules/generators/NWGNUmakefile create mode 100644 modules/generators/NWGNUmod_asis create mode 100644 modules/generators/NWGNUmod_cgi create mode 100644 modules/generators/NWGNUstatus create mode 100644 modules/generators/cgi_common.h create mode 100644 modules/generators/config5.m4 create mode 100644 modules/generators/mod_asis.c create mode 100644 modules/generators/mod_asis.dep create mode 100644 modules/generators/mod_asis.dsp create mode 100644 modules/generators/mod_asis.exp create mode 100644 modules/generators/mod_asis.mak create mode 100644 modules/generators/mod_autoindex.c create mode 100644 modules/generators/mod_autoindex.dep create mode 100644 modules/generators/mod_autoindex.dsp create mode 100644 modules/generators/mod_autoindex.exp create mode 100644 modules/generators/mod_autoindex.mak create mode 100644 modules/generators/mod_cgi.c create mode 100644 modules/generators/mod_cgi.dep create mode 100644 modules/generators/mod_cgi.dsp create mode 100644 modules/generators/mod_cgi.exp create mode 100644 modules/generators/mod_cgi.h create mode 100644 modules/generators/mod_cgi.mak create mode 100644 modules/generators/mod_cgid.c create mode 100644 modules/generators/mod_cgid.exp create mode 100644 modules/generators/mod_info.c create mode 100644 modules/generators/mod_info.dep create mode 100644 modules/generators/mod_info.dsp create mode 100644 modules/generators/mod_info.exp create mode 100644 modules/generators/mod_info.mak create mode 100644 modules/generators/mod_status.c create mode 100644 modules/generators/mod_status.dep create mode 100644 modules/generators/mod_status.dsp create mode 100644 modules/generators/mod_status.exp create mode 100644 modules/generators/mod_status.h create mode 100644 modules/generators/mod_status.mak create mode 100644 modules/generators/mod_suexec.c create mode 100644 modules/generators/mod_suexec.h create mode 100644 modules/http/.indent.pro create mode 100644 modules/http/Makefile.in create mode 100644 modules/http/byterange_filter.c create mode 100644 modules/http/chunk_filter.c create mode 100644 modules/http/config.m4 create mode 100644 modules/http/http_core.c create mode 100644 modules/http/http_etag.c create mode 100644 modules/http/http_filters.c create mode 100644 modules/http/http_protocol.c create mode 100644 modules/http/http_request.c create mode 100644 modules/http/mod_mime.c create mode 100644 modules/http/mod_mime.dep create mode 100644 modules/http/mod_mime.dsp create mode 100644 modules/http/mod_mime.exp create mode 100644 modules/http/mod_mime.mak create mode 100644 modules/http2/Makefile.in create mode 100644 modules/http2/NWGNUmakefile create mode 100644 modules/http2/NWGNUmod_http2 create mode 100644 modules/http2/NWGNUproxyht2 create mode 100644 modules/http2/README.h2 create mode 100644 modules/http2/config2.m4 create mode 100644 modules/http2/h2.h create mode 100644 modules/http2/h2_bucket_beam.c create mode 100644 modules/http2/h2_bucket_beam.h create mode 100644 modules/http2/h2_bucket_eos.c create mode 100644 modules/http2/h2_bucket_eos.h create mode 100644 modules/http2/h2_c1.c create mode 100644 modules/http2/h2_c1.h create mode 100644 modules/http2/h2_c1_io.c create mode 100644 modules/http2/h2_c1_io.h create mode 100644 modules/http2/h2_c2.c create mode 100644 modules/http2/h2_c2.h create mode 100644 modules/http2/h2_c2_filter.c create mode 100644 modules/http2/h2_c2_filter.h create mode 100644 modules/http2/h2_config.c create mode 100644 modules/http2/h2_config.h create mode 100644 modules/http2/h2_conn_ctx.c create mode 100644 modules/http2/h2_conn_ctx.h create mode 100644 modules/http2/h2_headers.c create mode 100644 modules/http2/h2_headers.h create mode 100644 modules/http2/h2_mplx.c create mode 100644 modules/http2/h2_mplx.h create mode 100644 modules/http2/h2_private.h create mode 100644 modules/http2/h2_protocol.c create mode 100644 modules/http2/h2_protocol.h create mode 100644 modules/http2/h2_proxy_session.c create mode 100644 modules/http2/h2_proxy_session.h create mode 100644 modules/http2/h2_proxy_util.c create mode 100644 modules/http2/h2_proxy_util.h create mode 100644 modules/http2/h2_push.c create mode 100644 modules/http2/h2_push.h create mode 100644 modules/http2/h2_request.c create mode 100644 modules/http2/h2_request.h create mode 100644 modules/http2/h2_session.c create mode 100644 modules/http2/h2_session.h create mode 100644 modules/http2/h2_stream.c create mode 100644 modules/http2/h2_stream.h create mode 100644 modules/http2/h2_switch.c create mode 100644 modules/http2/h2_switch.h create mode 100644 modules/http2/h2_util.c create mode 100644 modules/http2/h2_util.h create mode 100644 modules/http2/h2_version.h create mode 100644 modules/http2/h2_workers.c create mode 100644 modules/http2/h2_workers.h create mode 100644 modules/http2/h2_ws.c create mode 100644 modules/http2/h2_ws.h create mode 100644 modules/http2/mod_http2.c create mode 100644 modules/http2/mod_http2.dep create mode 100644 modules/http2/mod_http2.dsp create mode 100644 modules/http2/mod_http2.h create mode 100644 modules/http2/mod_http2.mak create mode 100644 modules/http2/mod_proxy_http2.c create mode 100644 modules/http2/mod_proxy_http2.dep create mode 100644 modules/http2/mod_proxy_http2.dsp create mode 100644 modules/http2/mod_proxy_http2.h create mode 100644 modules/http2/mod_proxy_http2.mak create mode 100644 modules/ldap/Makefile.in create mode 100644 modules/ldap/NWGNUmakefile create mode 100644 modules/ldap/README.ldap create mode 100644 modules/ldap/config.m4 create mode 100644 modules/ldap/mod_ldap.dep create mode 100644 modules/ldap/mod_ldap.dsp create mode 100644 modules/ldap/mod_ldap.mak create mode 100644 modules/ldap/util_ldap.c create mode 100644 modules/ldap/util_ldap_cache.c create mode 100644 modules/ldap/util_ldap_cache.h create mode 100644 modules/ldap/util_ldap_cache_mgr.c create mode 100644 modules/loggers/.indent.pro create mode 100644 modules/loggers/Makefile.in create mode 100644 modules/loggers/NWGNUforensic create mode 100644 modules/loggers/NWGNUlogdebug create mode 100644 modules/loggers/NWGNUmakefile create mode 100644 modules/loggers/NWGNUmodlogio create mode 100644 modules/loggers/config.m4 create mode 100644 modules/loggers/mod_log_config.c create mode 100644 modules/loggers/mod_log_config.dep create mode 100644 modules/loggers/mod_log_config.dsp create mode 100644 modules/loggers/mod_log_config.exp create mode 100644 modules/loggers/mod_log_config.h create mode 100644 modules/loggers/mod_log_config.mak create mode 100644 modules/loggers/mod_log_debug.c create mode 100644 modules/loggers/mod_log_debug.dep create mode 100644 modules/loggers/mod_log_debug.dsp create mode 100644 modules/loggers/mod_log_debug.mak create mode 100644 modules/loggers/mod_log_forensic.c create mode 100644 modules/loggers/mod_log_forensic.dep create mode 100644 modules/loggers/mod_log_forensic.dsp create mode 100644 modules/loggers/mod_log_forensic.exp create mode 100644 modules/loggers/mod_log_forensic.mak create mode 100644 modules/loggers/mod_logio.c create mode 100644 modules/loggers/mod_logio.dep create mode 100644 modules/loggers/mod_logio.dsp create mode 100644 modules/loggers/mod_logio.mak create mode 100644 modules/lua/Makefile.in create mode 100644 modules/lua/NWGNUmakefile create mode 100644 modules/lua/README create mode 100644 modules/lua/config.m4 create mode 100644 modules/lua/docs/README create mode 100644 modules/lua/docs/basic-configuration.txt create mode 100644 modules/lua/docs/building-from-subversion.txt create mode 100644 modules/lua/docs/running-developer-tests.txt create mode 100644 modules/lua/docs/writing-handlers.txt create mode 100644 modules/lua/lua_apr.c create mode 100644 modules/lua/lua_apr.h create mode 100644 modules/lua/lua_config.c create mode 100644 modules/lua/lua_config.h create mode 100644 modules/lua/lua_dbd.c create mode 100644 modules/lua/lua_dbd.h create mode 100644 modules/lua/lua_passwd.c create mode 100644 modules/lua/lua_passwd.h create mode 100644 modules/lua/lua_request.c create mode 100644 modules/lua/lua_request.h create mode 100644 modules/lua/lua_vmprep.c create mode 100644 modules/lua/lua_vmprep.h create mode 100644 modules/lua/mod_lua.c create mode 100644 modules/lua/mod_lua.dep create mode 100644 modules/lua/mod_lua.dsp create mode 100644 modules/lua/mod_lua.h create mode 100644 modules/lua/mod_lua.mak create mode 100644 modules/lua/test/helpers.lua create mode 100644 modules/lua/test/htdocs/config_tests.lua create mode 100644 modules/lua/test/htdocs/filters.lua create mode 100644 modules/lua/test/htdocs/find_me.txt create mode 100644 modules/lua/test/htdocs/headers.lua create mode 100644 modules/lua/test/htdocs/hooks.lua create mode 100644 modules/lua/test/htdocs/other.lua create mode 100644 modules/lua/test/htdocs/simple.lua create mode 100644 modules/lua/test/htdocs/test.lua create mode 100644 modules/lua/test/lib/kangaroo.lua create mode 100644 modules/lua/test/moonunit.lua create mode 100755 modules/lua/test/test.lua create mode 100644 modules/lua/test/test_httpd.conf create mode 100644 modules/mappers/.indent.pro create mode 100644 modules/mappers/Makefile.in create mode 100644 modules/mappers/NWGNUactions create mode 100644 modules/mappers/NWGNUimagemap create mode 100644 modules/mappers/NWGNUmakefile create mode 100644 modules/mappers/NWGNUrewrite create mode 100644 modules/mappers/NWGNUspeling create mode 100644 modules/mappers/NWGNUuserdir create mode 100644 modules/mappers/NWGNUvhost create mode 100644 modules/mappers/config9.m4 create mode 100644 modules/mappers/mod_actions.c create mode 100644 modules/mappers/mod_actions.dep create mode 100644 modules/mappers/mod_actions.dsp create mode 100644 modules/mappers/mod_actions.exp create mode 100644 modules/mappers/mod_actions.mak create mode 100644 modules/mappers/mod_alias.c create mode 100644 modules/mappers/mod_alias.dep create mode 100644 modules/mappers/mod_alias.dsp create mode 100644 modules/mappers/mod_alias.exp create mode 100644 modules/mappers/mod_alias.mak create mode 100644 modules/mappers/mod_dir.c create mode 100644 modules/mappers/mod_dir.dep create mode 100644 modules/mappers/mod_dir.dsp create mode 100644 modules/mappers/mod_dir.exp create mode 100644 modules/mappers/mod_dir.mak create mode 100644 modules/mappers/mod_imagemap.c create mode 100644 modules/mappers/mod_imagemap.dep create mode 100644 modules/mappers/mod_imagemap.dsp create mode 100644 modules/mappers/mod_imagemap.exp create mode 100644 modules/mappers/mod_imagemap.mak create mode 100644 modules/mappers/mod_negotiation.c create mode 100644 modules/mappers/mod_negotiation.dep create mode 100644 modules/mappers/mod_negotiation.dsp create mode 100644 modules/mappers/mod_negotiation.exp create mode 100644 modules/mappers/mod_negotiation.mak create mode 100644 modules/mappers/mod_rewrite.c create mode 100644 modules/mappers/mod_rewrite.dep create mode 100644 modules/mappers/mod_rewrite.dsp create mode 100644 modules/mappers/mod_rewrite.exp create mode 100644 modules/mappers/mod_rewrite.h create mode 100644 modules/mappers/mod_rewrite.mak create mode 100644 modules/mappers/mod_speling.c create mode 100644 modules/mappers/mod_speling.dep create mode 100644 modules/mappers/mod_speling.dsp create mode 100644 modules/mappers/mod_speling.exp create mode 100644 modules/mappers/mod_speling.mak create mode 100644 modules/mappers/mod_userdir.c create mode 100644 modules/mappers/mod_userdir.dep create mode 100644 modules/mappers/mod_userdir.dsp create mode 100644 modules/mappers/mod_userdir.exp create mode 100644 modules/mappers/mod_userdir.mak create mode 100644 modules/mappers/mod_vhost_alias.c create mode 100644 modules/mappers/mod_vhost_alias.dep create mode 100644 modules/mappers/mod_vhost_alias.dsp create mode 100644 modules/mappers/mod_vhost_alias.exp create mode 100644 modules/mappers/mod_vhost_alias.mak create mode 100644 modules/md/Makefile.in create mode 100644 modules/md/config2.m4 create mode 100644 modules/md/md.h create mode 100644 modules/md/md_acme.c create mode 100644 modules/md/md_acme.h create mode 100644 modules/md/md_acme_acct.c create mode 100644 modules/md/md_acme_acct.h create mode 100644 modules/md/md_acme_authz.c create mode 100644 modules/md/md_acme_authz.h create mode 100644 modules/md/md_acme_drive.c create mode 100644 modules/md/md_acme_drive.h create mode 100644 modules/md/md_acme_order.c create mode 100644 modules/md/md_acme_order.h create mode 100644 modules/md/md_acmev2_drive.c create mode 100644 modules/md/md_acmev2_drive.h create mode 100644 modules/md/md_core.c create mode 100644 modules/md/md_crypt.c create mode 100644 modules/md/md_crypt.h create mode 100644 modules/md/md_curl.c create mode 100644 modules/md/md_curl.h create mode 100644 modules/md/md_event.c create mode 100644 modules/md/md_event.h create mode 100644 modules/md/md_http.c create mode 100644 modules/md/md_http.h create mode 100644 modules/md/md_json.c create mode 100644 modules/md/md_json.h create mode 100644 modules/md/md_jws.c create mode 100644 modules/md/md_jws.h create mode 100644 modules/md/md_log.c create mode 100644 modules/md/md_log.h create mode 100644 modules/md/md_ocsp.c create mode 100644 modules/md/md_ocsp.h create mode 100644 modules/md/md_reg.c create mode 100644 modules/md/md_reg.h create mode 100644 modules/md/md_result.c create mode 100644 modules/md/md_result.h create mode 100644 modules/md/md_status.c create mode 100644 modules/md/md_status.h create mode 100644 modules/md/md_store.c create mode 100644 modules/md/md_store.h create mode 100644 modules/md/md_store_fs.c create mode 100644 modules/md/md_store_fs.h create mode 100644 modules/md/md_tailscale.c create mode 100644 modules/md/md_tailscale.h create mode 100644 modules/md/md_time.c create mode 100644 modules/md/md_time.h create mode 100644 modules/md/md_util.c create mode 100644 modules/md/md_util.h create mode 100644 modules/md/md_version.h create mode 100644 modules/md/mod_md.c create mode 100644 modules/md/mod_md.dep create mode 100644 modules/md/mod_md.dsp create mode 100644 modules/md/mod_md.h create mode 100644 modules/md/mod_md.mak create mode 100644 modules/md/mod_md_config.c create mode 100644 modules/md/mod_md_config.h create mode 100644 modules/md/mod_md_drive.c create mode 100644 modules/md/mod_md_drive.h create mode 100644 modules/md/mod_md_ocsp.c create mode 100644 modules/md/mod_md_ocsp.h create mode 100644 modules/md/mod_md_os.c create mode 100644 modules/md/mod_md_os.h create mode 100644 modules/md/mod_md_private.h create mode 100644 modules/md/mod_md_status.c create mode 100644 modules/md/mod_md_status.h create mode 100644 modules/metadata/.indent.pro create mode 100644 modules/metadata/Makefile.in create mode 100644 modules/metadata/NWGNUcernmeta create mode 100644 modules/metadata/NWGNUexpires create mode 100644 modules/metadata/NWGNUheaders create mode 100644 modules/metadata/NWGNUmakefile create mode 100644 modules/metadata/NWGNUmimemagi create mode 100644 modules/metadata/NWGNUmodident create mode 100644 modules/metadata/NWGNUmodversion create mode 100644 modules/metadata/NWGNUremoteip create mode 100644 modules/metadata/NWGNUuniqueid create mode 100644 modules/metadata/NWGNUusertrk create mode 100644 modules/metadata/config.m4 create mode 100644 modules/metadata/mod_cern_meta.c create mode 100644 modules/metadata/mod_cern_meta.dep create mode 100644 modules/metadata/mod_cern_meta.dsp create mode 100644 modules/metadata/mod_cern_meta.exp create mode 100644 modules/metadata/mod_cern_meta.mak create mode 100644 modules/metadata/mod_env.c create mode 100644 modules/metadata/mod_env.dep create mode 100644 modules/metadata/mod_env.dsp create mode 100644 modules/metadata/mod_env.exp create mode 100644 modules/metadata/mod_env.mak create mode 100644 modules/metadata/mod_expires.c create mode 100644 modules/metadata/mod_expires.dep create mode 100644 modules/metadata/mod_expires.dsp create mode 100644 modules/metadata/mod_expires.exp create mode 100644 modules/metadata/mod_expires.mak create mode 100644 modules/metadata/mod_headers.c create mode 100644 modules/metadata/mod_headers.dep create mode 100644 modules/metadata/mod_headers.dsp create mode 100644 modules/metadata/mod_headers.exp create mode 100644 modules/metadata/mod_headers.mak create mode 100644 modules/metadata/mod_ident.c create mode 100644 modules/metadata/mod_ident.dep create mode 100644 modules/metadata/mod_ident.dsp create mode 100644 modules/metadata/mod_ident.exp create mode 100644 modules/metadata/mod_ident.mak create mode 100644 modules/metadata/mod_mime_magic.c create mode 100644 modules/metadata/mod_mime_magic.dep create mode 100644 modules/metadata/mod_mime_magic.dsp create mode 100644 modules/metadata/mod_mime_magic.exp create mode 100644 modules/metadata/mod_mime_magic.mak create mode 100644 modules/metadata/mod_remoteip.c create mode 100644 modules/metadata/mod_remoteip.dep create mode 100644 modules/metadata/mod_remoteip.dsp create mode 100644 modules/metadata/mod_remoteip.mak create mode 100644 modules/metadata/mod_setenvif.c create mode 100644 modules/metadata/mod_setenvif.dep create mode 100644 modules/metadata/mod_setenvif.dsp create mode 100644 modules/metadata/mod_setenvif.exp create mode 100644 modules/metadata/mod_setenvif.mak create mode 100644 modules/metadata/mod_unique_id.c create mode 100644 modules/metadata/mod_unique_id.dep create mode 100644 modules/metadata/mod_unique_id.dsp create mode 100644 modules/metadata/mod_unique_id.exp create mode 100644 modules/metadata/mod_unique_id.mak create mode 100644 modules/metadata/mod_usertrack.c create mode 100644 modules/metadata/mod_usertrack.dep create mode 100644 modules/metadata/mod_usertrack.dsp create mode 100644 modules/metadata/mod_usertrack.exp create mode 100644 modules/metadata/mod_usertrack.mak create mode 100644 modules/metadata/mod_version.c create mode 100644 modules/metadata/mod_version.dep create mode 100644 modules/metadata/mod_version.dsp create mode 100644 modules/metadata/mod_version.exp create mode 100644 modules/metadata/mod_version.mak create mode 100644 modules/proxy/.indent.pro create mode 100644 modules/proxy/CHANGES create mode 100644 modules/proxy/Makefile.in create mode 100644 modules/proxy/NWGNUmakefile create mode 100644 modules/proxy/NWGNUproxy create mode 100644 modules/proxy/NWGNUproxyajp create mode 100644 modules/proxy/NWGNUproxybalancer create mode 100644 modules/proxy/NWGNUproxycon create mode 100644 modules/proxy/NWGNUproxyexpress create mode 100644 modules/proxy/NWGNUproxyfcgi create mode 100644 modules/proxy/NWGNUproxyftp create mode 100644 modules/proxy/NWGNUproxyhcheck create mode 100644 modules/proxy/NWGNUproxyhtp create mode 100644 modules/proxy/NWGNUproxylbm_busy create mode 100644 modules/proxy/NWGNUproxylbm_hb create mode 100644 modules/proxy/NWGNUproxylbm_req create mode 100644 modules/proxy/NWGNUproxylbm_traf create mode 100644 modules/proxy/NWGNUproxyscgi create mode 100644 modules/proxy/NWGNUproxywstunnel create mode 100644 modules/proxy/ajp.h create mode 100644 modules/proxy/ajp_header.c create mode 100644 modules/proxy/ajp_header.h create mode 100644 modules/proxy/ajp_link.c create mode 100644 modules/proxy/ajp_msg.c create mode 100644 modules/proxy/ajp_utils.c create mode 100644 modules/proxy/balancers/Makefile.in create mode 100644 modules/proxy/balancers/config2.m4 create mode 100644 modules/proxy/balancers/mod_lbmethod_bybusyness.c create mode 100644 modules/proxy/balancers/mod_lbmethod_bybusyness.dep create mode 100644 modules/proxy/balancers/mod_lbmethod_bybusyness.dsp create mode 100644 modules/proxy/balancers/mod_lbmethod_bybusyness.mak create mode 100644 modules/proxy/balancers/mod_lbmethod_byrequests.c create mode 100644 modules/proxy/balancers/mod_lbmethod_byrequests.dep create mode 100644 modules/proxy/balancers/mod_lbmethod_byrequests.dsp create mode 100644 modules/proxy/balancers/mod_lbmethod_byrequests.mak create mode 100644 modules/proxy/balancers/mod_lbmethod_bytraffic.c create mode 100644 modules/proxy/balancers/mod_lbmethod_bytraffic.dep create mode 100644 modules/proxy/balancers/mod_lbmethod_bytraffic.dsp create mode 100644 modules/proxy/balancers/mod_lbmethod_bytraffic.mak create mode 100644 modules/proxy/balancers/mod_lbmethod_heartbeat.c create mode 100644 modules/proxy/balancers/mod_lbmethod_heartbeat.dep create mode 100644 modules/proxy/balancers/mod_lbmethod_heartbeat.dsp create mode 100644 modules/proxy/balancers/mod_lbmethod_heartbeat.mak create mode 100644 modules/proxy/config.m4 create mode 100644 modules/proxy/libproxy.exp create mode 100644 modules/proxy/mod_proxy.c create mode 100644 modules/proxy/mod_proxy.dep create mode 100644 modules/proxy/mod_proxy.dsp create mode 100644 modules/proxy/mod_proxy.h create mode 100644 modules/proxy/mod_proxy.mak create mode 100644 modules/proxy/mod_proxy_ajp.c create mode 100644 modules/proxy/mod_proxy_ajp.dep create mode 100644 modules/proxy/mod_proxy_ajp.dsp create mode 100644 modules/proxy/mod_proxy_ajp.mak create mode 100644 modules/proxy/mod_proxy_balancer.c create mode 100644 modules/proxy/mod_proxy_balancer.dep create mode 100644 modules/proxy/mod_proxy_balancer.dsp create mode 100644 modules/proxy/mod_proxy_balancer.mak create mode 100644 modules/proxy/mod_proxy_connect.c create mode 100644 modules/proxy/mod_proxy_connect.dep create mode 100644 modules/proxy/mod_proxy_connect.dsp create mode 100644 modules/proxy/mod_proxy_connect.mak create mode 100644 modules/proxy/mod_proxy_express.c create mode 100644 modules/proxy/mod_proxy_express.dep create mode 100644 modules/proxy/mod_proxy_express.dsp create mode 100644 modules/proxy/mod_proxy_express.mak create mode 100644 modules/proxy/mod_proxy_fcgi.c create mode 100644 modules/proxy/mod_proxy_fcgi.dep create mode 100644 modules/proxy/mod_proxy_fcgi.dsp create mode 100644 modules/proxy/mod_proxy_fcgi.mak create mode 100644 modules/proxy/mod_proxy_fdpass.c create mode 100644 modules/proxy/mod_proxy_fdpass.h create mode 100644 modules/proxy/mod_proxy_ftp.c create mode 100644 modules/proxy/mod_proxy_ftp.dep create mode 100644 modules/proxy/mod_proxy_ftp.dsp create mode 100644 modules/proxy/mod_proxy_ftp.mak create mode 100644 modules/proxy/mod_proxy_hcheck.c create mode 100644 modules/proxy/mod_proxy_hcheck.dep create mode 100644 modules/proxy/mod_proxy_hcheck.dsp create mode 100644 modules/proxy/mod_proxy_hcheck.mak create mode 100644 modules/proxy/mod_proxy_http.c create mode 100644 modules/proxy/mod_proxy_http.dep create mode 100644 modules/proxy/mod_proxy_http.dsp create mode 100644 modules/proxy/mod_proxy_http.mak create mode 100644 modules/proxy/mod_proxy_scgi.c create mode 100644 modules/proxy/mod_proxy_scgi.dep create mode 100644 modules/proxy/mod_proxy_scgi.dsp create mode 100644 modules/proxy/mod_proxy_scgi.mak create mode 100644 modules/proxy/mod_proxy_uwsgi.c create mode 100644 modules/proxy/mod_proxy_uwsgi.dep create mode 100644 modules/proxy/mod_proxy_uwsgi.dsp create mode 100644 modules/proxy/mod_proxy_uwsgi.mak create mode 100644 modules/proxy/mod_proxy_wstunnel.c create mode 100644 modules/proxy/mod_proxy_wstunnel.dep create mode 100644 modules/proxy/mod_proxy_wstunnel.dsp create mode 100644 modules/proxy/mod_proxy_wstunnel.mak create mode 100644 modules/proxy/proxy_util.c create mode 100644 modules/proxy/proxy_util.h create mode 100644 modules/proxy/scgi.h create mode 100644 modules/session/Makefile.in create mode 100644 modules/session/NWGNUmakefile create mode 100644 modules/session/NWGNUsession create mode 100644 modules/session/NWGNUsession_cookie create mode 100644 modules/session/NWGNUsession_crypto create mode 100644 modules/session/NWGNUsession_dbd create mode 100644 modules/session/config.m4 create mode 100644 modules/session/mod_session.c create mode 100644 modules/session/mod_session.dep create mode 100644 modules/session/mod_session.dsp create mode 100644 modules/session/mod_session.h create mode 100644 modules/session/mod_session.mak create mode 100644 modules/session/mod_session_cookie.c create mode 100644 modules/session/mod_session_cookie.dep create mode 100644 modules/session/mod_session_cookie.dsp create mode 100644 modules/session/mod_session_cookie.mak create mode 100644 modules/session/mod_session_crypto.c create mode 100644 modules/session/mod_session_crypto.dep create mode 100644 modules/session/mod_session_crypto.dsp create mode 100644 modules/session/mod_session_crypto.mak create mode 100644 modules/session/mod_session_dbd.c create mode 100644 modules/session/mod_session_dbd.dep create mode 100644 modules/session/mod_session_dbd.dsp create mode 100644 modules/session/mod_session_dbd.mak create mode 100644 modules/slotmem/Makefile.in create mode 100644 modules/slotmem/NWGNUmakefile create mode 100644 modules/slotmem/NWGNUslotmem_plain create mode 100644 modules/slotmem/NWGNUslotmem_shm create mode 100644 modules/slotmem/config.m4 create mode 100644 modules/slotmem/mod_slotmem_plain.c create mode 100644 modules/slotmem/mod_slotmem_plain.dep create mode 100644 modules/slotmem/mod_slotmem_plain.dsp create mode 100644 modules/slotmem/mod_slotmem_plain.mak create mode 100644 modules/slotmem/mod_slotmem_shm.c create mode 100644 modules/slotmem/mod_slotmem_shm.dep create mode 100644 modules/slotmem/mod_slotmem_shm.dsp create mode 100644 modules/slotmem/mod_slotmem_shm.mak create mode 100644 modules/ssl/Makefile.in create mode 100644 modules/ssl/NWGNUmakefile create mode 100644 modules/ssl/README create mode 100644 modules/ssl/README.dsov.fig create mode 100644 modules/ssl/README.dsov.ps create mode 100644 modules/ssl/config.m4 create mode 100644 modules/ssl/mod_ssl.c create mode 100644 modules/ssl/mod_ssl.dep create mode 100644 modules/ssl/mod_ssl.dsp create mode 100644 modules/ssl/mod_ssl.h create mode 100644 modules/ssl/mod_ssl.mak create mode 100644 modules/ssl/mod_ssl_openssl.h create mode 100644 modules/ssl/ssl_engine_config.c create mode 100644 modules/ssl/ssl_engine_init.c create mode 100644 modules/ssl/ssl_engine_io.c create mode 100644 modules/ssl/ssl_engine_kernel.c create mode 100644 modules/ssl/ssl_engine_log.c create mode 100644 modules/ssl/ssl_engine_mutex.c create mode 100644 modules/ssl/ssl_engine_ocsp.c create mode 100644 modules/ssl/ssl_engine_pphrase.c create mode 100644 modules/ssl/ssl_engine_rand.c create mode 100644 modules/ssl/ssl_engine_vars.c create mode 100644 modules/ssl/ssl_private.h create mode 100644 modules/ssl/ssl_scache.c create mode 100644 modules/ssl/ssl_util.c create mode 100644 modules/ssl/ssl_util_ocsp.c create mode 100644 modules/ssl/ssl_util_ssl.c create mode 100644 modules/ssl/ssl_util_ssl.h create mode 100644 modules/ssl/ssl_util_stapling.c create mode 100644 modules/test/.indent.pro create mode 100644 modules/test/Makefile.in create mode 100644 modules/test/NWGNUmakefile create mode 100644 modules/test/NWGNUoptfnexport create mode 100644 modules/test/NWGNUoptfnimport create mode 100644 modules/test/NWGNUopthookexport create mode 100644 modules/test/NWGNUopthookimport create mode 100644 modules/test/README create mode 100644 modules/test/config.m4 create mode 100644 modules/test/mod_dialup.c create mode 100644 modules/test/mod_optional_fn_export.c create mode 100644 modules/test/mod_optional_fn_export.h create mode 100644 modules/test/mod_optional_fn_import.c create mode 100644 modules/test/mod_optional_hook_export.c create mode 100644 modules/test/mod_optional_hook_export.h create mode 100644 modules/test/mod_optional_hook_import.c create mode 100644 os/.indent.pro create mode 100644 os/Makefile.in create mode 100644 os/bs2000/ebcdic.c create mode 100644 os/bs2000/ebcdic.h create mode 100644 os/bs2000/os.c create mode 100644 os/bs2000/os.h create mode 100644 os/config.m4 create mode 100644 os/netware/apache.xdc create mode 100644 os/netware/modules.c create mode 100644 os/netware/netware_config_layout.h create mode 100644 os/netware/os.h create mode 100644 os/netware/pre_nw.h create mode 100644 os/netware/util_nw.c create mode 100644 os/os2/Makefile.in create mode 100644 os/os2/config.m4 create mode 100644 os/os2/core.mk create mode 100644 os/os2/core_header.def create mode 100644 os/os2/os.h create mode 100644 os/os2/util_os2.c create mode 100644 os/unix/Makefile.in create mode 100644 os/unix/config.m4 create mode 100644 os/unix/os.h create mode 100644 os/unix/unixd.c create mode 100644 os/unix/unixd.h create mode 100644 os/win32/BaseAddr.ref create mode 100644 os/win32/Makefile.in create mode 100644 os/win32/ap_regkey.c create mode 100644 os/win32/modules.c create mode 100644 os/win32/os.h create mode 100644 os/win32/util_win32.c create mode 100644 os/win32/win32_config_layout.h create mode 100644 server/.indent.pro create mode 100644 server/Makefile.in create mode 100644 server/NWGNUmakefile create mode 100644 server/buildmark.c create mode 100644 server/config.c create mode 100644 server/config.m4 create mode 100644 server/connection.c create mode 100644 server/core.c create mode 100644 server/core_filters.c create mode 100644 server/eoc_bucket.c create mode 100644 server/eor_bucket.c create mode 100644 server/error_bucket.c create mode 100644 server/gen_test_char.c create mode 100644 server/gen_test_char.dep create mode 100644 server/gen_test_char.dsp create mode 100644 server/gen_test_char.mak create mode 100644 server/listen.c create mode 100644 server/log.c create mode 100644 server/main.c create mode 100644 server/mpm/MPM.NAMING create mode 100644 server/mpm/Makefile.in create mode 100644 server/mpm/config.m4 create mode 100644 server/mpm/config2.m4 create mode 100644 server/mpm/event/Makefile.in create mode 100644 server/mpm/event/config.m4 create mode 100644 server/mpm/event/config3.m4 create mode 100644 server/mpm/event/event.c create mode 100644 server/mpm/event/mpm_default.h create mode 100644 server/mpm/mpmt_os2/Makefile.in create mode 100644 server/mpm/mpmt_os2/config.m4 create mode 100644 server/mpm/mpmt_os2/config5.m4 create mode 100644 server/mpm/mpmt_os2/mpm_default.h create mode 100644 server/mpm/mpmt_os2/mpmt_os2.c create mode 100644 server/mpm/mpmt_os2/mpmt_os2_child.c create mode 100644 server/mpm/netware/mpm_default.h create mode 100644 server/mpm/netware/mpm_netware.c create mode 100644 server/mpm/prefork/Makefile.in create mode 100644 server/mpm/prefork/config.m4 create mode 100644 server/mpm/prefork/config3.m4 create mode 100644 server/mpm/prefork/mpm_default.h create mode 100644 server/mpm/prefork/prefork.c create mode 100644 server/mpm/winnt/Makefile.in create mode 100644 server/mpm/winnt/child.c create mode 100644 server/mpm/winnt/config.m4 create mode 100644 server/mpm/winnt/config3.m4 create mode 100644 server/mpm/winnt/mpm_default.h create mode 100644 server/mpm/winnt/mpm_winnt.c create mode 100644 server/mpm/winnt/mpm_winnt.h create mode 100644 server/mpm/winnt/nt_eventlog.c create mode 100644 server/mpm/winnt/service.c create mode 100644 server/mpm/worker/Makefile.in create mode 100644 server/mpm/worker/config.m4 create mode 100644 server/mpm/worker/config3.m4 create mode 100644 server/mpm/worker/mpm_default.h create mode 100644 server/mpm/worker/worker.c create mode 100644 server/mpm_common.c create mode 100644 server/mpm_fdqueue.c create mode 100644 server/mpm_fdqueue.h create mode 100644 server/mpm_unix.c create mode 100644 server/protocol.c create mode 100644 server/provider.c create mode 100644 server/request.c create mode 100644 server/scoreboard.c create mode 100644 server/ssl.c create mode 100644 server/util.c create mode 100644 server/util_cfgtree.c create mode 100644 server/util_charset.c create mode 100644 server/util_cookies.c create mode 100644 server/util_debug.c create mode 100644 server/util_ebcdic.c create mode 100644 server/util_expr_eval.c create mode 100644 server/util_expr_parse.c create mode 100644 server/util_expr_parse.h create mode 100644 server/util_expr_parse.y create mode 100644 server/util_expr_private.h create mode 100644 server/util_expr_scan.c create mode 100644 server/util_expr_scan.l create mode 100644 server/util_fcgi.c create mode 100644 server/util_filter.c create mode 100644 server/util_md5.c create mode 100644 server/util_mutex.c create mode 100644 server/util_pcre.c create mode 100644 server/util_regex.c create mode 100644 server/util_script.c create mode 100644 server/util_time.c create mode 100644 server/util_xml.c create mode 100644 server/vhost.c create mode 100644 srclib/Makefile.in create mode 100644 support/.indent.pro create mode 100644 support/Makefile.in create mode 100644 support/NWGNUab create mode 100644 support/NWGNUhtcacheclean create mode 100644 support/NWGNUhtdbm create mode 100644 support/NWGNUhtdigest create mode 100644 support/NWGNUhtpasswd create mode 100644 support/NWGNUhttxt2dbm create mode 100644 support/NWGNUlogres create mode 100644 support/NWGNUmakefile create mode 100644 support/NWGNUrotlogs create mode 100644 support/README create mode 100644 support/SHA1/README.sha1 create mode 100644 support/SHA1/convert-sha1.pl create mode 100644 support/SHA1/htpasswd-sha1.pl create mode 100644 support/SHA1/ldif-sha1.example create mode 100644 support/ab.c create mode 100644 support/ab.dep create mode 100644 support/ab.dsp create mode 100644 support/ab.mak create mode 100644 support/abs.dep create mode 100644 support/abs.dsp create mode 100644 support/abs.mak create mode 100644 support/apachectl.in create mode 100644 support/apxs.in create mode 100755 support/check_forensic create mode 100644 support/checkgid.c create mode 100644 support/config.m4 create mode 100644 support/dbmmanage.in create mode 100644 support/envvars-std.in create mode 100644 support/fcgistarter.c create mode 100644 support/fcgistarter.dep create mode 100644 support/fcgistarter.dsp create mode 100644 support/fcgistarter.mak create mode 100644 support/htcacheclean.c create mode 100644 support/htcacheclean.dep create mode 100644 support/htcacheclean.dsp create mode 100644 support/htcacheclean.mak create mode 100644 support/htdbm.c create mode 100644 support/htdbm.dep create mode 100644 support/htdbm.dsp create mode 100644 support/htdbm.mak create mode 100644 support/htdigest.c create mode 100644 support/htdigest.dep create mode 100644 support/htdigest.dsp create mode 100644 support/htdigest.mak create mode 100644 support/htpasswd.c create mode 100644 support/htpasswd.dep create mode 100644 support/htpasswd.dsp create mode 100644 support/htpasswd.mak create mode 100644 support/httxt2dbm.c create mode 100644 support/httxt2dbm.dep create mode 100644 support/httxt2dbm.dsp create mode 100644 support/httxt2dbm.mak create mode 100755 support/list_hooks.pl create mode 100644 support/log_server_status.in create mode 100644 support/logresolve.c create mode 100644 support/logresolve.dep create mode 100644 support/logresolve.dsp create mode 100644 support/logresolve.mak create mode 100644 support/logresolve.pl.in create mode 100644 support/passwd_common.c create mode 100644 support/passwd_common.h create mode 100644 support/phf_abuse_log.cgi.in create mode 100644 support/rotatelogs.c create mode 100644 support/rotatelogs.dep create mode 100644 support/rotatelogs.dsp create mode 100644 support/rotatelogs.mak create mode 100644 support/split-logfile.in create mode 100644 support/suexec.c create mode 100644 support/suexec.h create mode 100644 support/win32/ApacheMonitor.c create mode 100644 support/win32/ApacheMonitor.dep create mode 100644 support/win32/ApacheMonitor.dsp create mode 100644 support/win32/ApacheMonitor.h create mode 100644 support/win32/ApacheMonitor.ico create mode 100644 support/win32/ApacheMonitor.mak create mode 100644 support/win32/ApacheMonitor.manifest create mode 100644 support/win32/ApacheMonitor.rc create mode 100644 support/win32/apache_header.bmp create mode 100644 support/win32/aprun.ico create mode 100644 support/win32/apstop.ico create mode 100644 support/win32/srun.bmp create mode 100644 support/win32/sstop.bmp create mode 100644 support/win32/wintty.c create mode 100644 support/win32/wintty.dep create mode 100644 support/win32/wintty.dsp create mode 100644 support/win32/wintty.mak create mode 100644 test/.indent.pro create mode 100644 test/Makefile.in create mode 100644 test/README create mode 100644 test/README.ci create mode 100644 test/README.pytest create mode 100644 test/check_chunked create mode 100644 test/clients/.gitignore create mode 100644 test/clients/Makefile.in create mode 100644 test/clients/h2ws.c create mode 100644 test/cls.c create mode 100644 test/conftest.py create mode 100644 test/make_sni.sh create mode 100644 test/modules/core/__init__.py create mode 100644 test/modules/core/conftest.py create mode 100644 test/modules/core/env.py create mode 100644 test/modules/core/test_001_encoding.py create mode 100644 test/modules/core/test_002_restarts.py create mode 100644 test/modules/http1/__init__.py create mode 100644 test/modules/http1/conftest.py create mode 100644 test/modules/http1/env.py create mode 100644 test/modules/http1/htdocs/cgi/files/empty.txt create mode 100755 test/modules/http1/htdocs/cgi/hello.py create mode 100644 test/modules/http1/htdocs/cgi/requestparser.py create mode 100755 test/modules/http1/htdocs/cgi/upload.py create mode 100644 test/modules/http1/mod_h1test/mod_h1test.c create mode 100644 test/modules/http1/mod_h1test/mod_h1test.slo create mode 100644 test/modules/http1/test_001_alive.py create mode 100644 test/modules/http1/test_003_get.py create mode 100644 test/modules/http1/test_004_post.py create mode 100644 test/modules/http1/test_005_trailers.py create mode 100644 test/modules/http1/test_006_unsafe.py create mode 100644 test/modules/http1/test_007_strict.py create mode 100644 test/modules/http2/.gitignore create mode 100644 test/modules/http2/Makefile.in create mode 100644 test/modules/http2/__init__.py create mode 100644 test/modules/http2/conftest.py create mode 100644 test/modules/http2/env.py create mode 100644 test/modules/http2/htdocs/cgi/alive.json create mode 100644 test/modules/http2/htdocs/cgi/echo.py create mode 100644 test/modules/http2/htdocs/cgi/echohd.py create mode 100644 test/modules/http2/htdocs/cgi/env.py create mode 100644 test/modules/http2/htdocs/cgi/files/empty.txt create mode 100644 test/modules/http2/htdocs/cgi/hecho.py create mode 100644 test/modules/http2/htdocs/cgi/hello.py create mode 100644 test/modules/http2/htdocs/cgi/mnot164.py create mode 100644 test/modules/http2/htdocs/cgi/necho.py create mode 100644 test/modules/http2/htdocs/cgi/requestparser.py create mode 100644 test/modules/http2/htdocs/cgi/ssi/include.inc create mode 100644 test/modules/http2/htdocs/cgi/ssi/test.html create mode 100644 test/modules/http2/htdocs/cgi/upload.py create mode 100644 test/modules/http2/htdocs/cgi/xxx/test.json create mode 100644 test/modules/http2/htdocs/noh2/alive.json create mode 100644 test/modules/http2/htdocs/noh2/index.html create mode 100644 test/modules/http2/mod_h2test/mod_h2test.c create mode 100644 test/modules/http2/mod_h2test/mod_h2test.h create mode 100644 test/modules/http2/test_001_httpd_alive.py create mode 100644 test/modules/http2/test_002_curl_basics.py create mode 100644 test/modules/http2/test_003_get.py create mode 100644 test/modules/http2/test_004_post.py create mode 100644 test/modules/http2/test_005_files.py create mode 100644 test/modules/http2/test_006_assets.py create mode 100644 test/modules/http2/test_007_ssi.py create mode 100644 test/modules/http2/test_008_ranges.py create mode 100644 test/modules/http2/test_009_timing.py create mode 100644 test/modules/http2/test_100_conn_reuse.py create mode 100644 test/modules/http2/test_101_ssl_reneg.py create mode 100644 test/modules/http2/test_102_require.py create mode 100644 test/modules/http2/test_103_upgrade.py create mode 100644 test/modules/http2/test_104_padding.py create mode 100644 test/modules/http2/test_105_timeout.py create mode 100644 test/modules/http2/test_106_shutdown.py create mode 100644 test/modules/http2/test_107_frame_lengths.py create mode 100644 test/modules/http2/test_200_header_invalid.py create mode 100644 test/modules/http2/test_201_header_conditional.py create mode 100644 test/modules/http2/test_202_trailer.py create mode 100644 test/modules/http2/test_203_rfc9113.py create mode 100644 test/modules/http2/test_300_interim.py create mode 100644 test/modules/http2/test_400_push.py create mode 100644 test/modules/http2/test_401_early_hints.py create mode 100644 test/modules/http2/test_500_proxy.py create mode 100644 test/modules/http2/test_501_proxy_serverheader.py create mode 100644 test/modules/http2/test_502_proxy_port.py create mode 100644 test/modules/http2/test_503_proxy_fwd.py create mode 100644 test/modules/http2/test_600_h2proxy.py create mode 100644 test/modules/http2/test_601_h2proxy_twisted.py create mode 100644 test/modules/http2/test_700_load_get.py create mode 100644 test/modules/http2/test_710_load_post_static.py create mode 100644 test/modules/http2/test_711_load_post_cgi.py create mode 100644 test/modules/http2/test_712_buffering.py create mode 100644 test/modules/http2/test_800_websockets.py create mode 100644 test/modules/http2/ws_server.py create mode 100644 test/modules/md/__init__.py create mode 100755 test/modules/md/conftest.py create mode 100644 test/modules/md/data/store_migrate/1.0/sample1/accounts/ACME-localhost-0000/account.json create mode 100644 test/modules/md/data/store_migrate/1.0/sample1/accounts/ACME-localhost-0000/account.pem create mode 100644 test/modules/md/data/store_migrate/1.0/sample1/archive/7007-1502285564.org.1/md.json create mode 100644 test/modules/md/data/store_migrate/1.0/sample1/domains/7007-1502285564.org/cert.pem create mode 100644 test/modules/md/data/store_migrate/1.0/sample1/domains/7007-1502285564.org/chain.pem create mode 100644 test/modules/md/data/store_migrate/1.0/sample1/domains/7007-1502285564.org/md.json create mode 100644 test/modules/md/data/store_migrate/1.0/sample1/domains/7007-1502285564.org/pkey.pem create mode 100644 test/modules/md/data/store_migrate/1.0/sample1/httpd.json create mode 100644 test/modules/md/data/store_migrate/1.0/sample1/md_store.json create mode 100644 test/modules/md/data/test_920/002.pubcert create mode 100644 test/modules/md/data/test_conf_validate/test_014.conf create mode 100644 test/modules/md/data/test_drive/test1.example.org.conf create mode 100644 test/modules/md/data/test_roundtrip/temp.conf create mode 100755 test/modules/md/dns01.py create mode 100755 test/modules/md/dns01_v2.py create mode 100755 test/modules/md/http_challenge_foobar.py create mode 100755 test/modules/md/md_acme.py create mode 100755 test/modules/md/md_cert_util.py create mode 100755 test/modules/md/md_certs.py create mode 100755 test/modules/md/md_conf.py create mode 100755 test/modules/md/md_env.py create mode 100755 test/modules/md/message.py create mode 100755 test/modules/md/msg_fail_on.py create mode 100755 test/modules/md/notifail.py create mode 100755 test/modules/md/notify.py create mode 100644 test/modules/md/pebble/pebble-eab.json.template create mode 100644 test/modules/md/pebble/pebble.json.template create mode 100644 test/modules/md/test_001_store.py create mode 100644 test/modules/md/test_010_store_migrate.py create mode 100644 test/modules/md/test_100_reg_add.py create mode 100644 test/modules/md/test_110_reg_update.py create mode 100644 test/modules/md/test_120_reg_list.py create mode 100644 test/modules/md/test_202_acmev2_regs.py create mode 100644 test/modules/md/test_300_conf_validate.py create mode 100644 test/modules/md/test_310_conf_store.py create mode 100644 test/modules/md/test_502_acmev2_drive.py create mode 100644 test/modules/md/test_602_roundtrip.py create mode 100644 test/modules/md/test_702_auto.py create mode 100644 test/modules/md/test_720_wildcard.py create mode 100644 test/modules/md/test_730_static.py create mode 100644 test/modules/md/test_740_acme_errors.py create mode 100644 test/modules/md/test_741_setup_errors.py create mode 100644 test/modules/md/test_750_eab.py create mode 100644 test/modules/md/test_751_sectigo.py create mode 100644 test/modules/md/test_752_zerossl.py create mode 100644 test/modules/md/test_780_tailscale.py create mode 100644 test/modules/md/test_790_failover.py create mode 100644 test/modules/md/test_800_must_staple.py create mode 100644 test/modules/md/test_801_stapling.py create mode 100644 test/modules/md/test_810_ec.py create mode 100644 test/modules/md/test_820_locks.py create mode 100644 test/modules/md/test_900_notify.py create mode 100644 test/modules/md/test_901_message.py create mode 100644 test/modules/md/test_910_cleanups.py create mode 100644 test/modules/md/test_920_status.py create mode 100644 test/modules/proxy/__init__.py create mode 100644 test/modules/proxy/conftest.py create mode 100644 test/modules/proxy/env.py create mode 100644 test/modules/proxy/test_01_http.py create mode 100644 test/modules/proxy/test_02_unix.py create mode 100644 test/pyhttpd/__init__.py create mode 100644 test/pyhttpd/certs.py create mode 100644 test/pyhttpd/conf.py create mode 100644 test/pyhttpd/conf/httpd.conf.template create mode 100644 test/pyhttpd/conf/mime.types create mode 100644 test/pyhttpd/conf/stop.conf.template create mode 100644 test/pyhttpd/conf/test.conf create mode 100644 test/pyhttpd/config.ini.in create mode 100644 test/pyhttpd/curl.py create mode 100644 test/pyhttpd/env.py create mode 100644 test/pyhttpd/htdocs/alive.json create mode 100644 test/pyhttpd/htdocs/forbidden.html create mode 100644 test/pyhttpd/htdocs/index.html create mode 100644 test/pyhttpd/htdocs/test1/001.html create mode 100644 test/pyhttpd/htdocs/test1/002.jpg create mode 100644 test/pyhttpd/htdocs/test1/003.html create mode 100644 test/pyhttpd/htdocs/test1/003/003_img.jpg create mode 100644 test/pyhttpd/htdocs/test1/004.html create mode 100644 test/pyhttpd/htdocs/test1/004/gophertiles.jpg create mode 100644 test/pyhttpd/htdocs/test1/006.html create mode 100644 test/pyhttpd/htdocs/test1/006/006.css create mode 100644 test/pyhttpd/htdocs/test1/006/006.js create mode 100644 test/pyhttpd/htdocs/test1/006/header.html create mode 100644 test/pyhttpd/htdocs/test1/007.html create mode 100644 test/pyhttpd/htdocs/test1/007/007.py create mode 100644 test/pyhttpd/htdocs/test1/009.py create mode 100644 test/pyhttpd/htdocs/test1/alive.json create mode 100644 test/pyhttpd/htdocs/test1/index.html create mode 100755 test/pyhttpd/htdocs/test2/006/006.css create mode 100644 test/pyhttpd/htdocs/test2/10%abnormal.txt create mode 100644 test/pyhttpd/htdocs/test2/alive.json create mode 100644 test/pyhttpd/htdocs/test2/x%2f.test create mode 100644 test/pyhttpd/log.py create mode 100644 test/pyhttpd/mod_aptest/mod_aptest.c create mode 100644 test/pyhttpd/nghttp.py create mode 100644 test/pyhttpd/result.py create mode 100644 test/pyhttpd/ws_util.py create mode 100644 test/tcpdumpscii.txt create mode 100644 test/test-writev.c create mode 100644 test/test_find.c create mode 100644 test/test_limits.c create mode 100644 test/test_parser.c create mode 100644 test/test_select.c create mode 100755 test/test_travis_conditions.sh create mode 100644 test/time-sem.c create mode 100644 test/travis_Dockerfile_slapd create mode 100644 test/travis_Dockerfile_slapd.centos create mode 100755 test/travis_before_linux.sh create mode 100755 test/travis_run_linux.sh diff --git a/.deps b/.deps new file mode 100644 index 0000000..e69de29 diff --git a/.gdbinit b/.gdbinit new file mode 100644 index 0000000..8879865 --- /dev/null +++ b/.gdbinit @@ -0,0 +1,598 @@ +# gdb macros which may be useful for folks using gdb to debug +# apache. Delete it if it bothers you. + +define dump_table + set $t = (apr_table_entry_t *)((apr_array_header_t *)$arg0)->elts + set $n = ((apr_array_header_t *)$arg0)->nelts + set $i = 0 + while $i < $n + if $t[$i].val == (void *)0L + printf "[%u] '%s'=>NULL\n", $i, $t[$i].key + else + printf "[%u] '%s'='%s' [%p]\n", $i, $t[$i].key, $t[$i].val, $t[$i].val + end + set $i = $i + 1 + end +end +document dump_table + Print the key/value pairs in a table. +end + +define dump_skiplist + set $sl = (apr_skiplist *)$arg0 + set $m = $sl->bottom + printf "skiplist@%p: size=%lu: height=%d\n", $sl, $sl->size, $sl->height + while ($m) + printf "(%p,%.12lx)", $m, $m->data + set $u = $m->up + while ($u) + printf " (%p,%.12lx)", $u, $u->data + set $u = $u->up + end + printf "\n" + set $m = $m->next + end +end +document dump_skiplist + Print the nodes/values in a skiplist +end + +define dump_string_hash + set $h = $arg0->array + set $n = $arg0->max + set $i = 0 + while $i < $n + set $ent = $h[$i] + while $ent != (void *)0L + printf "'%s' => '%p'\n", $ent->key, $ent->val + set $ent = $ent->next + end + set $i = $i + 1 + end +end +document dump_string_hash + Print the entries in a hash table indexed by strings +end + +define dump_string_shash + set $h = $arg0->array + set $n = $arg0->max + set $i = 0 + while $i < $n + set $ent = $h[$i] + while $ent != (void *)0L + printf "'%s' => '%s'\n", $ent->key, $ent->val + set $ent = $ent->next + end + set $i = $i + 1 + end +end +document dump_string_shash + Print the entries in a hash table indexed by strings with string values +end + +define ro + run -DONE_PROCESS +end + +define dump_string_array + set $a = (char **)((apr_array_header_t *)$arg0)->elts + set $n = (int)((apr_array_header_t *)$arg0)->nelts + set $i = 0 + while $i < $n + printf "[%u] '%s'\n", $i, $a[$i] + set $i = $i + 1 + end +end +document dump_string_array + Print all of the elements in an array of strings. +end + +define printmemn + set $i = 0 + while $i < $arg1 + if $arg0[$i] < 0x20 || $arg0[$i] > 0x7e + printf "~" + else + printf "%c", $arg0[$i] + end + set $i = $i + 1 + end +end + +define print_bkt_datacol + # arg0 == column name + # arg1 == format + # arg2 == value + # arg3 == suppress header? + set $suppressheader = $arg3 + + if !$suppressheader + printf " " + printf $arg0 + printf "=" + else + printf " | " + end + printf $arg1, $arg2 +end + +define dump_bucket_ex + # arg0 == bucket + # arg1 == suppress header? + set $bucket = (struct apr_bucket *)$arg0 + set $sh = $arg1 + set $refcount = -1 + + print_bkt_datacol "bucket" "%-9s" $bucket->type->name $sh + printf "(%12lx)", (unsigned long)$bucket + print_bkt_datacol "length" "%-6ld" (long)($bucket->length) $sh + print_bkt_datacol "data" "%12lx" $bucket->data $sh + + if !$sh + printf "\n " + end + + if (($bucket->type == &apr_bucket_type_eos) || \ + ($bucket->type == &apr_bucket_type_flush)) + + # metadata buckets, no content + print_bkt_datacol "contents" "%c" ' ' $sh + printf " " + print_bkt_datacol "rc" "n/%c" 'a' $sh + + else + if ($bucket->type == &ap_bucket_type_error) + + # metadata bucket, no content but it does have an error code in it + print_bkt_datacol "contents" "%c" ' ' $sh + set $status = ((ap_bucket_error *)$bucket->data)->status + printf " (status=%3d) ", $status + print_bkt_datacol "rc" "n/%c" 'a' $sh + + else + if ($bucket->type == &apr_bucket_type_file) + + # file bucket, can show fd and refcount + set $fd = ((apr_bucket_file*)$bucket->data)->fd->filedes + print_bkt_datacol "contents" "[***file***] fd=%-6ld" (long)$fd $sh + set $refcount = ((apr_bucket_refcount *)$bucket->data)->refcount + print_bkt_datacol "rc" "%-3d" $refcount $sh + + else + if (($bucket->type == &apr_bucket_type_heap) || \ + ($bucket->type == &apr_bucket_type_pool) || \ + ($bucket->type == &apr_bucket_type_mmap) || \ + ($bucket->type == &apr_bucket_type_transient) || \ + ($bucket->type == &apr_bucket_type_immortal)) + + # in-memory buckets + + if $bucket->type == &apr_bucket_type_heap + set $refcount = ((apr_bucket_refcount *)$bucket->data)->refcount + set $p = (apr_bucket_heap *)$bucket->data + set $data = $p->base+$bucket->start + + else + if $bucket->type == &apr_bucket_type_pool + set $refcount = ((apr_bucket_refcount *)$bucket->data)->refcount + set $p = (apr_bucket_pool *)$bucket->data + if !$p->pool + set $p = (apr_bucket_heap *)$bucket->data + end + set $data = $p->base+$bucket->start + + else + if $bucket->type == &apr_bucket_type_mmap + # is this safe if not APR_HAS_MMAP? + set $refcount = ((apr_bucket_refcount *)$bucket->data)->refcount + set $p = (apr_bucket_mmap *)$bucket->data + set $data = ((char *)$p->mmap->mm)+$bucket->start + + else + if (($bucket->type == &apr_bucket_type_transient) || \ + ($bucket->type == &apr_bucket_type_immortal)) + set $data = ((char *)$bucket->data)+$bucket->start + + end + end + end + end + + if $sh + printf " | [" + else + printf " contents=[" + end + set $datalen = $bucket->length + if $isValidAddress($data) == 1 + if $datalen > 17 + printmem $data 17 + printf "..." + set $datalen = 20 + else + printmemn $data $datalen + end + printf "]" + while $datalen < 20 + printf " " + set $datalen = $datalen + 1 + end + else + printf "Iv addr %12lx]", $data + end + + if $refcount != -1 + print_bkt_datacol "rc" "%-3d" $refcount $sh + else + print_bkt_datacol "rc" "n/%c" 'a' $sh + end + + else + if ($bucket->type == &apr_bucket_type_pipe) + + # pipe bucket, can show fd + set $fd = ((apr_file_t*)$bucket->data)->filedes + print_bkt_datacol "contents" "[***pipe***] fd=%-3ld" (long)$fd $sh + + else + if ($bucket->type == &apr_bucket_type_socket) + + # file bucket, can show fd + set $fd = ((apr_socket_t*)$bucket->data)->socketdes + print_bkt_datacol "contents" "[**socket**] fd=%-3ld" (long)$fd $sh + + else + + # 3rd-party bucket type + print_bkt_datacol "contents" "[**opaque**]%-7c" ' ' $sh + end + end + + # no refcount + printf " " + print_bkt_datacol "rc" "n/%c" 'a' $sh + end + end + end + end + + printf "\n" + +end + +define dump_bucket + dump_bucket_ex $arg0 0 +end +document dump_bucket + Print bucket info +end + +define dump_brigade + set $bb = (apr_bucket_brigade *)$arg0 + set $bucket = $bb->list.next + set $sentinel = ((char *)((&($bb->list)) \ + - ((size_t) &((struct apr_bucket *)0)->link))) + printf "dump of brigade 0x%lx\n", (unsigned long)$bb + + printf " | type (address) | length | " + printf "data address | contents | rc\n" + printf "-------------------------------------------" + printf "----------------------------------------\n" + + if $bucket == $sentinel + printf "brigade is empty\n" + end + + set $j = 0 + set $brigade_length = 0 + while $bucket != $sentinel + printf "%2d", $j + dump_bucket_ex $bucket 1 + set $j = $j + 1 + if $bucket->length > 0 + set $brigade_length = $brigade_length + $bucket->length + end + set $bucket = $bucket->link.next + end + printf "end of brigade\n" + printf "Length of brigade (excluding buckets of unknown length): %u\n", $brigade_length +end +document dump_brigade + Print bucket brigade info +end + +define dump_filters + set $f = $arg0 + while $f + printf "%s(0x%lx): ctx=0x%lx, r=0x%lx, c=0x%lx\n", \ + $f->frec->name, (unsigned long)$f, (unsigned long)$f->ctx, \ + $f->r, $f->c + set $f = $f->next + end +end +document dump_filters + Print filter chain info +end + +define dump_filter_chain + set $r = $arg0 + set $f = $r->output_filters + while $f + if $f == $r->output_filters + printf "r->output_filters =>\n" + end + if $f == $r->proto_output_filters + printf "r->proto_output_filters =>\n" + end + if $f == $r->connection->output_filters + printf "r->connection->output_filters =>\n" + end + + printf " %s(0x%lx): type=%d, ctx=0x%lx, r=%s(0x%lx), c=0x%lx\n", \ + $f->frec->name, (unsigned long)$f, $f->frec->ftype, (unsigned long)$f->ctx, \ + $f->r == $r ? "r" : ($f->r == 0L ? "null" : \ + ($f->r == $r->main ? "r->main" : \ + ($r->main && $f->r == $r->main->main ? "r->main->main" : "????"))), \ + $f->r, $f->c + + set $f = $f->next + end +end +document dump_filter_chain + Print filter chain info given a request_rec pointer +end + +define dump_process_rec + set $p = $arg0 + printf "process_rec=0x%lx:\n", (unsigned long)$p + printf " pool=0x%lx, pconf=0x%lx\n", \ + (unsigned long)$p->pool, (unsigned long)$p->pconf +end +document dump_process_rec + Print process_rec info +end + +define dump_server_addr_recs + set $sa_ = $arg0 + set $san_ = 0 + while $sa_ + ### need to call apr_sockaddr_info_getbuf to print ->host_addr properly + ### which is a PITA since we need a buffer :( + printf " addr#%d: vhost=%s -> :%d\n", $san_++, $sa_->virthost, $sa_->host_port + set $sa_ = $sa_->next + end +end +document dump_server_addr_recs + Print server_addr_rec info +end + + +define dump_server_rec + set $s = $arg0 + printf "name=%s:%d (0x%lx)\n", \ + $s->server_hostname, $s->port, $s + dump_server_addr_recs $s->addrs + dump_process_rec($s->process) +end +document dump_server_rec + Print server_rec info +end + +define dump_servers + set $s = $arg0 + while $s + dump_server_rec($s) + printf "\n" + set $s = $s->next + end +end +document dump_servers + Print server_rec list info +end + +define dump_request_tree + set $r = $arg0 + set $i + while $r + printf "r=(0x%lx): uri=%s, handler=%s, r->main=0x%lx\n", \ + $r, $r->unparsed_uri, $r->handler ? $r->handler : "(none)", $r->main + set $r = $r->main + end +end + +define dump_scoreboard + # Need to reserve size of array first before string literals could be + # put in + set $status = {0, 1, 2, 3, 4 ,5 ,6 ,7 ,8 ,9 ,10} + set $status = {"DEAD", "STARTING", "READY", "BUSY_READ", "BUSY_WRITE", "BUSY_KEEPALIVE", "BUSY_LOG", "BUSY_DNS", "CLOSING", "GRACEFUL", "IDLE_KILL"} + set $i = 0 + while ($i < server_limit) + if ap_scoreboard_image->servers[$i][0].pid != 0 + set $j = 0 + while ($j < threads_per_child) + set $ws = ap_scoreboard_image->servers[$i][$j] + printf "pid: %d, tid: 0x%lx, status: %s\n", $ws.pid, $ws.tid, $status[$ws.status] + set $j = $j +1 + end + end + set $i = $i +1 + end +end +document dump_scoreboard + Dump the scoreboard +end + +define dump_allocator + printf "Allocator current_free_index = %d, max_free_index = %d\n", \ + ($arg0)->current_free_index, ($arg0)->max_free_index + printf "Allocator free list:\n" + set $i = 0 + set $max =(sizeof $arg0->free)/(sizeof $arg0->free[0]) + set $kb = 0 + while $i < $max + set $node = $arg0->free[$i] + if $node != 0 + printf " #%2d: ", $i + while $node != 0 + printf "%d, ", ($node->index + 1) << 12 + set $kb = $kb + (($node->index + 1) << 2) + set $node = $node->next + end + printf "ends.\n" + end + set $i = $i + 1 + end + printf "Sum of free blocks: %dkiB\n", $kb +end +document dump_allocator + Print status of an allocator and its freelists. +end + +define dump_one_pool + set $p = $arg0 + set $size = 0 + set $free = 0 + set $nodes = 0 + set $node = $arg0->active + set $done = 0 + while $done == 0 + set $size = $size + (($node->index + 1) << 12) + set $free = $free + ($node->endp - $node->first_avail) + set $nodes = $nodes + 1 + set $node = $node->next + if $node == $arg0->active + set $done = 1 + end + end + printf "Pool '" + if $p->tag + printf "%s", $p->tag + else + printf "no tag" + end + printf "' [%p]: %d/%d free (%d blocks)\n", $p, $free, $size, $nodes +end + +define dump_all_pools + if $argc > 0 + set $root = $arg0 + else + set $root = ap_pglobal + end + while $root->parent + set $root = $root->parent + end + dump_pool_and_children $root +end +document dump_all_pools + Dump the whole pool hierarchy starting from apr_global_pool. Optionally takes an arbitrary pool as starting parameter. +end + +python + +from __future__ import print_function + +class DumpPoolAndChilds (gdb.Command): + """Dump the whole pool hierarchy starting from the given pool.""" + + def __init__ (self): + super (DumpPoolAndChilds, self).__init__ ("dump_pool_and_children", gdb.COMMAND_USER) + + def _allocator_free_blocks(self, alloc): + salloc = "%s" % (alloc) + if self.total_free_blocks.get(salloc) != None: + return self.total_free_blocks[salloc] + i = 0 + dalloc = alloc.dereference() + max =(dalloc['free'].type.sizeof)/(dalloc['free'][0].type.sizeof) + kb = 0 + while i < max: + node = dalloc['free'][i] + if node != 0: + while node != 0: + noded = node.dereference() + kb = kb + ((int(noded['index']) + 1) << 2) + node = noded['next'] + i = i + 1 + self.total_free_blocks[salloc] = kb + return kb + + + def _dump_one_pool(self, arg): + size = 0 + free = 0 + nodes = 0 + darg = arg.dereference() + active = darg['active'] + node = active + done = 0 + while done == 0: + noded = node.dereference() + size = size + ((int(noded['index']) + 1) << 12) + free = free + (noded['endp'] - noded['first_avail']) + nodes = nodes + 1 + node = noded['next'] + if node == active: + done = 1 + if darg['tag'] != 0: + tag = darg['tag'].string() + else: + tag = "No tag" + print("Pool '%s' [%s]: %d/%d free (%d blocks) allocator: %s free blocks in allocator: %i kiB" % (tag, arg, free, size, nodes, darg['allocator'], self._allocator_free_blocks(darg['allocator']))) + self.free = self.free + free + self.size = self.size + size + self.nodes = self.nodes + nodes + + def _dump(self, arg, depth): + pool = arg + while pool: + print("%*c" % (depth * 4 + 1, " "), end="") + self._dump_one_pool(pool) + if pool['child'] != 0: + self._dump(pool['child'], depth + 1) + pool = pool['sibling'] + + def invoke (self, arg, from_tty): + pool = gdb.parse_and_eval(arg) + self.free = 0 + self.size = 0 + self.nodes = 0 + self.total_free_blocks = {} + self._dump(pool, 0) + print("Total %d/%d free (%d blocks)" % (self.free, self.size, self.nodes)) + sum = 0 + for key in self.total_free_blocks: + sum = sum + self.total_free_blocks[key] + print("Total free allocator blocks: %i kiB" % (sum)) + +DumpPoolAndChilds () +end +document dump_pool_and_children + Dump the whole pool hierarchy starting from the given pool. +end + +python + +class isValidAddress (gdb.Function): + """Determines if the argument is a valid address.""" + + def __init__(self): + super(isValidAddress, self).__init__("isValidAddress") + + def invoke(self, address): + inf = gdb.inferiors()[0] + result = 1 + try: + inf.read_memory(address, 8) + except: + result = 0 + return result + +isValidAddress() + +end + +# Set sane defaults for common signals: +handle SIGPIPE noprint pass nostop +handle SIGUSR1 print pass nostop diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml new file mode 100644 index 0000000..8f81138 --- /dev/null +++ b/.github/workflows/linux.yml @@ -0,0 +1,297 @@ +name: Linux + +on: + push: + branches: [ "*" ] + paths-ignore: + - 'docs/**' + - STATUS + - CHANGES + - changes-entries/* + tags: + - 2.* + pull_request: + branches: [ "trunk", "2.4.x" ] + paths-ignore: + - 'docs/**' + - STATUS + - CHANGES + - changes-entries/* + +env: + MARGS: "-j2" + CFLAGS: "-g" + # This will need updating as the ubuntu-latest image changes: + PHP_FPM: "/usr/sbin/php-fpm8.1" + +jobs: + build: + strategy: + fail-fast: false + matrix: + include: + # ------------------------------------------------------------------------- + - name: Empty APLOGNO() test + env: | + SKIP_TESTING=1 + TEST_LOGNO=1 + # ------------------------------------------------------------------------- + - name: Default + # ------------------------------------------------------------------------- + - name: All-static modules + config: --enable-mods-static=reallyall + # ------------------------------------------------------------------------- + - name: Prefork MPM, all-modules (except cgid) + config: --enable-mods-shared=reallyall --with-mpm=prefork --disable-cgid + # ------------------------------------------------------------------------- + - name: Worker MPM, all-modules + config: --enable-mods-shared=reallyall --with-mpm=worker + # ------------------------------------------------------------------------- + - name: Shared MPMs, all-modules + config: --enable-mods-shared=reallyall --enable-mpms-shared=all + # ------------------------------------------------------------------------- + - name: Event MPM, all-modules, mod_cgid fdpassing + config: --enable-mods-shared=reallyall --with-mpm=event --disable-cgi --enable-cgid-fdpassing + # ------------------------------------------------------------------------- + - name: Event MPM, all-modules, mod_cgid w/o fdpassing + config: --enable-mods-shared=reallyall --with-mpm=event --disable-cgi + # ------------------------------------------------------------------------- + - name: Default, all-modules + install + config: --enable-mods-shared=reallyall + env: | + TEST_INSTALL=1 + APACHE_TEST_EXTRA_ARGS=-v + # ------------------------------------------------------------------------- + - name: Default, all-modules, random test order + config: --enable-mods-shared=reallyall + env: | + TEST_ARGS=-order=random + # ------------------------------------------------------------------------- + - name: GCC 12 maintainer-mode w/-Werror, install + VPATH + config: --enable-mods-shared=reallyall --enable-maintainer-mode + notest-cflags: -Werror -O2 + env: | + CC=gcc-12 + TEST_VPATH=1 + TEST_INSTALL=1 + SKIP_TESTING=1 + # ------------------------------------------------------------------------- + - name: All-modules, APR 1.7.4, APR-util 1.6.3 + config: --enable-mods-shared=reallyall + env: | + APR_VERSION=1.7.4 + APU_VERSION=1.6.3 + APU_CONFIG="--with-crypto --with-ldap" + # ------------------------------------------------------------------------- + - name: APR 1.8.x, APR-util 1.7.x + config: --enable-mods-shared=reallyall + env: | + APR_VERSION=1.8.x + APU_VERSION=1.7.x + APU_CONFIG="--with-crypto --with-ldap" + CLEAR_CACHE=1 + # ------------------------------------------------------------------------- + - name: Pool-debug + config: --enable-mods-shared=reallyall + env: | + APR_VERSION=1.7.x + APR_CONFIG="--enable-pool-debug" + APU_VERSION=1.7.x + APU_CONFIG="--with-crypto --with-ldap" + TEST_MALLOC=1 + CLEAR_CACHE=1 + # ------------------------------------------------------------------------- + - name: Shared MPMs (event), pool-debug, SSL/TLS variants + config: --enable-mods-shared=reallyall --enable-mpms-shared=all --with-mpm=event + env: | + APR_VERSION=1.7.x + APR_CONFIG="--enable-pool-debug" + APU_VERSION=1.7.x + APU_CONFIG="--with-crypto --with-ldap" + TEST_MALLOC=1 + TEST_SSL=1 + CLEAR_CACHE=1 + # ------------------------------------------------------------------------- + - name: Shared MPMs (worker), pool-debug, SSL/TLS variants + config: --enable-mods-shared=reallyall --enable-mpms-shared=all --with-mpm=worker + env: | + APR_VERSION=1.7.x + APR_CONFIG="--enable-pool-debug" + APU_VERSION=1.7.x + APU_CONFIG="--with-crypto --with-ldap" + TEST_MALLOC=1 + TEST_SSL=1 + CLEAR_CACHE=1 + # ------------------------------------------------------------------------- + - name: Shared MPMs (prefork), pool-debug, SSL/TLS variants + config: --enable-mods-shared=reallyall --enable-mpms-shared=all --with-mpm=prefork + env: | + APR_VERSION=1.7.x + APR_CONFIG="--enable-pool-debug" + APU_VERSION=1.7.x + APU_CONFIG="--with-crypto --with-ldap" + TEST_MALLOC=1 + TEST_SSL=1 + CLEAR_CACHE=1 + # ------------------------------------------------------------------------- + - name: litmus WebDAV tests + config: --enable-dav --enable-dav-fs + env: | + LITMUS=1 + TESTS="t/modules/dav.t" + pkgs: litmus + # ------------------------------------------------------------------------- + - name: APR 1.7.4, APR-util 1.6.3, LDAP + config: --enable-mods-shared=reallyall + pkgs: ldap-utils + env: | + APR_VERSION=1.7.4 + APU_VERSION=1.6.3 + APU_CONFIG="--with-crypto --with-ldap" + TEST_MALLOC=1 + TEST_LDAP=1 + TEST_ARGS="-defines LDAP" + TESTS="t/modules/" + # ------------------------------------------------------------------------- + - name: APR 1.7.x, APR-util 1.7.x, LDAP + config: --enable-mods-shared=reallyall + pkgs: ldap-utils + env: | + APR_VERSION=1.7.x + APU_VERSION=1.7.x + APU_CONFIG="--with-crypto --with-ldap" + TEST_MALLOC=1 + TEST_LDAP=1 + TEST_ARGS="-defines LDAP" + TESTS="t/modules/" + CLEAR_CACHE=1 + # ------------------------------------------------------------------------- + ### TODO: if: *condition_not_24x + - name: APR trunk thread debugging + config: --enable-mods-shared=reallyall --with-mpm=event + env: | + APR_VERSION=trunk + APR_CONFIG="--with-crypto --enable-thread-debug" + # ------------------------------------------------------------------------- + - name: ASan + notest-cflags: -ggdb -fsanitize=address -fno-sanitize-recover=address -fno-omit-frame-pointer + config: --enable-mods-shared=reallyall + env: | + APR_VERSION=1.7.x + APU_VERSION=1.7.x + APU_CONFIG="--with-crypto --with-ldap" + TEST_ASAN=1 + CLEAR_CACHE=1 + # ------------------------------------------------------------------------- + - name: ASan, pool-debug + notest-cflags: -ggdb -fsanitize=address -fno-sanitize-recover=address -fno-omit-frame-pointer + config: --enable-mods-shared=reallyall + env: | + APR_VERSION=1.7.x + APR_CONFIG="--enable-pool-debug" + APU_VERSION=1.7.x + APU_CONFIG="--with-crypto --with-ldap" + TEST_ASAN=1 + CLEAR_CACHE=1 + # ------------------------------------------------------------------------- + - name: HTTP/2 test suite + config: --enable-mods-shared=reallyall --with-mpm=event --enable-mpms-shared=all + pkgs: curl python3-pytest nghttp2-client python3-cryptography python3-requests python3-multipart python3-filelock python3-websockets + env: | + APR_VERSION=1.7.4 + APU_VERSION=1.6.3 + APU_CONFIG="--with-crypto" + NO_TEST_FRAMEWORK=1 + TEST_INSTALL=1 + TEST_H2=1 + TEST_CORE=1 + TEST_PROXY=1 + # ------------------------------------------------------------------------- + ### TODO: if: *condition_not_24x + ### TODO: pebble install is broken. + # - name: ACME test suite + # config: --enable-mods-shared=reallyall --with-mpm=event --enable-mpms-shared=event + # pkgs: >- + # python3-pytest nghttp2-client python3-cryptography python3-requests python3-filelock + # golang-1.17 curl + # env: | + # APR_VERSION=1.7.4 + # APU_VERSION=1.6.3 + # APU_CONFIG="--with-crypto" + # GOROOT=/usr/lib/go-1.17 + # NO_TEST_FRAMEWORK=1 + # TEST_INSTALL=1 + # TEST_MD=1 + # ------------------------------------------------------------------------- + ### TODO: if: *condition_not_24x + # ------------------------------------------------------------------------- + ### TODO if: *condition_not_24x + ### TODO: Fails because :i386 packages are not being found. + # - name: i386 Shared MPMs, most modules, maintainer-mode w/-Werror + # config: --enable-mods-shared=reallyall --disable-xml2enc --disable-proxy-html --enable-mpms-shared=all --enable-maintainer-mode + # pkgs: >- + # cpanminus libc6-dev-i386 gcc-multilib libexpat1-dev:i386 libssl-dev:i386 + # lib32z1-dev libbrotli-dev:i386 libpcre2-dev:i386 libldap2-dev:i386 libtool-bin + # perl-doc libapr1-dev libbrotli-dev:i386 + # env: | + # PKG_CONFIG_PATH="/usr/lib/i386-linux-gnu/pkgconfig" + # NOTEST_CFLAGS="-Werror" + # CC="gcc -m32" + # APR_VERSION=1.7.3 + # APU_VERSION=1.6.3 + # APU_CONFIG="--with-crypto --with-ldap" + runs-on: ubuntu-latest + timeout-minutes: 30 + env: + NOTEST_CFLAGS: ${{ matrix.notest-cflags }} + CONFIG: ${{ matrix.config }} + name: ${{ matrix.name }} + steps: + # JOBID is used in the cache keys, created here as a hash of all + # properties of the environment, including the image OS version, + # compiler flags and any job-specific properties. + - name: Set environment variables + run: | + echo "${{ matrix.env }}" >> $GITHUB_ENV + echo JOBID=`echo "OS=$ImageOS ${{ matrix.notest-cflags }} ${{ matrix.env }} ${{ matrix.config }}" \ + | md5sum - | sed 's/ .*//'` >> $GITHUB_ENV + # https://github.com/actions/runner-images/issues/9491#issuecomment-1989718917 + - name: Workaround ASAN issue in Ubuntu 22.04 + run: sudo sysctl vm.mmap_rnd_bits=28 + - name: apt refresh + run: sudo apt-get -o Acquire::Retries=5 update + - name: Install prerequisites + run: sudo apt-get install -o Acquire::Retries=5 + cpanminus libtool-bin libapr1-dev libaprutil1-dev + liblua5.3-dev libbrotli-dev libcurl4-openssl-dev + libnghttp2-dev libjansson-dev libpcre2-dev gdb + perl-doc libsasl2-dev ${{ matrix.pkgs }} + - uses: actions/checkout@v4 + - name: Cache installed libraries + uses: actions/cache@v4 + with: + path: ~/root + key: cache-libs-${{ env.JOBID }} + - name: Cache CPAN modules + uses: actions/cache@v4 + with: + path: ~/perl5 + key: cache-cpan-${{ env.JOBID }} + - name: Configure environment + run: ./test/travis_before_linux.sh + timeout-minutes: 15 + - uses: actions/upload-artifact@v4 + if: failure() + with: + name: config.log-${{ env.JOBID }} + path: | + /home/runner/build/**/config.log + - name: Build and test + run: ./test/travis_run_linux.sh + - uses: actions/upload-artifact@v4 + if: failure() + with: + name: error_log-${{ env.JOBID }} + path: | + **/config.log + test/perl-framework/t/logs/error_log diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 0000000..ac9cb11 --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,63 @@ +name: Windows + +on: + push: + branches: [ "*" ] + paths-ignore: + - 'docs/**' + - STATUS + - CHANGES + - changes-entries/* + pull_request: + branches: [ "trunk", "2.4.x" ] + paths-ignore: + - 'docs/**' + - STATUS + - CHANGES + - changes-entries/* + +jobs: + build: + strategy: + fail-fast: false + matrix: + include: + - name: Default + triplet: x64-windows + arch: x64 + build-type: Debug + generator: "Ninja" + + runs-on: windows-latest + timeout-minutes: 30 + name: ${{ matrix.name }} + env: + VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" + steps: + - name: Export GitHub Actions cache environment variables + uses: actions/github-script@v7 + with: + script: | + core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + + - name: Install dependencies + run: vcpkg install --triplet ${{ matrix.triplet }} apr[private-headers] apr-util pcre2 openssl + + - uses: actions/checkout@v3 + + - name: Configure CMake + shell: cmd + run: | + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=${{ matrix.arch }} + cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} ^ + -G "${{ matrix.generator }}" ^ + -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake ^ + -DAPR_INCLUDE_DIR=C:/vcpkg/installed/${{ matrix.triplet }}/include ^ + "-DAPR_LIBRARIES=C:/vcpkg/installed/${{ matrix.triplet }}/lib/libapr-1.lib;C:/vcpkg/installed/${{ matrix.triplet }}/lib/libaprutil-1.lib" + + - name: Build + shell: cmd + run: | + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=${{ matrix.arch }} + cmake --build ${{github.workspace}}/build --config ${{ matrix.build-type }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..31fa572 --- /dev/null +++ b/.gitignore @@ -0,0 +1,370 @@ +# global +.deps +.libs +*.swp +*.o +*.a +*.lo +*.la +*.slo +*.so +*.vcproj +*.vcproj.* +*.x +*.aps +*.plg +*.dep +*.rc +*.stc +*.stt +*.sto +*.mak +Makefile +modules.mk +BuildLog.htm +Debug +Release + +# / +/config.nice +/configure +/missing +/install-sh +/mkinstalldirs +/aclocal.m4 +/generated_lists +/buildmk.stamp +/config.log +/libtool +/shlibtool +/config.status +/modules.c +/config.cache +/httpd +/httpd.exe +/LibD +/LibR +/Apache.suo +/Apache.ncb +/Apache.opt +/apachecore.dll +/Apache.sln +/autom4te.cache +/httpd.spec +/tags +/TAGS +/*.kdev4 +/.kdev_include_paths +/.cproject +/.project + +# /built/ +/built/ + +# /cmake-build-debug/ +/cmake-build-debug/ + +# /build/ +/build/rules.mk +/build/config_vars.mk +/build/apr_common.m4 +/build/find_apr.m4 +/build/find_apu.m4 +/build/ltconfig +/build/ltmain.sh +/build/PrintPath +/build/config.sub +/build/config.guess +/build/config_vars.sh + +# /build/pkg/ +/build/pkg/pkginfo + +# /build/win32/ +!/build/win32/httpd.rc + +# /docs/ +/docs/dox + +# /docs/conf/ +/docs/conf/httpd-std.conf +/docs/conf/ssl-std.conf +/docs/conf/httpd.conf + +# /docs/conf/extra/ +/docs/conf/extra/*.conf + +# /docs/log-message-tags/ +/docs/log-message-tags/list + +# /docs/manual/ +/docs/manual/_chm +/docs/manual/_off +/docs/manual/_tools +/docs/manual/_dist +/docs/manual/build +/docs/manual/*.tex +/docs/manual/*.aux +/docs/manual/*.out +/docs/manual/*.log +/docs/manual/*.pdf +/docs/manual/*.toc +/docs/manual/.outdated* + +# /docs/manual/developer/ +/docs/manual/developer/*.tex +/docs/manual/developer/*.aux + +# /docs/manual/faq/ +/docs/manual/faq/*.tex +/docs/manual/faq/*.aux + +# /docs/manual/howto/ +/docs/manual/howto/*.aux +/docs/manual/howto/*.tex +/docs/manual/howto/Working-Copy.txt + +# /docs/manual/misc/ +/docs/manual/misc/*.tex +/docs/manual/misc/*.aux + +# /docs/manual/mod/ +/docs/manual/mod/*.tex +/docs/manual/mod/*.aux +/docs/manual/mod/.translated.* + +# /docs/manual/platform/ +/docs/manual/platform/*.tex +/docs/manual/platform/*.aux + +# /docs/manual/programs/ +/docs/manual/programs/*.tex +/docs/manual/programs/*.aux + +# /docs/manual/rewrite/ +/docs/manual/rewrite/_chm +/docs/manual/rewrite/_off +/docs/manual/rewrite/_tools +/docs/manual/rewrite/_dist +/docs/manual/rewrite/build +/docs/manual/rewrite/*.tex +/docs/manual/rewrite/*.aux +/docs/manual/rewrite/*.out +/docs/manual/rewrite/*.log +/docs/manual/rewrite/*.pdf +/docs/manual/rewrite/*.toc +/docs/manual/rewrite/.outdated* + +# /docs/manual/ssl/ +/docs/manual/ssl/*.tex +/docs/manual/ssl/*.aux + +# /docs/manual/style/ +/docs/manual/style/_generated + +# /docs/manual/vhosts/ +/docs/manual/vhosts/*.tex +/docs/manual/vhosts/*.aux + +# /include/ +/include/ap_config_auto.h +/include/ap_config_auto.h.in +/include/ap_config_layout.h +/include/ap_ldap.h +/include/mod_cgi.h +/include/mod_dav.h +/include/mod_include.h +/include/mod_proxy.h +/include/mod_so.h +/include/mpm.h +/include/mpm_default.h +/include/os.h + +# /modules/aaa/ + +# /modules/apreq/ + +# /modules/arch/ + +# /modules/arch/unix/ + +# /modules/arch/win32/ + +# /modules/cache/ + +# /modules/cluster/ + +# /modules/core/ + +# /modules/core/test/ +/modules/core/test/out + +# /modules/database/ + +# /modules/dav/ + +# /modules/dav/fs/ + +# /modules/dav/lock/ + +# /modules/dav/main/ + +# /modules/debugging/ + +# /modules/echo/ + +# /modules/examples/ + +# /modules/experimental/ + +# /modules/filters/ + +# /modules/generators/ + +# /modules/http/ + +# /modules/http2/ + +# /modules/ldap/ + +# /modules/loggers/ + +# /modules/lua/ + +# /modules/lua/test/ +/modules/lua/test/cycle +/modules/lua/test/httpd.conf + +# /modules/mappers/ + +# /modules/md/ +/modules/md/a2md + +# /modules/metadata/ + +# /modules/proxy/ + +# /modules/proxy/balancers/ + +# /modules/proxy/examples/ + +# /modules/session/ + +# /modules/slotmem/ + +# /modules/ssl/ + +# /modules/test/ + +# /os/ + +# /os/bs2000/ + +# /os/os2/ + +# /os/unix/ + +# /os/win32/ +/os/win32/*.mdp +/os/win32/*.ncb +/os/win32/*.opt +/os/win32/*.dsw +/os/win32/mod_*D +/os/win32/mod_*R + +# /server/ +/server/test_char.h +/server/gen_test_char +/server/gen_test_char.exe +/server/gen_test_char.exe.manifest +/server/export_files +/server/exports.c +/server/export_vars.h +/server/ApacheCoreOS2.def +/server/httpd.exp +/server/buildmarked.c + +# /server/mpm/ + +# /server/mpm/event/ + +# /server/mpm/motorz/ + +# /server/mpm/mpmt_os2/ + +# /server/mpm/prefork/ + +# /server/mpm/simple/ + +# /server/mpm/winnt/ + +# /server/mpm/worker/ + +# /srclib/ +/srclib/pth +/srclib/apr +/srclib/apr-util +/srclib/apr-iconv +/srclib/distcache +/srclib/lua +/srclib/pcre +/srclib/openssl +/srclib/zlib + +# /support/ +/support/rotatelogs +/support/htpasswd +/support/htdbm +/support/htdigest +/support/htcacheclean +/support/unescape +/support/inc2shtml +/support/httpd_monitor +/support/suexec +/support/logresolve +/support/ab +/support/apxs +/support/apachectl +/support/checkgid +/support/dbmmanage +/support/envvars-std +/support/log_server_status +/support/logresolve.pl +/support/split-logfile +/support/phf_abuse_log.cgi +/support/httxt2dbm +/support/fcgistarter +/support/firehose +/support/*.exe + +# /support/win32/ +!/support/win32/ApacheMonitor.rc +/support/win32/ApacheMonitorVer.rc + +# /test/ +/test/a.out +/test/time-FCNTL +/test/time-FLOCK +/test/time-SYSVSEM +/test/time-SYSVSEM2 +/test/time-PTHREAD +/test/time-USLOCK +/test/zb +/test/test-writev +/test/test_date +/test/test_select +/test/dbu +/test/sni +/test/httpdunit +/test/httpdunit.cases + +# /test/unit/ +/test/unit/*.tests + +# Intellij +/.idea/ + +test/gen +test/pyhttpd/config.ini +__pycache__ + diff --git a/ABOUT_APACHE b/ABOUT_APACHE new file mode 100644 index 0000000..2443b12 --- /dev/null +++ b/ABOUT_APACHE @@ -0,0 +1,244 @@ + + The Apache HTTP Server Project + + http://httpd.apache.org/ + +The Apache HTTP Server Project is a collaborative software development effort +aimed at creating a robust, commercial-grade, featureful, and freely-available +source code implementation of an HTTP (Web) server. The project is jointly +managed by a group of volunteers located around the world, using the Internet +and the Web to communicate, plan, and develop the server and its related +documentation. In addition, hundreds of users have contributed ideas, code, +and documentation to the project. + +This file is intended to briefly describe the history of the Apache Group (as +it was called in the early days), recognize the many contributors, and explain +how you can join the fun too. + +In February of 1995, the most popular server software on the Web was the +public domain HTTP daemon developed by Rob McCool at the National Center +for Supercomputing Applications, University of Illinois, Urbana-Champaign. +However, development of that httpd had stalled after Rob left NCSA in +mid-1994, and many webmasters had developed their own extensions and bug +fixes that were in need of a common distribution. A small group of these +webmasters, contacted via private e-mail, gathered together for the purpose +of coordinating their changes (in the form of "patches"). Brian Behlendorf +and Cliff Skolnick put together a mailing list, shared information space, +and logins for the core developers on a machine in the California Bay Area, +with bandwidth and diskspace donated by HotWired and Organic Online. +By the end of February, eight core contributors formed the foundation +of the original Apache Group: + + Brian Behlendorf Roy T. Fielding Rob Hartill + David Robinson Cliff Skolnick Randy Terbush + Robert S. Thau Andrew Wilson + +with additional contributions from + + Eric Hagberg Frank Peters Nicolas Pioch + +Using NCSA httpd 1.3 as a base, we added all of the published bug fixes +and worthwhile enhancements we could find, tested the result on our own +servers, and made the first official public release (0.6.2) of the Apache +server in April 1995. By coincidence, NCSA restarted their own development +during the same period, and Brandon Long and Beth Frank of the NCSA Server +Development Team joined the list in March as honorary members so that the +two projects could share ideas and fixes. + +The early Apache server was a big hit, but we all knew that the codebase +needed a general overhaul and redesign. During May-June 1995, while +Rob Hartill and the rest of the group focused on implementing new features +for 0.7.x (like pre-forked child processes) and supporting the rapidly growing +Apache user community, Robert Thau designed a new server architecture +(code-named Shambhala) which included a modular structure and API for better +extensibility, pool-based memory allocation, and an adaptive pre-forking +process model. The group switched to this new server base in July and added +the features from 0.7.x, resulting in Apache 0.8.8 (and its brethren) +in August. + +After extensive beta testing, many ports to obscure platforms, a new set +of documentation (by David Robinson), and the addition of many features +in the form of our standard modules, Apache 1.0 was released on +December 1, 1995. + +Less than a year after the group was formed, the Apache server passed +NCSA's httpd as the #1 server on the Internet. + +The survey by Netcraft (http://www.netcraft.com/survey/) shows that Apache +is today more widely used than all other web servers combined. + + ============================================================================ + +The current project management committee of the Apache HTTP Server +project (as of March, 2011) is: + + Aaron Bannert André Malo Astrid Stolper + Ben Laurie Bojan Smojver Brad Nicholes + Brian Havard Brian McCallister Chris Darroch + Chuck Murcko Colm MacCárthaigh Dan Poirier + Dirk-Willem van Gulik Doug MacEachern + Eric Covener Erik Abele Graham Dumpleton + Graham Leggett Greg Ames Greg Stein + Gregory Trubetskoy Guenter Knauf Issac Goldstand + Jeff Trawick Jim Gallacher Jim Jagielski + Joe Orton Joe Schaefer Joshua Slive + Justin Erenkrantz Ken Coar Lars Eilebrecht + Manoj Kasichainula Marc Slemko Mark J. Cox + Martin Kraemer Maxime Petazzoni Nick Kew + Nicolas Lehuen Noirin Shirley Paul Querna + Philip M. Gollucci Ralf S. Engelschall Randy Kobes + Rasmus Lerdorf Rich Bowen Roy T. Fielding + Rüdiger Plüm Sander Striker Sander Temm + Stefan Fritsch Tony Stevenson Victor J. Orlikowski + Wilfredo Sanchez William A. Rowe Jr. Yoshiki Hayashi + +Other major contributors + + Howard Fear (mod_include), Florent Guillaume (language negotiation), + Koen Holtman (rewrite of mod_negotiation), + Kevin Hughes (creator of all those nifty icons), + Brandon Long and Beth Frank (NCSA Server Development Team, post-1.3), + Ambarish Malpani (Beginning of the NT port), + Rob McCool (original author of the NCSA httpd 1.3), + Paul Richards (convinced the group to use remote CVS after 1.0), + Garey Smiley (OS/2 port), Henry Spencer (author of the regex library). + +Many 3rd-party modules, frequently used and recommended, are also +freely-available and linked from the related projects page: +, and their authors frequently +contribute ideas, patches, and testing. + +Hundreds of people have made individual contributions to the Apache +project. Patch contributors are listed in the CHANGES file. + + ============================================================================ + +How to become involved in the Apache project + +There are several levels of contributing. If you just want to send +in an occasional suggestion/fix, then you can just use the bug reporting +form at . You can also subscribe +to the announcements mailing list (announce-subscribe@httpd.apache.org) which +we use to broadcast information about new releases, bugfixes, and upcoming +events. There's a lot of information about the development process (much of +it in serious need of updating) to be found at . + +If you'd like to become an active contributor to the Apache project (the +group of volunteers who vote on changes to the distributed server), then +you need to start by subscribing to the dev@httpd.apache.org mailing list. +One warning though: traffic is high, 1000 to 1500 messages/month. +To subscribe to the list, send an email to dev-subscribe@httpd.apache.org. +We recommend reading the list for a while before trying to jump in to +development. + + NOTE: The developer mailing list (dev@httpd.apache.org) is not + a user support forum; it is for people actively working on development + of the server code and documentation, and for planning future + directions. If you have user/configuration questions, send them + to users list or to the USENET + newsgroup "comp.infosystems.www.servers.unix".or for windows users, + the newsgroup "comp.infosystems.www.servers.ms-windows". + +There is a core group of contributors (informally called the "core") +which was formed from the project founders and is augmented from time +to time when core members nominate outstanding contributors and the +rest of the core members agree. The core group focus is more on +"business" issues and limited-circulation things like security problems +than on mainstream code development. The term "The Apache Group" +technically refers to this core of project contributors. + +The Apache project is a meritocracy--the more work you have done, the more +you are allowed to do. The group founders set the original rules, but +they can be changed by vote of the active members. There is a group +of people who have logins on our server (apache.org) and access to the +svn repository. Everyone has access to the svn snapshots. Changes to +the code are proposed on the mailing list and usually voted on by active +members--three +1 (yes votes) and no -1 (no votes, or vetoes) are needed +to commit a code change during a release cycle; docs are usually committed +first and then changed as needed, with conflicts resolved by majority vote. + +Our primary method of communication is our mailing list. Approximately 40 +messages a day flow over the list, and are typically very conversational in +tone. We discuss new features to add, bug fixes, user problems, developments +in the web server community, release dates, etc. The actual code development +takes place on the developers' local machines, with proposed changes +communicated using a patch (output of a unified "diff -u oldfile newfile" +command), and committed to the source repository by one of the core +developers using remote svn. Anyone on the mailing list can vote on a +particular issue, but we only count those made by active members or people +who are known to be experts on that part of the server. Vetoes must be +accompanied by a convincing explanation. + +New members of the Apache Group are added when a frequent contributor is +nominated by one member and unanimously approved by the voting members. +In most cases, this "new" member has been actively contributing to the +group's work for over six months, so it's usually an easy decision. + +The above describes our past and current (as of July 2000) guidelines, +which will probably change over time as the membership of the group +changes and our development/coordination tools improve. + + ============================================================================ + +The Apache Software Foundation (www.apache.org) + +The Apache Software Foundation exists to provide organizational, legal, +and financial support for the Apache open-source software projects. +Founded in June 1999 by the Apache Group, the Foundation has been +incorporated as a membership-based, not-for-profit corporation in order +to ensure that the Apache projects continue to exist beyond the participation +of individual volunteers, to enable contributions of intellectual property +and funds on a sound basis, and to provide a vehicle for limiting legal +exposure while participating in open-source software projects. + +You are invited to participate in The Apache Software Foundation. We welcome +contributions in many forms. Our membership consists of those individuals +who have demonstrated a commitment to collaborative open-source software +development through sustained participation and contributions within the +Foundation's projects. Many people and companies have contributed towards +the success of the Apache projects. + + ============================================================================ + +Why The Apache HTTP Server Is Free + +Apache HTTP Server exists to provide a robust and commercial-grade reference +implementation of the HTTP protocol. It must remain a platform upon which +individuals and institutions can build reliable systems, both for +experimental purposes and for mission-critical purposes. We believe the +tools of online publishing should be in the hands of everyone, and +software companies should make their money providing value-added services +such as specialized modules and support, amongst other things. We realize +that it is often seen as an economic advantage for one company to "own" a +market - in the software industry that means to control tightly a +particular conduit such that all others must pay. This is typically done +by "owning" the protocols through which companies conduct business, at the +expense of all those other companies. To the extent that the protocols of +the World Wide Web remain "unowned" by a single company, the Web will +remain a level playing field for companies large and small. Thus, +"ownership" of the protocol must be prevented, and the existence of a +robust reference implementation of the protocol, available absolutely for +free to all companies, is a tremendously good thing. + +Furthermore, Apache httpd is an organic entity; those who benefit from it +by using it often contribute back to it by providing feature enhancements, +bug fixes, and support for others in public newsgroups. The amount of +effort expended by any particular individual is usually fairly light, but +the resulting product is made very strong. This kind of community can +only happen with freeware--when someone pays for software, they usually +aren't willing to fix its bugs. One can argue, then, that Apache's +strength comes from the fact that it's free, and if it were made "not +free" it would suffer tremendously, even if that money were spent on a +real development team. + +We want to see Apache httpd used very widely--by large companies, small +companies, research institutions, schools, individuals, in the intranet +environment, everywhere--even though this may mean that companies who +could afford commercial software, and would pay for it without blinking, +might get a "free ride" by using Apache httpd. We would even be happy if +some commercial software companies completely dropped their own HTTP server +development plans and used Apache httpd as a base, with the proper attributions +as described in the LICENSE file. + +Thanks for using Apache HTTP Server! + diff --git a/Apache-apr2.dsw b/Apache-apr2.dsw new file mode 100644 index 0000000..ef3b223 --- /dev/null +++ b/Apache-apr2.dsw @@ -0,0 +1,3052 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "httpd"=".\httpd.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "ApacheMonitor"=.\support\win32\ApacheMonitor.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Project: "BuildAll"=.\BuildAll.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name BuildBin + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authnz_ldap + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_bucketeer + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_case_filter + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_case_filter_in + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_echo + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_example_hooks + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_example_ipc + End Project Dependency +}}} + +############################################################################### + +Project: "BuildBin"=.\BuildBin.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name httpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name ApacheMonitor + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_access_compat + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_actions + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_alias + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_allowmethods + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_asis + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_digest + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_form + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authn_anon + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authn_core + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authn_dbd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authn_dbm + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authn_file + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authn_socache + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authnz_fcgi + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authz_core + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authz_dbd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authz_dbm + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authz_groupfile + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authz_host + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authz_owner + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authz_user + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_autoindex + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_buffer + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_cache_disk + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_cache_socache + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_cern_meta + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_cgi + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_charset_lite + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_data + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dav_fs + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dav_lock + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dir + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dumpio + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_env + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_expires + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_ext_filter + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_file_cache + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_filter + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_headers + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_heartbeat + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_heartmonitor + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_ident + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_imagemap + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_include + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_info + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_isapi + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_lbmethod_bybusyness + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_lbmethod_byrequests + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_lbmethod_bytraffic + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_lbmethod_heartbeat + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_log_config + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_log_debug + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_log_forensic + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_logio + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_macro + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_mime + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_mime_magic + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_negotiation + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_ajp + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_balancer + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_connect + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_express + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_fcgi + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_ftp + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_hcheck + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_http + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_scgi + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_uwsgi + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_wstunnel + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_ratelimit + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_reflector + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_remoteip + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_reqtimeout + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_request + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_rewrite + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_sed + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_session_cookie + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_session_dbd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_setenvif + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_slotmem_plain + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_slotmem_shm + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_socache_dbm + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_socache_memcache + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_socache_shmcb + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_socache_redis + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_speling + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_status + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_substitute + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_unique_id + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_userdir + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_usertrack + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_version + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_vhost_alias + End Project Dependency + Begin Project Dependency + Project_Dep_Name ab + End Project Dependency + Begin Project Dependency + Project_Dep_Name htcacheclean + End Project Dependency + Begin Project Dependency + Project_Dep_Name htdbm + End Project Dependency + Begin Project Dependency + Project_Dep_Name htdigest + End Project Dependency + Begin Project Dependency + Project_Dep_Name htpasswd + End Project Dependency + Begin Project Dependency + Project_Dep_Name httxt2dbm + End Project Dependency + Begin Project Dependency + Project_Dep_Name logresolve + End Project Dependency + Begin Project Dependency + Project_Dep_Name rotatelogs + End Project Dependency + Begin Project Dependency + Project_Dep_Name wintty + End Project Dependency +}}} + +############################################################################### + +Project: "InstallBin"=.\InstallBin.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name BuildBin + End Project Dependency +}}} + +############################################################################### + +Project: "ab"=.\support\ab.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Project: "abs"=.\support\abs.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Project: "apr"=.\srclib\apr\apr.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "apr_dbd_odbc"=".\srclib\apr\dbd\apr_dbd_odbc.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbd_mysql"=".\srclib\apr\dbd\apr_dbd_mysql.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbd_oracle"=".\srclib\apr\dbd\apr_dbd_oracle.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbd_pgsql"=".\srclib\apr\dbd\apr_dbd_pgsql.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbd_sqlite2"=".\srclib\apr\dbd\apr_dbd_sqlite2.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbd_sqlite3"=".\srclib\apr\dbd\apr_dbd_sqlite3.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbm_db"=".\srclib\apr\dbm\apr_dbm_db.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbm_gdbm"=".\srclib\apr\dbm\apr_dbm_gdbm.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency +}}} + +############################################################################### + +Project: "fcgistarter"=.\support\fcgistarter.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Project: "gen_test_char"=.\server\gen_test_char.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency +}}} + +############################################################################### + +Project: "htcacheclean"=.\support\htcacheclean.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Project: "htdbm"=.\support\htdbm.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Project: "htdigest"=.\support\htdigest.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Project: "htpasswd"=.\support\htpasswd.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Project: "httxt2dbm"=.\support\httxt2dbm.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Project: "libapr"=.\srclib\apr\libapr.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libhttpd"=.\libhttpd.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name gen_test_char + End Project Dependency +}}} + +############################################################################### + +Project: "logresolve"=.\support\logresolve.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Project: "mod_actions"=.\modules\mappers\mod_actions.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_alias"=.\modules\mappers\mod_alias.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_allowmethods"=.\modules\aaa\mod_allowmethods.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_asis"=.\modules\generators\mod_asis.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + + +############################################################################### + +Project: "mod_access_compat"=.\modules\aaa\mod_access_compat.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_auth_basic"=.\modules\aaa\mod_auth_basic.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_auth_digest"=.\modules\aaa\mod_auth_digest.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_auth_form"=.\modules\aaa\mod_auth_form.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authn_anon"=.\modules\aaa\mod_authn_anon.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authn_core"=.\modules\aaa\mod_authn_core.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authn_dbd"=.\modules\aaa\mod_authn_dbd.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dbd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authn_dbm"=.\modules\aaa\mod_authn_dbm.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authn_file"=.\modules\aaa\mod_authn_file.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authn_socache"=.\modules\aaa\mod_authn_socache.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authnz_fcgi"=.\modules\aaa\mod_authnz_fcgi.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authnz_ldap"=.\modules\aaa\mod_authnz_ldap.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_ldap + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authz_core"=.\modules\aaa\mod_authz_core.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authz_dbd"=.\modules\aaa\mod_authz_dbd.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dbd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authz_dbm"=.\modules\aaa\mod_authz_dbm.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authz_groupfile"=.\modules\aaa\mod_authz_groupfile.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authz_host"=.\modules\aaa\mod_authz_host.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authz_owner"=.\modules\aaa\mod_authz_owner.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authz_user"=.\modules\aaa\mod_authz_user.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_autoindex"=.\modules\generators\mod_autoindex.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_brotli"=.\modules\filters\mod_brotli.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_bucketeer"=.\modules\debugging\mod_bucketeer.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_buffer"=.\modules\filters\mod_buffer.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_cache"=.\modules\cache\mod_cache.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_case_filter"=.\modules\examples\mod_case_filter.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_case_filter_in"=.\modules\examples\mod_case_filter_in.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_cern_meta"=.\modules\metadata\mod_cern_meta.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_cgi"=.\modules\generators\mod_cgi.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_charset_lite"=.\modules\filters\mod_charset_lite.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_data"=.\modules\filters\mod_data.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_dav"=.\modules\dav\main\mod_dav.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_dav_fs"=.\modules\dav\fs\mod_dav_fs.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dav + End Project Dependency +}}} + +############################################################################### + +Project: "mod_dav_lock"=.\modules\dav\lock\mod_dav_lock.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dav + End Project Dependency +}}} + +############################################################################### + +Project: "mod_dbd"=.\modules\database\mod_dbd.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_deflate"=.\modules\filters\mod_deflate.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_dir"=.\modules\mappers\mod_dir.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_cache_disk"=.\modules\cache\mod_cache_disk.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_cache + End Project Dependency +}}} + +############################################################################### + +Project: "mod_cache_socache"=.\modules\cache\mod_cache_socache.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_cache + End Project Dependency +}}} + +############################################################################### + +Project: "mod_dumpio"=.\modules\debugging\mod_dumpio.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_echo"=.\modules\echo\mod_echo.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_env"=.\modules\metadata\mod_env.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_example_hooks"=.\modules\examples\mod_example_hooks.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_example_ipc"=.\modules\examples\mod_example_ipc.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_expires"=.\modules\metadata\mod_expires.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_ext_filter"=.\modules\filters\mod_ext_filter.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_file_cache"=.\modules\cache\mod_file_cache.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_filter"=.\modules\filters\mod_filter.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_http2"=.\modules\http2\mod_http2.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_headers"=.\modules\metadata\mod_headers.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_heartbeat"=.\modules\cluster\mod_heartbeat.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_watchdog + End Project Dependency +}}} + +############################################################################### + +Project: "mod_heartmonitor"=.\modules\cluster\mod_heartmonitor.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_watchdog + End Project Dependency +}}} + +############################################################################### + +Project: "mod_ident"=.\modules\metadata\mod_ident.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_imagemap"=.\modules\mappers\mod_imagemap.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_include"=.\modules\filters\mod_include.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_info"=.\modules\generators\mod_info.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_isapi"=.\modules\arch\win32\mod_isapi.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_lbmethod_bybusyness"=.\modules\proxy\balancers\mod_lbmethod_bybusyness.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_balancer + End Project Dependency +}}} + +############################################################################### + +Project: "mod_lbmethod_byrequests"=.\modules\proxy\balancers\mod_lbmethod_byrequests.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_balancer + End Project Dependency +}}} + +############################################################################### + +Project: "mod_lbmethod_bytraffic"=.\modules\proxy\balancers\mod_lbmethod_bytraffic.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_balancer + End Project Dependency +}}} + +############################################################################### + +Project: "mod_lbmethod_heartbeat"=.\modules\proxy\balancers\mod_lbmethod_heartbeat.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_balancer + End Project Dependency +}}} + +############################################################################### + +Project: "mod_ldap"=.\modules\ldap\mod_ldap.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_log_config"=.\modules\loggers\mod_log_config.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_log_debug"=.\modules\loggers\mod_log_debug.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_log_forensic"=.\modules\loggers\mod_log_forensic.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_logio"=.\modules\loggers\mod_logio.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_lua"=.\modules\lua\mod_lua.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_macro"=.\modules\core\mod_macro.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_md"=.\modules\md\mod_md.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_mime"=.\modules\http\mod_mime.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_mime_magic"=.\modules\metadata\mod_mime_magic.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_negotiation"=.\modules\mappers\mod_negotiation.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy"=.\modules\proxy\mod_proxy.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_ajp"=.\modules\proxy\mod_proxy_ajp.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_balancer"=.\modules\proxy\mod_proxy_balancer.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_connect"=.\modules\proxy\mod_proxy_connect.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_express"=.\modules\proxy\mod_proxy_express.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_fcgi"=.\modules\proxy\mod_proxy_fcgi.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + + +############################################################################### + +Project: "mod_proxy_ftp"=.\modules\proxy\mod_proxy_ftp.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_hcheck"=.\modules\proxy\mod_proxy_hcheck.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_html"=.\modules\filters\mod_proxy_html.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_http"=.\modules\proxy\mod_proxy_http.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_http2"=.\modules\http2\mod_proxy_http2.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_http2 + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_scgi"=.\modules\proxy\mod_proxy_scgi.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_uwsgi"=.\modules\proxy\mod_proxy_uwsgi.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_wstunnel"=.\modules\proxy\mod_proxy_wstunnel.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_ratelimit"=.\modules\filters\mod_ratelimit.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_reflector"=.\modules\filters\mod_reflector.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_remoteip"=.\modules\metadata\mod_remoteip.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_reqtimeout"=.\modules\filters\mod_reqtimeout.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_request"=.\modules\filters\mod_request.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_rewrite"=.\modules\mappers\mod_rewrite.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_sed"=.\modules\filters\mod_sed.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_session"=.\modules\session\mod_session.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_session_crypto"=.\modules\session\mod_session_crypto.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_session + End Project Dependency +}}} + +############################################################################### + +Project: "mod_session_cookie"=.\modules\session\mod_session_cookie.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_session + End Project Dependency +}}} + +############################################################################### + +Project: "mod_session_dbd"=.\modules\session\mod_session_dbd.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dbd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_session + End Project Dependency +}}} + +############################################################################### + +Project: "mod_setenvif"=.\modules\metadata\mod_setenvif.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_slotmem_plain"=.\modules\slotmem\mod_slotmem_plain.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_slotmem_shm"=.\modules\slotmem\mod_slotmem_shm.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_socache_dbm"=.\modules\cache\mod_socache_dbm.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_socache_dc"=.\modules\cache\mod_socache_dc.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_socache_memcache"=.\modules\cache\mod_socache_memcache.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_socache_shmcb"=.\modules\cache\mod_socache_shmcb.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_socache_redis"=.\modules\cache\mod_socache_redis.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_speling"=.\modules\mappers\mod_speling.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_ssl"=.\modules\ssl\mod_ssl.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_status"=.\modules\generators\mod_status.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_substitute"=.\modules\filters\mod_substitute.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_unique_id"=.\modules\metadata\mod_unique_id.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_userdir"=.\modules\mappers\mod_userdir.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_usertrack"=.\modules\metadata\mod_usertrack.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_version"=.\modules\metadata\mod_version.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_vhost_alias"=.\modules\mappers\mod_vhost_alias.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_watchdog"=.\modules\core\mod_watchdog.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_xml2enc"=.\modules\filters\mod_xml2enc.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "rotatelogs"=.\support\rotatelogs.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Project: "wintty"=.\support\win32\wintty.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/Apache.dsw b/Apache.dsw new file mode 100644 index 0000000..a984559 --- /dev/null +++ b/Apache.dsw @@ -0,0 +1,3601 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "httpd"=".\httpd.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "ApacheMonitor"=.\support\win32\ApacheMonitor.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency + Begin Project Dependency + Project_Dep_Name aprutil + End Project Dependency +}}} + +############################################################################### + +Project: "BuildAll"=.\BuildAll.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name BuildBin + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_bucketeer + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_case_filter + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_case_filter_in + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_echo + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_example_hooks + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_example_ipc + End Project Dependency +}}} + +############################################################################### + +Project: "BuildBin"=.\BuildBin.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name httpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name ApacheMonitor + End Project Dependency + Begin Project Dependency + Project_Dep_Name apr_ldap + End Project Dependency + Begin Project Dependency + Project_Dep_Name libapriconv_ces_modules + End Project Dependency + Begin Project Dependency + Project_Dep_Name libapriconv_ccs_modules + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_access_compat + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_actions + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_alias + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_allowmethods + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_asis + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_digest + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_form + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authn_anon + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authn_core + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authn_dbd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authn_dbm + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authn_file + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authn_socache + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authnz_fcgi + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authnz_ldap + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authz_core + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authz_dbd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authz_dbm + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authz_groupfile + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authz_host + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authz_owner + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_authz_user + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_autoindex + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_buffer + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_cache_disk + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_cache_socache + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_cern_meta + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_cgi + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_charset_lite + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_data + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dav_fs + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dav_lock + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dir + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dumpio + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_env + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_expires + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_ext_filter + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_file_cache + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_filter + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_headers + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_heartbeat + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_heartmonitor + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_ident + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_imagemap + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_include + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_info + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_isapi + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_lbmethod_bybusyness + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_lbmethod_byrequests + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_lbmethod_bytraffic + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_lbmethod_heartbeat + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_log_config + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_log_debug + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_log_forensic + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_logio + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_macro + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_mime + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_mime_magic + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_negotiation + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_ajp + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_balancer + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_connect + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_express + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_fcgi + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_ftp + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_hcheck + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_http + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_scgi + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_uwsgi + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_wstunnel + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_ratelimit + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_reflector + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_remoteip + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_reqtimeout + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_request + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_rewrite + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_sed + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_session_cookie + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_session_dbd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_setenvif + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_slotmem_plain + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_slotmem_shm + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_socache_dbm + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_socache_memcache + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_socache_shmcb + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_socache_redis + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_speling + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_status + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_substitute + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_unique_id + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_userdir + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_usertrack + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_version + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_vhost_alias + End Project Dependency + Begin Project Dependency + Project_Dep_Name ab + End Project Dependency + Begin Project Dependency + Project_Dep_Name htcacheclean + End Project Dependency + Begin Project Dependency + Project_Dep_Name htdbm + End Project Dependency + Begin Project Dependency + Project_Dep_Name htdigest + End Project Dependency + Begin Project Dependency + Project_Dep_Name htpasswd + End Project Dependency + Begin Project Dependency + Project_Dep_Name httxt2dbm + End Project Dependency + Begin Project Dependency + Project_Dep_Name logresolve + End Project Dependency + Begin Project Dependency + Project_Dep_Name rotatelogs + End Project Dependency + Begin Project Dependency + Project_Dep_Name wintty + End Project Dependency +}}} + +############################################################################### + +Project: "InstallBin"=.\InstallBin.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name BuildBin + End Project Dependency +}}} + +############################################################################### + +Project: "ab"=.\support\ab.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency + Begin Project Dependency + Project_Dep_Name aprutil + End Project Dependency +}}} + +############################################################################### + +Project: "abs"=.\support\abs.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency + Begin Project Dependency + Project_Dep_Name aprutil + End Project Dependency +}}} + +############################################################################### + +Project: "apr"=.\srclib\apr\apr.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "apriconv"=".\srclib\apr-iconv\apriconv.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "aprutil"=".\srclib\apr-util\aprutil.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apriconv + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbd_odbc"=".\srclib\apr-util\dbd\apr_dbd_odbc.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbd_mysql"=".\srclib\apr-util\dbd\apr_dbd_mysql.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbd_oracle"=".\srclib\apr-util\dbd\apr_dbd_oracle.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbd_pgsql"=".\srclib\apr-util\dbd\apr_dbd_pgsql.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbd_sqlite2"=".\srclib\apr-util\dbd\apr_dbd_sqlite2.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbd_sqlite3"=".\srclib\apr-util\dbd\apr_dbd_sqlite3.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbm_db"=".\srclib\apr-util\dbm\apr_dbm_db.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency +}}} + +############################################################################### + +Project: "apr_dbm_gdbm"=".\srclib\apr-util\dbm\apr_dbm_gdbm.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency +}}} + +############################################################################### + +Project: "apr_ldap"=".\srclib\apr-util\ldap\apr_ldap.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency +}}} + +############################################################################### + +Project: "fcgistarter"=.\support\fcgistarter.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency + Begin Project Dependency + Project_Dep_Name aprutil + End Project Dependency +}}} + +############################################################################### + +Project: "gen_test_char"=.\server\gen_test_char.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency +}}} + +############################################################################### + +Project: "htcacheclean"=.\support\htcacheclean.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency + Begin Project Dependency + Project_Dep_Name aprutil + End Project Dependency +}}} + +############################################################################### + +Project: "htdbm"=.\support\htdbm.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency + Begin Project Dependency + Project_Dep_Name aprutil + End Project Dependency +}}} + +############################################################################### + +Project: "htdigest"=.\support\htdigest.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency + Begin Project Dependency + Project_Dep_Name aprutil + End Project Dependency +}}} + +############################################################################### + +Project: "htpasswd"=.\support\htpasswd.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency + Begin Project Dependency + Project_Dep_Name aprutil + End Project Dependency +}}} + +############################################################################### + +Project: "httxt2dbm"=.\support\httxt2dbm.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency + Begin Project Dependency + Project_Dep_Name aprutil + End Project Dependency +}}} + +############################################################################### + +Project: "libapr"=.\srclib\apr\libapr.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libapriconv"=".\srclib\apr-iconv\libapriconv.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency +}}} + +############################################################################### + +Project: "libapriconv_ccs_modules"=".\srclib\apr-iconv\ccs\libapriconv_ccs_modules.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libapriconv + End Project Dependency + Begin Project Dependency + Project_Dep_Name libapriconv_ces_modules + End Project Dependency +}}} + +############################################################################### + +Project: "libapriconv_ces_modules"=".\srclib\apr-iconv\ces\libapriconv_ces_modules.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libapriconv + End Project Dependency +}}} + +############################################################################### + +Project: "libaprutil"=".\srclib\apr-util\libaprutil.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libapriconv + End Project Dependency +}}} + +############################################################################### + +Project: "libhttpd"=.\libhttpd.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libapriconv + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name gen_test_char + End Project Dependency +}}} + +############################################################################### + +Project: "logresolve"=.\support\logresolve.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency + Begin Project Dependency + Project_Dep_Name aprutil + End Project Dependency +}}} + +############################################################################### + +Project: "mod_actions"=.\modules\mappers\mod_actions.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_alias"=.\modules\mappers\mod_alias.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_allowmethods"=.\modules\aaa\mod_allowmethods.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_asis"=.\modules\generators\mod_asis.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + + +############################################################################### + +Project: "mod_access_compat"=.\modules\aaa\mod_access_compat.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_auth_basic"=.\modules\aaa\mod_auth_basic.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_auth_digest"=.\modules\aaa\mod_auth_digest.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_auth_form"=.\modules\aaa\mod_auth_form.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authn_anon"=.\modules\aaa\mod_authn_anon.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authn_core"=.\modules\aaa\mod_authn_core.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authn_dbd"=.\modules\aaa\mod_authn_dbd.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dbd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authn_dbm"=.\modules\aaa\mod_authn_dbm.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authn_file"=.\modules\aaa\mod_authn_file.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authn_socache"=.\modules\aaa\mod_authn_socache.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authnz_fcgi"=.\modules\aaa\mod_authnz_fcgi.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authnz_ldap"=.\modules\aaa\mod_authnz_ldap.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_ldap + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authz_core"=.\modules\aaa\mod_authz_core.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authz_dbd"=.\modules\aaa\mod_authz_dbd.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dbd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authz_dbm"=.\modules\aaa\mod_authz_dbm.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authz_groupfile"=.\modules\aaa\mod_authz_groupfile.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authz_host"=.\modules\aaa\mod_authz_host.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authz_owner"=.\modules\aaa\mod_authz_owner.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_authz_user"=.\modules\aaa\mod_authz_user.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_basic + End Project Dependency +}}} + +############################################################################### + +Project: "mod_autoindex"=.\modules\generators\mod_autoindex.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_brotli"=.\modules\filters\mod_brotli.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_bucketeer"=.\modules\debugging\mod_bucketeer.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_buffer"=.\modules\filters\mod_buffer.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_cache"=.\modules\cache\mod_cache.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_case_filter"=.\modules\examples\mod_case_filter.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_case_filter_in"=.\modules\examples\mod_case_filter_in.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_cern_meta"=.\modules\metadata\mod_cern_meta.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_cgi"=.\modules\generators\mod_cgi.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_charset_lite"=.\modules\filters\mod_charset_lite.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_data"=.\modules\filters\mod_data.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_dav"=.\modules\dav\main\mod_dav.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_dav_fs"=.\modules\dav\fs\mod_dav_fs.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dav + End Project Dependency +}}} + +############################################################################### + +Project: "mod_dav_lock"=.\modules\dav\lock\mod_dav_lock.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dav + End Project Dependency +}}} + +############################################################################### + +Project: "mod_dbd"=.\modules\database\mod_dbd.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_deflate"=.\modules\filters\mod_deflate.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_dir"=.\modules\mappers\mod_dir.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_cache_disk"=.\modules\cache\mod_cache_disk.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_cache + End Project Dependency +}}} + +############################################################################### + +Project: "mod_cache_socache"=.\modules\cache\mod_cache_socache.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_cache + End Project Dependency +}}} + +############################################################################### + +Project: "mod_dumpio"=.\modules\debugging\mod_dumpio.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_echo"=.\modules\echo\mod_echo.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_env"=.\modules\metadata\mod_env.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_example_hooks"=.\modules\examples\mod_example_hooks.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_example_ipc"=.\modules\examples\mod_example_ipc.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_expires"=.\modules\metadata\mod_expires.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_ext_filter"=.\modules\filters\mod_ext_filter.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_file_cache"=.\modules\cache\mod_file_cache.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_filter"=.\modules\filters\mod_filter.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_http2"=.\modules\http2\mod_http2.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_headers"=.\modules\metadata\mod_headers.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_heartbeat"=.\modules\cluster\mod_heartbeat.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_watchdog + End Project Dependency +}}} + +############################################################################### + +Project: "mod_heartmonitor"=.\modules\cluster\mod_heartmonitor.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_watchdog + End Project Dependency +}}} + +############################################################################### + +Project: "mod_ident"=.\modules\metadata\mod_ident.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_imagemap"=.\modules\mappers\mod_imagemap.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_include"=.\modules\filters\mod_include.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_info"=.\modules\generators\mod_info.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_isapi"=.\modules\arch\win32\mod_isapi.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_lbmethod_bybusyness"=.\modules\proxy\balancers\mod_lbmethod_bybusyness.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_balancer + End Project Dependency +}}} + +############################################################################### + +Project: "mod_lbmethod_byrequests"=.\modules\proxy\balancers\mod_lbmethod_byrequests.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_balancer + End Project Dependency +}}} + +############################################################################### + +Project: "mod_lbmethod_bytraffic"=.\modules\proxy\balancers\mod_lbmethod_bytraffic.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_balancer + End Project Dependency +}}} + +############################################################################### + +Project: "mod_lbmethod_heartbeat"=.\modules\proxy\balancers\mod_lbmethod_heartbeat.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_balancer + End Project Dependency +}}} + +############################################################################### + +Project: "mod_ldap"=.\modules\ldap\mod_ldap.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_log_config"=.\modules\loggers\mod_log_config.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_log_debug"=.\modules\loggers\mod_log_debug.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_log_forensic"=.\modules\loggers\mod_log_forensic.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_logio"=.\modules\loggers\mod_logio.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_lua"=.\modules\lua\mod_lua.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_macro"=.\modules\core\mod_macro.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_md"=.\modules\md\mod_md.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_mime"=.\modules\http\mod_mime.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_mime_magic"=.\modules\metadata\mod_mime_magic.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_negotiation"=.\modules\mappers\mod_negotiation.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy"=.\modules\proxy\mod_proxy.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_ajp"=.\modules\proxy\mod_proxy_ajp.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_balancer"=.\modules\proxy\mod_proxy_balancer.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_connect"=.\modules\proxy\mod_proxy_connect.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_express"=.\modules\proxy\mod_proxy_express.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_fcgi"=.\modules\proxy\mod_proxy_fcgi.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + + +############################################################################### + +Project: "mod_proxy_ftp"=.\modules\proxy\mod_proxy_ftp.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_hcheck"=.\modules\proxy\mod_proxy_hcheck.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_html"=.\modules\filters\mod_proxy_html.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_http"=.\modules\proxy\mod_proxy_http.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_http2"=.\modules\http2\mod_proxy_http2.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_http2 + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_scgi"=.\modules\proxy\mod_proxy_scgi.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_uwsgi"=.\modules\proxy\mod_proxy_uwsgi.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_proxy_wstunnel"=.\modules\proxy\mod_proxy_wstunnel.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy + End Project Dependency +}}} + +############################################################################### + +Project: "mod_ratelimit"=.\modules\filters\mod_ratelimit.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_reflector"=.\modules\filters\mod_reflector.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_remoteip"=.\modules\metadata\mod_remoteip.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_reqtimeout"=.\modules\filters\mod_reqtimeout.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_request"=.\modules\filters\mod_request.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_rewrite"=.\modules\mappers\mod_rewrite.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_sed"=.\modules\filters\mod_sed.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_session"=.\modules\session\mod_session.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_session_crypto"=.\modules\session\mod_session_crypto.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_session + End Project Dependency +}}} + +############################################################################### + +Project: "mod_session_cookie"=.\modules\session\mod_session_cookie.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_session + End Project Dependency +}}} + +############################################################################### + +Project: "mod_session_dbd"=.\modules\session\mod_session_dbd.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dbd + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_session + End Project Dependency +}}} + +############################################################################### + +Project: "mod_setenvif"=.\modules\metadata\mod_setenvif.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_slotmem_plain"=.\modules\slotmem\mod_slotmem_plain.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_slotmem_shm"=.\modules\slotmem\mod_slotmem_shm.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_socache_dbm"=.\modules\cache\mod_socache_dbm.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_socache_dc"=.\modules\cache\mod_socache_dc.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_socache_memcache"=.\modules\cache\mod_socache_memcache.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_socache_shmcb"=.\modules\cache\mod_socache_shmcb.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_socache_redis"=.\modules\cache\mod_socache_redis.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_speling"=.\modules\mappers\mod_speling.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_ssl"=.\modules\ssl\mod_ssl.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_status"=.\modules\generators\mod_status.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_substitute"=.\modules\filters\mod_substitute.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_unique_id"=.\modules\metadata\mod_unique_id.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_userdir"=.\modules\mappers\mod_userdir.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_usertrack"=.\modules\metadata\mod_usertrack.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_version"=.\modules\metadata\mod_version.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_vhost_alias"=.\modules\mappers\mod_vhost_alias.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_watchdog"=.\modules\core\mod_watchdog.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "mod_xml2enc"=.\modules\filters\mod_xml2enc.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency + Begin Project Dependency + Project_Dep_Name libaprutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name libhttpd + End Project Dependency +}}} + +############################################################################### + +Project: "rotatelogs"=.\support\rotatelogs.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency + Begin Project Dependency + Project_Dep_Name aprutil + End Project Dependency +}}} + +############################################################################### + +Project: "wintty"=.\support\win32\wintty.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency + Begin Project Dependency + Project_Dep_Name aprutil + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/BuildAll.dsp b/BuildAll.dsp new file mode 100644 index 0000000..1917165 --- /dev/null +++ b/BuildAll.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="BuildAll" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) External Target" 0x0106 + +CFG=BuildAll - Win32 Debug +!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 "BuildAll.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 "BuildAll.mak" CFG="BuildAll - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "BuildAll - Win32 Release" (based on "Win32 (x86) External Target") +!MESSAGE "BuildAll - Win32 Debug" (based on "Win32 (x86) External Target") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" + +!IF "$(CFG)" == "BuildAll - Win32 Release" + +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "" +# PROP BASE Intermediate_Dir "" +# PROP BASE Cmd_Line "NMAKE /f makefile.win" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "\Apache2\bin\httpd.exe" +# PROP BASE Bsc_Name ".\Browse\BuildAll.bsc" +# PROP BASE Target_Dir "" +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "" +# PROP Intermediate_Dir "" +# PROP Cmd_Line "NMAKE /f makefile.win INSTDIR="\Apache2" LONG=Release _dummy" +# PROP Rebuild_Opt "" +# PROP Target_File "\Apache2\bin\httpd.exe" +# PROP Bsc_Name ".\Browse\httpd.bsc" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "BuildAll - Win32 Debug" + +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "" +# PROP BASE Intermediate_Dir "" +# PROP BASE Cmd_Line "NMAKE /f makefile.win" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "\Apache2\bin\httpd.exe" +# PROP BASE Bsc_Name ".\Browse\BuildAll.bsc" +# PROP BASE Target_Dir "" +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "" +# PROP Intermediate_Dir "" +# PROP Cmd_Line "NMAKE /f makefile.win INSTDIR="\Apache2" LONG=Debug _dummy" +# PROP Rebuild_Opt "" +# PROP Target_File "\Apache2\bin\httpd.exe" +# PROP Bsc_Name ".\Browse\httpd.bsc" +# PROP Target_Dir "" + +!ENDIF + +# Begin Target + +# Name "BuildAll - Win32 Release" +# Name "BuildAll - Win32 Debug" + +!IF "$(CFG)" == "BuildAll - Win32 Release" + +!ELSEIF "$(CFG)" == "BuildAll - Win32 Debug" + +!ENDIF + +# Begin Source File + +SOURCE=.\os\win32\BaseAddr.ref +# End Source File +# Begin Source File + +SOURCE=.\CHANGES +# End Source File +# Begin Source File + +SOURCE=.\Makefile.win +# End Source File +# Begin Source File + +SOURCE=.\STATUS +# End Source File +# End Target +# End Project diff --git a/BuildBin.dsp b/BuildBin.dsp new file mode 100644 index 0000000..1559664 --- /dev/null +++ b/BuildBin.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="BuildBin" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) External Target" 0x0106 + +CFG=BuildBin - Win32 Debug +!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 "BuildBin.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 "BuildBin.mak" CFG="BuildBin - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "BuildBin - Win32 Release" (based on "Win32 (x86) External Target") +!MESSAGE "BuildBin - Win32 Debug" (based on "Win32 (x86) External Target") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" + +!IF "$(CFG)" == "BuildBin - Win32 Release" + +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "" +# PROP BASE Intermediate_Dir "" +# PROP BASE Cmd_Line "NMAKE /f makefile.win" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "\Apache2\bin\httpd.exe" +# PROP BASE Bsc_Name ".\Browse\BuildBin.bsc" +# PROP BASE Target_Dir "" +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "" +# PROP Intermediate_Dir "" +# PROP Cmd_Line "NMAKE /f makefile.win INSTDIR="\Apache2" LONG=Release _trydb _trylua _tryxml _tryssl _tryzlib _trynghttp2 _trybrotli _trymd _dummy" +# PROP Rebuild_Opt "" +# PROP Target_File "\Apache2\bin\httpd.exe" +# PROP Bsc_Name ".\Browse\httpd.bsc" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "BuildBin - Win32 Debug" + +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "" +# PROP BASE Intermediate_Dir "" +# PROP BASE Cmd_Line "NMAKE /f makefile.win" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "\Apache2\bin\httpd.exe" +# PROP BASE Bsc_Name ".\Browse\BuildBin.bsc" +# PROP BASE Target_Dir "" +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "" +# PROP Intermediate_Dir "" +# PROP Cmd_Line "NMAKE /f makefile.win INSTDIR="\Apache2" LONG=Debug _trydb _trylua _tryxml _tryssl _tryzlib _trynghttp2 _trybrotli _trymd _dummy" +# PROP Rebuild_Opt "" +# PROP Target_File "\Apache2\bin\httpd.exe" +# PROP Bsc_Name ".\Browse\httpd.bsc" +# PROP Target_Dir "" + +!ENDIF + +# Begin Target + +# Name "BuildBin - Win32 Release" +# Name "BuildBin - Win32 Debug" + +!IF "$(CFG)" == "BuildBin - Win32 Release" + +!ELSEIF "$(CFG)" == "BuildBin - Win32 Debug" + +!ENDIF + +# Begin Source File + +SOURCE=.\os\win32\BaseAddr.ref +# End Source File +# Begin Source File + +SOURCE=.\CHANGES +# End Source File +# Begin Source File + +SOURCE=.\Makefile.win +# End Source File +# Begin Source File + +SOURCE=.\STATUS +# End Source File +# End Target +# End Project diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000..bc3396d --- /dev/null +++ b/CHANGES @@ -0,0 +1,8294 @@ + -*- coding: utf-8 -*- +Changes with Apache 2.4.63 + + *) mod_dav: Update redirect-carefully example BrowserMatch config + to match more recent client versions. PR 66148, 67039. + [Michal Maloszewski , + Romain Tartière ] + + *) mod_cache_socache: Fix possible crash on error path. PR 69358. + [Ruediger Pluem] + + *) mod_ssl: Fail cleanly at startup if OpenSSL initialization fails. + [StephenWall] + + *) mod_md: update to version 2.4.31 + - Improved error reporting when waiting for ACME server to verify domains + or finalizing the order fails, e.g. times out. + - Increasing the timeouts to wait for ACME server to verify domain names + and issue the certificate from 30 seconds to 5 minutes. + - Change a log level from error to debug when Stapling is enabled but a + certificate carries no OCSP responder URL. + + *) mod_proxy_balancer: Fix the handling of the stickysession configuration + parameter by the balancer manager. PR 69510 + [Yutaka Tokunou ] + + *) Add the ldap-search option to mod_authnz_ldap, allowing authorization + to be based on arbitrary expressions that do not include the username. + Make sure that when ldap searches are too long, we explicitly log the + error. [Graham Leggett] + + *) mod_proxy: Honor parameters of ProxyPassMatch workers with substitution + in the host name or port. PR 69233. [Yann Ylavic] + + *) mod_log_config: Fix merging for the "LogFormat" directive. + PR 65222. [Michael Kaufmann ] + + *) mod_lua: Make r.ap_auth_type writable. PR 62497. + [Michael Osipov ] + + *) mod_md: update to version 2.4.29 + - Fixed HTTP-01 challenges to not carry a final newline, as some ACME + server fail to ignore it. [Michael Kaufmann (@mkauf)] + - Fixed missing label+newline in server-status plain text output when + MDStapling is enabled. + + *) mod_ssl: Restore support for loading PKCS#11 keys via ENGINE + without "SSLCryptoDevice" configured. [Joe Orton] + + *) mod_authnz_ldap: Fix possible memory corruption if the + AuthLDAPSubGroupAttribute directive is configured. [Joe Orton] + + *) mod_proxy_fcgi: Don't re-encode SCRIPT_FILENAME when set via SetHandler. + PR 69203. [Yann Ylavic] + + *) mod_rewrite, mod_proxy: mod_proxy to canonicalize rewritten [P] URLs, + including "unix:" ones. PR 69235, PR 69260. [Yann Ylavic, Ruediger Pluem] + + *) mod_rewrite: Error out in case a RewriteRule in directory context uses the + proxy, but mod_proxy is not loaded. PR 56264. + [Christophe Jaillet, Michael Streeter ] + + *) http: Remove support for Request-Range header sent by Navigator 2-3 and + MSIE 3. [Stefan Fritsch] + + *) mod_rewrite: Don't require [UNC] flag to preserve a leading // + added by applying the perdir prefix to the substitution. + [Ruediger Pluem, Eric Covener] + + *) Windows: Restore the ability to "Include" configuration files on UNC + paths. PR 69313 [Eric Covener] + + *) mod_proxy: Avoid AH01059 parsing error for SetHandler "unix:" URLs + in (incomplete fix in 2.4.62). PR 69160. [Yann Ylavic] + + *) mod_md: update to version 2.4.28 + - When the server starts, it looks for new, staged certificates to + activate. If the staged set of files in 'md/staging/' is messed + up, this could prevent further renewals to happen. Now, when the staging + set is present, but could not be activated due to an error, purge the + whole directory. [icing] + - Fix certificate retrieval on ACME renewal to not require a 'Location:' + header returned by the ACME CA. This was the way it was done in ACME + before it became an IETF standard. Let's Encrypt still supports this, + but other CAs do not. [icing] + - Restore compatibility with OpenSSL < 1.1. [ylavic] + + *) mod_tls: removed the experimental module. It now is availble standalone + from https://github.com/icing/mod_tls. The rustls provided API is not + stable and does not align with the httpd release cycle. + [Stefan Eissing] + + *) mod_rewrite: Better question mark tracking to avoid UnsafeAllow3F. + PR 69197. [Yann Ylavic, Eric Covener] + + *) mod_http2: Return connection monitoring to the event MPM when blocking + on client updates. [Stefan Eissing, Yann Ylavic] + +Changes with Apache 2.4.62 + + *) SECURITY: CVE-2024-40898: Apache HTTP Server: SSRF with + mod_rewrite in server/vhost context on Windows (cve.mitre.org) + SSRF in Apache HTTP Server on Windows with mod_rewrite in + server/vhost context, allows to potentially leak NTML hashes to + a malicious server via SSRF and malicious requests. + Users are recommended to upgrade to version 2.4.62 which fixes + this issue. + Credits: Smi1e (DBAPPSecurity Ltd.) + + *) SECURITY: CVE-2024-40725: Apache HTTP Server: source code + disclosure with handlers configured via AddType (cve.mitre.org) + A partial fix for CVE-2024-39884 in the core of Apache HTTP + Server 2.4.61 ignores some use of the legacy content-type based + configuration of handlers. "AddType" and similar configuration, + under some circumstances where files are requested indirectly, + result in source code disclosure of local content. For example, + PHP scripts may be served instead of interpreted. + Users are recommended to upgrade to version 2.4.62, which fixes + this issue. + + *) mod_proxy: Fix canonicalisation and FCGI env (PATH_INFO, SCRIPT_NAME) for + "balancer:" URLs set via SetHandler, also allowing for "unix:" sockets + with BalancerMember(s). PR 69168. [Yann Ylavic] + + *) mod_proxy: Avoid AH01059 parsing error for SetHandler "unix:" URLs. + PR 69160 [Yann Ylavic] + + *) mod_ssl: Fix crashes in PKCS#11 ENGINE support with OpenSSL 3.2. + [Joe Orton] + + *) mod_ssl: Add support for loading certs/keys from pkcs11: URIs + via OpenSSL 3.x providers. [Ingo Franzki ] + + *) mod_ssl: Restore SSL dumping on trace7 loglevel with OpenSSL >= 3.0. + [Ruediger Pluem, Yann Ylavic] + + *) mpm_worker: Fix possible warning (AH00045) about children processes not + terminating timely. [Yann Ylavic] + +Changes with Apache 2.4.61 + + *) SECURITY: CVE-2024-39884: Apache HTTP Server: source code + disclosure with handlers configured via AddType (cve.mitre.org) + A regression in the core of Apache HTTP Server 2.4.60 ignores + some use of the legacy content-type based configuration of + handlers. "AddType" and similar configuration, under some + circumstances where files are requested indirectly, result in + source code disclosure of local content. For example, PHP + scripts may be served instead of interpreted. + Users are recommended to upgrade to version 2.4.61, which fixes + this issue. + +Changes with Apache 2.4.60 + + *) SECURITY: CVE-2024-39573: Apache HTTP Server: mod_rewrite proxy + handler substitution (cve.mitre.org) + Potential SSRF in mod_rewrite in Apache HTTP Server 2.4.59 and + earlier allows an attacker to cause unsafe RewriteRules to + unexpectedly setup URL's to be handled by mod_proxy. + Credits: Orange Tsai (@orange_8361) from DEVCORE + + *) SECURITY: CVE-2024-38477: Apache HTTP Server: Crash resulting in + Denial of Service in mod_proxy via a malicious request + (cve.mitre.org) + null pointer dereference in mod_proxy in Apache HTTP Server + 2.4.59 and earlier allows an attacker to crash the server via a + malicious request. + Credits: Orange Tsai (@orange_8361) from DEVCORE + + *) SECURITY: CVE-2024-38476: Apache HTTP Server may use + exploitable/malicious backend application output to run local + handlers via internal redirect (cve.mitre.org) + Vulnerability in core of Apache HTTP Server 2.4.59 and earlier + are vulnerably to information disclosure, SSRF or local script + execution via backend applications whose response headers are + malicious or exploitable. + + Note: Some legacy uses of the 'AddType' directive to connect a + request to a handler must be ported to 'AddHandler' after this fix. + + Credits: Orange Tsai (@orange_8361) from DEVCORE + + *) SECURITY: CVE-2024-38475: Apache HTTP Server weakness in + mod_rewrite when first segment of substitution matches + filesystem path. (cve.mitre.org) + Improper escaping of output in mod_rewrite in Apache HTTP Server + 2.4.59 and earlier allows an attacker to map URLs to filesystem + locations that are permitted to be served by the server but are + not intentionally/directly reachable by any URL, resulting in + code execution or source code disclosure. + Substitutions in server context that use a backreferences or + variables as the first segment of the substitution are affected. + Some unsafe RewiteRules will be broken by this change and the + rewrite flag "UnsafePrefixStat" can be used to opt back in once + ensuring the substitution is appropriately constrained. + Credits: Orange Tsai (@orange_8361) from DEVCORE + + *) SECURITY: CVE-2024-38474: Apache HTTP Server weakness with + encoded question marks in backreferences (cve.mitre.org) + Substitution encoding issue in mod_rewrite in Apache HTTP Server + 2.4.59 and earlier allows attacker to execute scripts in + directories permitted by the configuration but not directly + reachable by any URL or source disclosure of scripts meant to + only to be executed as CGI. + + Note: Some RewriteRules that capture and substitute unsafely will now + fail unless rewrite flag "UnsafeAllow3F" is specified. + + Credits: Orange Tsai (@orange_8361) from DEVCORE + + *) SECURITY: CVE-2024-38473: Apache HTTP Server proxy encoding + problem (cve.mitre.org) + Encoding problem in mod_proxy in Apache HTTP Server 2.4.59 and + earlier allows request URLs with incorrect encoding to be sent + to backend services, potentially bypassing authentication via + crafted requests. + Credits: Orange Tsai (@orange_8361) from DEVCORE + + *) SECURITY: CVE-2024-38472: Apache HTTP Server on Windows UNC SSRF + (cve.mitre.org) + SSRF in Apache HTTP Server on Windows allows to potentially leak + NTML hashes to a malicious server via SSRF and malicious + requests or content + + Note: Existing configurations that access UNC paths + will have to configure new directive "UNCList" to allow access + during request processing. + + Credits: Orange Tsai (@orange_8361) from DEVCORE + + *) SECURITY: CVE-2024-36387: Apache HTTP Server: DoS by Null + pointer in websocket over HTTP/2 (cve.mitre.org) + Serving WebSocket protocol upgrades over a HTTP/2 connection + could result in a Null Pointer dereference, leading to a crash + of the server process, degrading performance. + Credits: Marc Stern () + + *) mod_proxy: Fix DNS requests and connections closed before the + configured addressTTL. PR 69126. [Yann Ylavic] + + *) core: On Linux, log the real thread ID in error logs. [Joe Orton] + + *) core: Support zone/scope in IPv6 link-local addresses in Listen and + VirtualHost directives (requires APR 1.7.x or later). PR 59396 + [Joe Orton] + + *) mod_ssl: Reject client-initiated renegotiation with a TLS alert + (rather than connection closure). [Joe Orton, Yann Ylavic] + + *) Updated mime.types. [Mohamed Akram , + Adam Silverstein ] + + *) mod_ssl: Fix a regression that causes the default DH parameters for a key + no longer set and thus effectively disabling DH ciphers when no explicit + DH parameters are set. PR 68863 [Ruediger Pluem] + + *) mod_cgid: Optional support for file descriptor passing, fixing + error log handling (configure --enable-cgid-fdpassing) on Unix + platforms. PR 54221. [Joe Orton] + + *) mod_cgid/mod_cgi: Distinguish script stderr output clearly in + error logs. PR 61980. [Hank Ibell ] + + *) mod_tls: update version of rustls-ffi to v0.13.0. + [Daniel McCarney (@cpu}] + + *) mod_md: + - Using OCSP stapling information to trigger certificate renewals. Proposed + by @frasertweedale. + - Added directive `MDCheckInterval` to control how often the server checks + for detected revocations. Added proposals for configurations in the + README.md chapter "Revocations". + - OCSP stapling: accept OCSP responses without a `nextUpdate` entry which is + allowed in RFC 6960. Treat those as having an update interval of 12 hours. + Added by @frasertweedale. + - Adapt OpenSSL usage to changes in their API. By Yann Ylavic. + +Changes with Apache 2.4.59 + + *) SECURITY: CVE-2024-27316: Apache HTTP Server: HTTP/2 DoS by + memory exhaustion on endless continuation frames (cve.mitre.org) + HTTP/2 incoming headers exceeding the limit are temporarily + buffered in nghttp2 in order to generate an informative HTTP 413 + response. If a client does not stop sending headers, this leads + to memory exhaustion. + Credits: Bartek Nowotarski (https://nowotarski.info/) + + *) SECURITY: CVE-2024-24795: Apache HTTP Server: HTTP Response + Splitting in multiple modules (cve.mitre.org) + HTTP Response splitting in multiple modules in Apache HTTP + Server allows an attacker that can inject malicious response + headers into backend applications to cause an HTTP + desynchronization attack. + + After this change, CGI-like scripts cannot set Transfer-Encoding + or Content-Length headers. To restore the ability to set Content-Length + header, set per-request environment variable 'ap_trust_cgilike_cl' to any + non-empty value. + + Credits: Keran Mu, Tsinghua University and Zhongguancun + Laboratory. + + *) SECURITY: CVE-2023-38709: Apache HTTP Server: HTTP response + splitting (cve.mitre.org) + Faulty input validation in the core of Apache allows malicious + or exploitable backend/content generators to split HTTP + responses. + This issue affects Apache HTTP Server: through 2.4.58. + Credits: Orange Tsai (@orange_8361) from DEVCORE + + *) mod_deflate: Fixes and better logging for handling various + error and edge cases. [Eric Covener, Yann Ylavic, Joe Orton, + Eric Norris ] + + *) Add CGIScriptTimeout to mod_cgi. [Eric Covener] + + *) mod_xml2enc: Tolerate libxml2 2.12.0 and later. PR 68610 + [ttachi ] + + *) mod_slotmem_shm: Use ap_os_is_path_absolute() to make it portable. + [Jean-Frederic Clere] + + *) mod_ssl: Use OpenSSL-standard functions to assemble CA + name lists for SSLCACertificatePath/SSLCADNRequestPath. + Names will now be consistently sorted. PR 61574. + [Joe Orton] + + *) mod_xml2enc: Update check to accept any text/ media type + or any XML media type per RFC 7303, avoiding + corruption of Microsoft OOXML formats. PR 64339. + [Joseph Heenan , Joe Orton] + + *) mod_http2: v2.0.26 with the following fixes: + - Fixed `Date` header on requests upgraded from HTTP/1.1 (h2c). Fixes + . + - Fixed small memory leak in h2 header bucket free. Thanks to + Michael Kaufmann for finding this and providing the fix. + + *) htcacheclean: In -a/-A mode, list all files per subdirectory + rather than only one. PR 65091. + [Artem Egorenkov ] + + *) mod_ssl: SSLProxyMachineCertificateFile/Path may reference files + which include CA certificates; those CA certs are treated as if + configured with SSLProxyMachineCertificateChainFile. [Joe Orton] + + *) htpasswd, htdbm, dbmmanage: Update help&docs to refer to + "hashing", rather than "encrypting" passwords. + [Michele Preziuso ] + + *) mod_ssl: Fix build with LibreSSL 2.0.7+. PR 64047. + [Giovanni Bechis, Yann Ylavic] + + *) htpasswd: Add support for passwords using SHA-2. [Joe Orton, + Yann Ylavic] + + *) core: Allow mod_env to override system environment vars. [Joe Orton] + + *) Allow mod_dav_fs to tolerate race conditions between PROPFIND and an + operation which removes a directory/file between apr_dir_read() and + apr_stat(). Current behaviour is to abort the connection which seems + inferior to tolerating (and logging) the error. [Joe Orton] + + *) mod_ldap: HTML-escape data in the ldap-status handler. + [Eric Covener, Chamal De Silva] + + *) mod_ssl: Disable the OpenSSL ENGINE API when OPENSSL_NO_ENGINE is set. + Allow for "SSLCryptoDevice builtin" if the ENGINE API is not available, + notably with OpenSSL >= 3. PR 68080. [Yann Ylavic, Joe Orton] + + *) mod_ssl: Improve compatibility with OpenSSL 3, fix build warnings about + deprecated ENGINE_ API, honor OPENSSL_API_COMPAT setting while defaulting + to compatibitily with version 1.1.1 (including ENGINEs / SSLCryptoDevice). + [Yann Ylavic] + + *) mod_ssl: release memory to the OS when needed. [Giovanni Bechis] + + *) mod_proxy: Ignore (and warn about) enablereuse=on for ProxyPassMatch when + some dollar substitution (backreference) happens in the hostname or port + part of the URL. [Yann Ylavic] + + *) mod_proxy: Allow to set a TTL for how long DNS resolutions to backend + systems are cached. [Yann Ylavic] + + *) mod_proxy: Add optional third argument for ProxyRemote, which + configures Basic authentication credentials to pass to the remote + proxy. PR 37355. [Joe Orton] + +Changes with Apache 2.4.58 + + *) SECURITY: CVE-2023-45802: Apache HTTP Server: HTTP/2 stream + memory not reclaimed right away on RST (cve.mitre.org) + When a HTTP/2 stream was reset (RST frame) by a client, there + was a time window were the request's memory resources were not + reclaimed immediately. Instead, de-allocation was deferred to + connection close. A client could send new requests and resets, + keeping the connection busy and open and causing the memory + footprint to keep on growing. On connection close, all resources + were reclaimed, but the process might run out of memory before + that. + This was found by the reporter during testing of CVE-2023-44487 + (HTTP/2 Rapid Reset Exploit) with their own test client. During + "normal" HTTP/2 use, the probability to hit this bug is very + low. The kept memory would not become noticeable before the + connection closes or times out. + Users are recommended to upgrade to version 2.4.58, which fixes + the issue. + Credits: Will Dormann of Vul Labs + + *) SECURITY: CVE-2023-43622: Apache HTTP Server: DoS in HTTP/2 with + initial windows size 0 (cve.mitre.org) + An attacker, opening a HTTP/2 connection with an initial window + size of 0, was able to block handling of that connection + indefinitely in Apache HTTP Server. This could be used to + exhaust worker resources in the server, similar to the well + known "slow loris" attack pattern. + This has been fixed in version 2.4.58, so that such connection + are terminated properly after the configured connection timeout. + This issue affects Apache HTTP Server: from 2.4.55 through + 2.4.57. + Users are recommended to upgrade to version 2.4.58, which fixes + the issue. + Credits: Prof. Sven Dietrich (City University of New York) + + *) SECURITY: CVE-2023-31122: mod_macro buffer over-read + (cve.mitre.org) + Out-of-bounds Read vulnerability in mod_macro of Apache HTTP + Server.This issue affects Apache HTTP Server: through 2.4.57. + Credits: David Shoon (github/davidshoon) + + *) mod_ssl: Silence info log message "SSL Library Error: error:0A000126: + SSL routines::unexpected eof while reading" when using + OpenSSL 3 by setting SSL_OP_IGNORE_UNEXPECTED_EOF if + available. [Rainer Jung] + + *) mod_http2: improved early cleanup of streams. + [Stefan Eissing] + + *) mod_proxy_http2: improved error handling on connection errors while + response is already underway. + [Stefan Eissing] + + *) mod_http2: fixed a bug that could lead to a crash in main connection + output handling. This occured only when the last request on a HTTP/2 + connection had been processed and the session decided to shut down. + This could lead to an attempt to send a final GOAWAY while the previous + write was still in progress. See PR 66646. + [Stefan Eissing] + + *) mod_proxy_http2: fix `X-Forward-Host` header to carry the correct value. + Fixes PR66752. + [Stefan Eissing] + + *) mod_http2: added support for bootstrapping WebSockets via HTTP/2, as + described in RFC 8441. A new directive 'H2WebSockets on|off' has been + added. The feature is by default not enabled. + As also discussed in the manual, this feature should work for setups + using "ProxyPass backend-url upgrade=websocket" without further changes. + Special server modules for WebSockets will have to be adapted, + most likely, as the handling if IO events is different with HTTP/2. + HTTP/2 WebSockets are supported on platforms with native pipes. This + excludes Windows. + [Stefan Eissing] + + *) mod_rewrite: Fix a regression with both a trailing ? and [QSA]. + in OCSP stapling. PR 66672. [Frank Meier , covener] + + *) mod_http2: fixed a bug in flushing pending data on an already closed + connection that could lead to a busy loop, preventing the HTTP/2 session + to close down successfully. Fixed PR 66624. + [Stefan Eissing] + + *) mod_http2: v2.0.15 with the following fixes and improvements + - New directive 'H2EarlyHint name value' to add headers to a response, + picked up already when a "103 Early Hints" response is sent. 'name' and + 'value' must comply to the HTTP field restrictions. + This directive can be repeated several times and header fields of the + same names add. Sending a 'Link' header with 'preload' relation will + also cause a HTTP/2 PUSH if enabled and supported by the client. + - Fixed an issue where requests were not logged and accounted in a timely + fashion when the connection returns to "keepalive" handling, e.g. when + the request served was the last outstanding one. + This led to late appearance in access logs with wrong duration times + reported. + - Accurately report the bytes sent for a request in the '%O' Log format. + This addresses #203, a long outstanding issue where mod_h2 has reported + numbers over-eagerly from internal buffering and not what has actually + been placed on the connection. + The numbers are now the same with and without H2CopyFiles enabled. + [Stefan Eissing] + + *) mod_proxy_http2: fix retry handling to not leak temporary errors. + On detecting that that an existing connection was shutdown by the other + side, a 503 response leaked even though the request was retried on a + fresh connection. + [Stefan Eissing] + + *) mod_rewrite: Add server directory to include path as mod_rewrite requires + test_char.h. PR 66571 [Valeria Petrov ] + + *) mod_http2: new directive `H2ProxyRequests on|off` to enable handling + of HTTP/2 requests in a forward proxy configuration. + General forward proxying is enabled via `ProxyRequests`. If the + HTTP/2 protocol is also enabled for such a server/host, this new + directive is needed in addition. + [Stefan Eissing] + + *) core: Updated conf/mime.types: + - .js moved from 'application/javascript' to 'text/javascript' + - .mjs was added as 'text/javascript' + - add .opus ('audio/ogg') + - add 'application/vnd.geogebra.slides' + - add WebAssembly MIME types and extension + [Mathias Bynens <@mathiasbynens> via PR 318, + Richard de Boer , Dave Hodder , + Zbynek Konecny ] + + *) mod_proxy_http2: fixed using the wrong "bucket_alloc" from the backend + connection when sending data on the frontend one. This caused crashes + or infinite loops in rare situations. + *) mod_proxy_http2: fixed a bug in retry/response handling that could lead + to wrong status codes or HTTP messages send at the end of response bodies + exceeding the announced content-length. + *) mod_proxy_http2: fix retry handling to not leak temporary errors. + On detecting that that an existing connection was shutdown by the other + side, a 503 response leaked even though the request was retried on a + fresh connection. + *) mod_http2: fixed a bug that did cleanup of consumed and pending buckets in + the wrong order when a bucket_beam was destroyed. + [Stefan Eissing] + + *) mod_http2: avoid double chunked-encoding on internal redirects. + PR 66597 [Yann Ylavic, Stefan Eissing] + + *) mod_http2: Fix reporting of `Total Accesses` in server-status to not count + HTTP/2 requests twice. Fixes PR 66801. + [Stefan Eissing] + + *) mod_ssl: Fix handling of Certificate Revoked messages + in OCSP stapling. PR 66626. [] + + *) mod_http2: fixed a bug in handling of stream timeouts. + [Stefan Eissing] + + *) mod_tls: updating to rustls-ffi version 0.9.2 or higher. + Checking in configure for proper version installed. Code + fixes for changed clienthello member name. + [Stefan Eissing] + + *) mod_md: + - New directive `MDMatchNames all|servernames` to allow more control over how + MDomains are matched to VirtualHosts. + - New directive `MDChallengeDns01Version`. Setting this to `2` will provide + the command also with the challenge value on `teardown` invocation. In version + 1, the default, only the `setup` invocation gets this parameter. + Refs #312. Thanks to @domrim for the idea. + - For Managed Domain in "manual" mode, the checks if all used ServerName and + ServerAlias are part of the MDomain now reports a warning instead of an error + (AH10040) when not all names are present. + - MDChallengeDns01 can now be configured for individual domains. + Using PR from Jérôme Billiras (@bilhackmac) and adding test case and fixing proper working + - Fixed a bug found by Jérôme Billiras (@bilhackmac) that caused the challenge + teardown not being invoked as it should. + + *) mod_ldap: Avoid performance overhead of APR-util rebind cache for + OpenLDAP 2.2+. PR 64414. [Joe Orton] + + *) mod_http2: new directive 'H2MaxDataFrameLen n' to limit the maximum + amount of response body bytes put into a single HTTP/2 DATA frame. + Setting this to 0 places no limit (but the max size allowed by the + protocol is observed). + The module, by default, tries to use the maximum size possible, which is + somewhat around 16KB. This sets the maximum. When less response data is + available, smaller frames will be sent. + + *) mod_md: fixed passing of the server environment variables to programs + started via MDMessageCmd and MDChallengeDns01 on *nix system. + See . + [Stefan Eissing] + + *) mod_dav: Add DavBasePath directive to configure the repository root + path. PR 35077. [Joe Orton] + + *) mod_alias: Add AliasPreservePath directive to map the full + path after the alias in a location. [Graham Leggett] + + *) mod_alias: Add RedirectRelative to allow relative redirect targets to be + issued as-is. [Eric Covener, Graham Leggett] + + *) core: Add formats %{z} and %{strftime-format} to ErrorLogFormat, and make + sure that if the format is configured early enough it applies to every log + line. PR 62161. [Yann Ylavic] + + *) mod_deflate: Add DeflateAlterETag to control how the ETag + is modified. The 'NoChange' parameter mimics 2.2.x behavior. + PR 45023, PR 39727. [Eric Covener] + + *) core: Optimize send_brigade_nonblocking(). [Yann Ylavic, Christophe Jaillet] + + *) mod_status: Remove duplicate keys "BusyWorkers" and "IdleWorkers". + Resolve inconsistency between the previous two occurrences by + counting workers in state SERVER_GRACEFUL no longer as busy, + but instead in a new counter "GracefulWorkers" (or on HTML + view as "workers gracefully restarting"). Also add the graceful + counter as a new column to the existing HTML per process table + for async MPMs. PR 63300. [Rainer Jung] + +Changes with Apache 2.4.57 + + *) mod_proxy: Check before forwarding that a nocanon path has not been + rewritten with spaces during processing. [Yann Ylavic] + + *) mod_proxy: In case that AllowEncodedSlashes is set to NoDecode do not + double encode encoded slashes in the URL sent by the reverse proxy to the + backend. [Ruediger Pluem] + + *) mod_http2: fixed a crash during connection termination. See PR 66539. + [Stefan Eissing] + + *) mod_rewrite: Fix a 2.4.56 regression for substitutions ending + in a question mark. PR66547. [Eric Covener] + + *) mod_rewrite: Add "BCTLS" and "BNE" RewriteRule flags. Re-allow encoded + characters on redirections without the "NE" flag. + [Yann Ylavic, Eric Covener] + + *) mod_proxy: Fix double encoding of the uri-path of the request forwarded + to the origin server, when using mapping=encoded|servlet. [Yann Ylavic] + + *) mod_mime: Do not match the extention against possible query string + parameters in case ProxyPass was used with the nocanon option. + [Ruediger Pluem] + +Changes with Apache 2.4.56 + + *) SECURITY: CVE-2023-27522: Apache HTTP Server: mod_proxy_uwsgi + HTTP response splitting (cve.mitre.org) + HTTP Response Smuggling vulnerability in Apache HTTP Server via + mod_proxy_uwsgi. This issue affects Apache HTTP Server: from + 2.4.30 through 2.4.55. + Special characters in the origin response header can + truncate/split the response forwarded to the client. + Credits: Dimas Fariski Setyawan Putra (nyxsorcerer) + + *) SECURITY: CVE-2023-25690: HTTP request splitting with + mod_rewrite and mod_proxy (cve.mitre.org) + Some mod_proxy configurations on Apache HTTP Server versions + 2.4.0 through 2.4.55 allow a HTTP Request Smuggling attack. + Configurations are affected when mod_proxy is enabled along with + some form of RewriteRule or ProxyPassMatch in which a non-specific + pattern matches some portion of the user-supplied request-target (URL) + data and is then re-inserted into the proxied request-target + using variable substitution. For example, something like: + RewriteEngine on + RewriteRule "^/here/(.*)" "http://example.com:8080/elsewhere?$1"; [P] + ProxyPassReverse /here/ http://example.com:8080/ + Request splitting/smuggling could result in bypass of access + controls in the proxy server, proxying unintended URLs to + existing origin servers, and cache poisoning. + Credits: Lars Krapf of Adobe + + *) rotatelogs: Add -T flag to allow subsequent rotated logfiles to be + truncated without the initial logfile being truncated. [Eric Covener] + + *) mod_ldap: LDAPConnectionPoolTTL should accept negative values in order to + allow connections of any age to be reused. Up to now, a negative value + was handled as an error when parsing the configuration file. PR 66421. + [nailyk , Christophe Jaillet] + + *) mod_proxy_ajp: Report an error if the AJP backend sends an invalid number + of headers. [Ruediger Pluem] + + *) mod_md: + - Enabling ED25519 support and certificate transparency information when + building with libressl v3.5.0 and newer. Thanks to Giovanni Bechis. + - MDChallengeDns01 can now be configured for individual domains. + Thanks to Jérôme Billiras (@bilhackmac) for the initial PR. + - Fixed a bug found by Jérôme Billiras (@bilhackmac) that caused the challenge + teardown not being invoked as it should. + [Stefan Eissing] + + *) mod_http2: client resets of HTTP/2 streams led to unwanted 500 errors + reported in access logs and error documents. The processing of the + reset was correct, only unneccesary reporting was caused. + [Stefan Eissing] + + *) mod_proxy_uwsgi: Stricter backend HTTP response parsing/validation. + [Yann Ylavic] + +Changes with Apache 2.4.55 + + *) SECURITY: CVE-2022-37436: Apache HTTP Server: mod_proxy prior to + 2.4.55 allows a backend to trigger HTTP response splitting + (cve.mitre.org) + Prior to Apache HTTP Server 2.4.55, a malicious backend can + cause the response headers to be truncated early, resulting in + some headers being incorporated into the response body. If the + later headers have any security purpose, they will not be + interpreted by the client. + Credits: Dimas Fariski Setyawan Putra (@nyxsorcerer) + + *) SECURITY: CVE-2022-36760: Apache HTTP Server: mod_proxy_ajp + Possible request smuggling (cve.mitre.org) + Inconsistent Interpretation of HTTP Requests ('HTTP Request + Smuggling') vulnerability in mod_proxy_ajp of Apache HTTP Server + allows an attacker to smuggle requests to the AJP server it + forwards requests to. This issue affects Apache HTTP Server + Apache HTTP Server 2.4 version 2.4.54 and prior versions. + Credits: ZeddYu_Lu from Qi'anxin Research Institute of Legendsec + at Qi'anxin Group + + *) SECURITY: CVE-2006-20001: mod_dav out of bounds read, or write + of zero byte (cve.mitre.org) + A carefully crafted If: request header can cause a memory read, + or write of a single zero byte, in a pool (heap) memory location + beyond the header value sent. This could cause the process to + crash. + This issue affects Apache HTTP Server 2.4.54 and earlier. + + *) mod_dav: Open the lock database read-only when possible. + PR 36636 [Wilson Felipe , manu] + + *) mod_proxy_http2: apply the standard httpd content type handling + to responses from the backend, as other proxy modules do. Fixes PR 66391. + Thanks to Jérôme Billiras for providing the patch. + [Stefan Eissing] + + *) mod_dav: mod_dav overrides dav_fs response on PUT failure. PR 35981 + [Basant Kumar Kukreja , Alejandro Alvarez + ] + + *) mod_proxy_hcheck: Honor worker timeout settings. [Yann Ylavic] + + *) mod_http2: version 2.0.11 of the module, synchronizing changes + with the gitgub version. This is a partial rewrite of how connections + and streams are handled. + - an APR pollset and pipes (where supported) are used to monitor + the main connection and react to IO for request/response handling. + This replaces the stuttered timed waits of earlier versions. + - H2SerializeHeaders directive still exists, but has no longer an effect. + - Clients that seemingly misbehave still get less resources allocated, + but ongoing requests are no longer disrupted. + - Fixed an issue since 1.15.24 that "Server" headers in proxied requests + were overwritten instead of preserved. [PR by @daum3ns] + - A regression in v1.15.24 was fixed that could lead to httpd child + processes not being terminated on a graceful reload or when reaching + MaxConnectionsPerChild. When unprocessed h2 requests were queued at + the time, these could stall. See #212. + - Improved information displayed in 'server-status' for H2 connections when + Extended Status is enabled. Now one can see the last request that IO + operations happened on and transferred IO stats are updated as well. + - When reaching server limits, such as MaxRequestsPerChild, the HTTP/2 connection + send a GOAWAY frame much too early on new connections, leading to invalid + protocol state and a client failing the request. See PR65731 at + . + The module now initializes the HTTP/2 protocol correctly and allows the + client to submit one request before the shutdown via a GOAWAY frame + is being announced. + - :scheme pseudo-header values, not matching the + connection scheme, are forwarded via absolute uris to the + http protocol processing to preserve semantics of the request. + Checks on combinations of pseudo-headers values/absence + have been added as described in RFC 7540. Fixes #230. + - A bug that prevented trailers (e.g. HEADER frame at the end) to be + generated in certain cases was fixed. See #233 where it prevented + gRPC responses to be properly generated. + - Request and response header values are automatically stripped of leading + and trialing space/tab characters. This is equivalent behaviour to what + Apache httpd's http/1.1 parser does. + The checks for this in nghttp2 v1.50.0+ are disabled. + - Extensive testing in production done by Alessandro Bianchi (@alexskynet) + on the v2.0.x versions for stability. Many thanks! + + *) mod_proxy_http2: fixed #235 by no longer forwarding 'Host:' header when + request ':authority' is known. Improved test case that did not catch that + the previous 'fix' was incorrect. + + *) mod_proxy_hcheck: hcmethod now allows for HTTP/1.1 requests + using GET11, HEAD11 and/or OPTIONS11. [Jim Jagielski] + + *) mod_proxy: The AH03408 warning for a forcibly closed backend + connection is now logged at INFO level. [Yann Ylavic] + + *) mod_ssl: When dumping the configuration, the existence of + certificate/key files is no longer tested. [Joe Orton] + + *) mod_authn_core: Add expression support to AuthName and AuthType. + [Graham Leggett] + + *) mod_ssl: when a proxy connection had handled a request using SSL, an + error was logged when "SSLProxyEngine" was only configured in the + location/proxy section and not the overall server. The connection + continued to work, the error log was in error. Fixed PR66190. + [Stefan Eissing] + + *) mod_proxy_hcheck: Re-enable workers in standard ERROR state. PR 66302. + [Alessandro Cavaliere ] + + *) mod_proxy_hcheck: Detect AJP/CPING support correctly. PR 66300. + [Alessandro Cavaliere ] + + *) mod_http2: Export mod_http2.h as public header. [Stefan Eissing] + + *) mod_md: a new directive `MDStoreLocks` can be used on cluster + setups with a shared file system for `MDStoreDir` to order + activation of renewed certificates when several cluster nodes are + restarted at the same time. Store locks are not enabled by default. + Restored curl_easy cleanup behaviour from v2.4.14 and refactored + the use of curl_multi for OCSP requests to work with that. + Fixes . + + *) core: Avoid an overflow on large inputs in ap_is_matchexp. PR 66033 + [Ruediger Pluem] + + *) mod_heartmonitor: Allow "HeartbeatMaxServers 0" to use file based + storage instead of slotmem. Needed after setting + HeartbeatMaxServers default to the documented value 10 in 2.4.54. + PR 66131. [Jérôme Billiras] + + *) mod_dav: DAVlockDiscovery option to disable WebDAV lock discovery + This is a game changer for performances if client use PROPFIND a lot, + PR 66313. [Emmanuel Dreyfus] + +Changes with Apache 2.4.54 + + *) SECURITY: CVE-2022-31813: mod_proxy X-Forwarded-For dropped by + hop-by-hop mechanism (cve.mitre.org) + Apache HTTP Server 2.4.53 and earlier may not send the + X-Forwarded-* headers to the origin server based on client side + Connection header hop-by-hop mechanism. + This may be used to bypass IP based authentication on the origin + server/application. + Credits: The Apache HTTP Server project would like to thank + Gaetan Ferry (Synacktiv) for reporting this issue + + *) SECURITY: CVE-2022-30556: Information Disclosure in mod_lua with + websockets (cve.mitre.org) + Apache HTTP Server 2.4.53 and earlier may return lengths to + applications calling r:wsread() that point past the end of the + storage allocated for the buffer. + Credits: The Apache HTTP Server project would like to thank + Ronald Crane (Zippenhop LLC) for reporting this issue + + *) SECURITY: CVE-2022-30522: mod_sed denial of service + (cve.mitre.org) + If Apache HTTP Server 2.4.53 is configured to do transformations + with mod_sed in contexts where the input to mod_sed may be very + large, mod_sed may make excessively large memory allocations and + trigger an abort. + Credits: This issue was found by Brian Moussalli from the JFrog + Security Research team + + *) SECURITY: CVE-2022-29404: Denial of service in mod_lua + r:parsebody (cve.mitre.org) + In Apache HTTP Server 2.4.53 and earlier, a malicious request to + a lua script that calls r:parsebody(0) may cause a denial of + service due to no default limit on possible input size. + Credits: The Apache HTTP Server project would like to thank + Ronald Crane (Zippenhop LLC) for reporting this issue + + *) SECURITY: CVE-2022-28615: Read beyond bounds in + ap_strcmp_match() (cve.mitre.org) + Apache HTTP Server 2.4.53 and earlier may crash or disclose + information due to a read beyond bounds in ap_strcmp_match() + when provided with an extremely large input buffer. While no + code distributed with the server can be coerced into such a + call, third-party modules or lua scripts that use + ap_strcmp_match() may hypothetically be affected. + Credits: The Apache HTTP Server project would like to thank + Ronald Crane (Zippenhop LLC) for reporting this issue + + *) SECURITY: CVE-2022-28614: read beyond bounds via ap_rwrite() + (cve.mitre.org) + The ap_rwrite() function in Apache HTTP Server 2.4.53 and + earlier may read unintended memory if an attacker can cause the + server to reflect very large input using ap_rwrite() or + ap_rputs(), such as with mod_luas r:puts() function. + Credits: The Apache HTTP Server project would like to thank + Ronald Crane (Zippenhop LLC) for reporting this issue + + *) SECURITY: CVE-2022-28330: read beyond bounds in mod_isapi + (cve.mitre.org) + Apache HTTP Server 2.4.53 and earlier on Windows may read beyond + bounds when configured to process requests with the mod_isapi + module. + Credits: The Apache HTTP Server project would like to thank + Ronald Crane (Zippenhop LLC) for reporting this issue + + *) SECURITY: CVE-2022-26377: mod_proxy_ajp: Possible request + smuggling (cve.mitre.org) + Inconsistent Interpretation of HTTP Requests ('HTTP Request + Smuggling') vulnerability in mod_proxy_ajp of Apache HTTP Server + allows an attacker to smuggle requests to the AJP server it + forwards requests to. This issue affects Apache HTTP Server + Apache HTTP Server 2.4 version 2.4.53 and prior versions. + Credits: Ricter Z @ 360 Noah Lab + + *) mod_ssl: SSLFIPS compatible with OpenSSL 3.0. PR 66063. + [Petr Sumbera , Yann Ylavic] + + *) mod_proxy_http: Avoid 417 responses for non forwardable 100-continue. + PR 65666. [Yann Ylavic] + + *) mod_md: a bug was fixed that caused very large MDomains + with the combined DNS names exceeding ~7k to fail, as + request bodies would contain partially wrong data from + uninitialized memory. This would have appeared as failure + in signing-up/renewing such configurations. + [Stefan Eissing, Ronald Crane (Zippenhop LLC)] + + *) mod_proxy_http: Avoid 417 responses for non forwardable 100-continue. + PR 65666. [Yann Ylavic] + + *) MPM event: Restart children processes killed before idle maintenance. + PR 65769. [Yann Ylavic, Ruediger Pluem] + + *) ab: Allow for TLSv1.3 when the SSL library supports it. + [abhilash1232 gmail.com, xiaolongx.jiang intel.com, Yann Ylavic] + + *) core: Disable TCP_NOPUSH optimization on OSX since it might introduce + transmission delays. PR 66019. [Yann Ylavic] + + *) MPM event: Fix accounting of active/total processes on ungraceful restart, + PR 66004 (follow up to PR 65626 from 2.4.52). [Yann Ylavic] + + *) core: make ap_escape_quotes() work correctly on strings + with more than MAX_INT/2 characters, counting quotes double. + Credit to for finding this. + [Stefan Eissing] + + *) mod_md: the `MDCertificateAuthority` directive can take more than one URL/name of + an ACME CA. This gives a failover for renewals when several consecutive attempts + to get a certificate failed. + A new directive was added: `MDRetryDelay` sets the delay of retries. + A new directive was added: `MDRetryFailover` sets the number of errored + attempts before an alternate CA is selected for certificate renewals. + [Stefan Eissing] + + *) mod_http2: remove unused and insecure code. Fixes PR66037. + Thanks to Ronald Crane (Zippenhop LLC) for reporting this. + [Stefan Eissing] + + *) mod_proxy: Add backend port to log messages to + ease identification of involved service. [Rainer Jung] + + *) mod_http2: removing unscheduling of ongoing tasks when + connection shows potential abuse by a client. This proved + counter-productive and the abuse detection can false flag + requests using server-side-events. + Fixes . + [Stefan Eissing] + + *) mod_md: Implement full auto status ("key: value" type status output). + Especially not only status summary counts for certificates and + OCSP stapling but also lists. Auto status format is similar to + what was used for mod_proxy_balancer. + [Rainer Jung] + + *) mod_md: fixed a bug leading to failed transfers for OCSP + stapling information when more than 6 certificates needed + updates in the same run. [Stefan Eissing] + + *) mod_proxy: Set a status code of 502 in case the backend just closed the + connection in reply to our forwarded request. [Ruediger Pluem] + + *) mod_md: a possible NULL pointer deref was fixed in + the JSON code for persisting time periods (start+end). + Fixes #282 on mod_md's github. + Thanks to @marcstern for finding this. [Stefan Eissing] + + *) mod_heartmonitor: Set the documented default value + "10" for HeartbeatMaxServers instead of "0". With "0" + no shared memory slotmem was initialized. [Rainer Jung] + + *) mod_md: added support for managing certificates via a + local tailscale daemon for users of that secure networking. + This gives trusted certificates for tailscale assigned + domain names in the *.ts.net space. + [Stefan Eissing] + + *) core: Change default value of LimitRequestBody from 0 (unlimited) + to 1GB. [Eric Covener] + +Changes with Apache 2.4.53 + + *) SECURITY: CVE-2022-23943: mod_sed: Read/write beyond bounds + (cve.mitre.org) + Out-of-bounds Write vulnerability in mod_sed of Apache HTTP + Server allows an attacker to overwrite heap memory with possibly + attacker provided data. + This issue affects Apache HTTP Server 2.4 version 2.4.52 and + prior versions. + Credits: Ronald Crane (Zippenhop LLC) + + *) SECURITY: CVE-2022-22721: core: Possible buffer overflow with + very large or unlimited LimitXMLRequestBody (cve.mitre.org) + If LimitXMLRequestBody is set to allow request bodies larger + than 350MB (defaults to 1M) on 32 bit systems an integer + overflow happens which later causes out of bounds writes. + This issue affects Apache HTTP Server 2.4.52 and earlier. + Credits: Anonymous working with Trend Micro Zero Day Initiative + + *) SECURITY: CVE-2022-22720: HTTP request smuggling vulnerability + in Apache HTTP Server 2.4.52 and earlier (cve.mitre.org) + Apache HTTP Server 2.4.52 and earlier fails to close inbound + connection when errors are encountered discarding the request + body, exposing the server to HTTP Request Smuggling + Credits: James Kettle + + *) SECURITY: CVE-2022-22719: mod_lua Use of uninitialized value of + in r:parsebody (cve.mitre.org) + A carefully crafted request body can cause a read to a random + memory area which could cause the process to crash. + This issue affects Apache HTTP Server 2.4.52 and earlier. + Credits: Chamal De Silva + + *) core: Make sure and check that LimitXMLRequestBody fits in system memory. + [Ruediger Pluem, Yann Ylavic] + + *) core: Simpler connection close logic if discarding the request body fails. + [Yann Ylavic, Ruediger Pluem] + + *) mod_http2: preserve the port number given in a HTTP/1.1 + request that was Upgraded to HTTP/2. Fixes PR65881. + [Stefan Eissing] + + *) mod_proxy: Allow for larger worker name. PR 53218. [Yann Ylavic] + + *) dbm: Split the loading of a dbm driver from the opening of a dbm file. When + an attempt to load a dbm driver fails, log clearly which driver triggered + the error (not "default"), and what the error was. [Graham Leggett] + + *) mod_proxy: Use the maxium of front end and backend timeouts instead of the + minimum when tunneling requests (websockets, CONNECT requests). + Backend timeouts can be configured more selectively (per worker if needed) + as front end timeouts and typically the backend timeouts reflect the + application requirements better. PR 65886 [Ruediger Pluem] + + *) ap_regex: Use Thread Local Storage (TLS) to recycle ap_regexec() buffers + when an efficient TLS implementation is available. [Yann Ylavic] + + *) core, mod_info: Add compiled and loaded PCRE versions to version + number display. [Rainer Jung] + + *) mod_md: do not interfere with requests to /.well-known/acme-challenge/ + resources if challenge type 'http-01' is not configured for a domain. + Fixes . + [Stefan Eissing] + + *) mod_dav: Fix regression when gathering properties which could lead to huge + memory consumption proportional to the number of resources. + [Evgeny Kotkov, Ruediger Pluem] + + *) Support pcre2 (10.x) library in place of the now end-of-life pcre (8.x) + for regular expression evaluation. This depends on locating pcre2-config. + [William Rowe, Petr Pisar , Rainer Jung] + + *) Add the ldap function to the expression API, allowing LDAP filters and + distinguished names based on expressions to be escaped correctly to + guard against LDAP injection. [Graham Leggett] + + *) mod_md: the status description in MDomain's JSON, exposed in the + md-status handler (if configured) did sometimes not carry the correct + message when certificates needed renew. + [Stefan Eissing] + + *) mpm_event: Fix a possible listener deadlock on heavy load when restarting + and/or reaching MaxConnectionsPerChild. PR 65769. [Yann Ylavic] + +Changes with Apache 2.4.52 + + *) SECURITY: CVE-2021-44790: Possible buffer overflow when parsing + multipart content in mod_lua of Apache HTTP Server 2.4.51 and + earlier (cve.mitre.org) + A carefully crafted request body can cause a buffer overflow in + the mod_lua multipart parser (r:parsebody() called from Lua + scripts). + The Apache httpd team is not aware of an exploit for the + vulnerability though it might be possible to craft one. + This issue affects Apache HTTP Server 2.4.51 and earlier. + Credits: Chamal + + *) SECURITY: CVE-2021-44224: Possible NULL dereference or SSRF in + forward proxy configurations in Apache HTTP Server 2.4.51 and + earlier (cve.mitre.org) + A crafted URI sent to httpd configured as a forward proxy + (ProxyRequests on) can cause a crash (NULL pointer dereference) + or, for configurations mixing forward and reverse proxy + declarations, can allow for requests to be directed to a + declared Unix Domain Socket endpoint (Server Side Request + Forgery). + This issue affects Apache HTTP Server 2.4.7 up to 2.4.51 + (included). + Credits: 漂亮鼠 + TengMA(@Te3t123) + + *) http: Enforce that fully qualified uri-paths not to be forward-proxied + have an http(s) scheme, and that the ones to be forward proxied have a + hostname, per HTTP specifications. [Ruediger Pluem, Yann Ylavic] + + *) configure: OpenSSL detection will now use pkg-config data from + .../lib64/ within the --with-ssl path. [Jean-Frederic Clere] + + *) mod_proxy_connect, mod_proxy: Do not change the status code after we + already sent it to the client. [Ruediger Pluem] + + *) mod_http: Correctly sent a 100 Continue status code when sending an interim + response as result of an Expect: 100-Continue in the request and not the + current status code of the request. PR 65725 [Ruediger Pluem] + + *) mod_dav: Some DAV extensions, like CalDAV, specify both document + elements and property elements that need to be taken into account + when generating a property. The document element and property element + are made available in the dav_liveprop_elem structure by calling + dav_get_liveprop_element(). [Graham Leggett] + + *) mod_dav: Add utility functions dav_validate_root_ns(), + dav_find_child_ns(), dav_find_next_ns(), dav_find_attr_ns() and + dav_find_attr() so that other modules get to play too. + [Graham Leggett] + + *) mpm_event: Restart stopping of idle children after a load peak. PR 65626. + [Yann Ylavic, Ruediger Pluem] + + *) mod_http2: fixes 2 regressions in server limit handling. + 1. When reaching server limits, such as MaxRequestsPerChild, the + HTTP/2 connection send a GOAWAY frame much too early on new + connections, leading to invalid protocol state and a client + failing the request. See PR65731. + The module now initializes the HTTP/2 protocol correctly and + allows the client to submit one request before the shutdown + via a GOAWAY frame is being announced. + 2. A regression in v1.15.24 was fixed that could lead to httpd + child processes not being terminated on a graceful reload or + when reaching MaxConnectionsPerChild. When unprocessed h2 + requests were queued at the time, these could stall. + See . + [Stefan Eissing] + + *) mod_ssl: Add build support for OpenSSL v3. [Rainer Jung, + Stefan Fritsch, Yann Ylavic, Stefan Eissing, Joe Orton, + Giovanni Bechis] + + *) mod_proxy_connect: Honor the smallest of the backend or client timeout + while tunneling. [Yann Ylavic] + + *) mod_proxy: SetEnv proxy-nohalfclose (or alike) allows to disable TCP + half-close forwarding when tunneling protocols. [Yann Ylavic] + + *) core: Be safe with ap_lingering_close() called with a socket NULL-ed by + a third-party module. PR 65627. + [acmondor , Yann Ylavic] + + *) mod_md: Fix memory leak in case of failures to load the private key. + PR 65620 [ Filipe Casal ] + + *) mod_md: adding v2.4.8 with the following changes + - Added support for ACME External Account Binding (EAB). + Use the new directive `MDExternalAccountBinding` to provide the + server with the value for key identifier and hmac as provided by + your CA. + While working on some servers, EAB handling is not uniform + across CAs. First tests with a Sectigo Certificate Manager in + demo mode are successful. But ZeroSSL, for example, seems to + regard EAB values as a one-time-use-only thing, which makes them + fail if you create a seconde account or retry the creation of the + first account with the same EAB. + - The directive 'MDCertificateAuthority' now checks if its parameter + is a http/https url or one of a set of known names. Those are + 'LetsEncrypt', 'LetsEncrypt-Test', 'Buypass' and 'Buypass-Test' + for now and they are not case-sensitive. + The default of LetsEncrypt is unchanged. + - `MDContactEmail` can now be specified inside a `` + section. + - Treating 401 HTTP status codes for orders like 403, since some ACME + servers seem to prefer that for accessing oders from other accounts. + - When retrieving certificate chains, try to read the response even + if the HTTP Content-Type is unrecognized. + - Fixed a bug that reset the error counter of a certificate renewal + and prevented the increasing delays in further attempts. + - Fixed the renewal process giving up every time on an already existing + order with some invalid domains. Now, if such are seen in a previous + order, a new order is created for a clean start over again. + See + - Fixed a mixup in md-status handler when static certificate files + and renewal was configured at the same time. + + *) mod_md: values for External Account Binding (EAB) can + now also be configured to be read from a separate JSON + file. This allows to keep server configuration permissions + world readable without exposing secrets. + [Stefan Eissing] + + *) mod_proxy_uwsgi: Remove duplicate slashes at the beginning of PATH_INFO. + PR 65616. [Ruediger Pluem] + +Changes with Apache 2.4.51 + + *) SECURITY: CVE-2021-42013: Path Traversal and Remote Code + Execution in Apache HTTP Server 2.4.49 and 2.4.50 (incomplete + fix of CVE-2021-41773) (cve.mitre.org) + It was found that the fix for CVE-2021-41773 in Apache HTTP + Server 2.4.50 was insufficient. An attacker could use a path + traversal attack to map URLs to files outside the directories + configured by Alias-like directives. + If files outside of these directories are not protected by the + usual default configuration "require all denied", these requests + can succeed. If CGI scripts are also enabled for these aliased + paths, this could allow for remote code execution. + This issue only affects Apache 2.4.49 and Apache 2.4.50 and not + earlier versions. + Credits: Reported by Juan Escobar from Dreamlab Technologies, + Fernando Muñoz from NULL Life CTF Team, and Shungo Kumasaka + + *) core: Add ap_unescape_url_ex() for better decoding control, and deprecate + unused AP_NORMALIZE_DROP_PARAMETERS flag. + [Yann Ylavic, Ruediger Pluem, Stefan Eissing, Joe Orton] + +Changes with Apache 2.4.50 + + *) SECURITY: CVE-2021-41773: Path traversal and file disclosure + vulnerability in Apache HTTP Server 2.4.49 (cve.mitre.org) + A flaw was found in a change made to path normalization in + Apache HTTP Server 2.4.49. An attacker could use a path + traversal attack to map URLs to files outside the expected + document root. + If files outside of the document root are not protected by + "require all denied" these requests can succeed. Additionally + this flaw could leak the source of interpreted files like CGI + scripts. + This issue is known to be exploited in the wild. + This issue only affects Apache 2.4.49 and not earlier versions. + Credits: This issue was reported by Ash Daulton along with the + cPanel Security Team + + *) SECURITY: CVE-2021-41524: null pointer dereference in h2 fuzzing + (cve.mitre.org) + While fuzzing the 2.4.49 httpd, a new null pointer dereference + was detected during HTTP/2 request processing, + allowing an external source to DoS the server. This requires a + specially crafted request. + The vulnerability was recently introduced in version 2.4.49. No + exploit is known to the project. + Credits: Apache httpd team would like to thank LI ZHI XIN from + NSFocus Security Team for reporting this issue. + + *) core: AP_NORMALIZE_DECODE_UNRESERVED should normalize the second dot in + the uri-path when it's preceded by a dot. [Yann Ylavic] + + *) mod_md: when MDMessageCmd for a 'challenge-setup::' + fails (!= 0 exit), the renewal process is aborted and an error is + reported for the MDomain. This provides scripts that distribute + information in a cluster to abort early with bothering an ACME + server to validate a dns name that will not work. The common + retry logic will make another attempt in the future, as with + other failures. + Fixed a bug when adding private key specs to an already working + MDomain, see . + [Stefan Eissing] + + *) mod_proxy: Handle UDS URIs with empty hostname ("unix:///...") as if they + had no hostname ("unix:/..."). [Yann Ylavic] + + *) mod_md: fixed a bug in handling multiple parallel OCSP requests. These could + run into an assertion which terminated (and restarted) the child process where + the task was running. Eventually, all OCSP responses were collected, but not + in the way that things are supposed to work. + See also . + The bug was possibly triggered when more than one OCSP status needed updating + at the same time. For example for several renewed certificates after a server + reload. + + *) mod_rewrite: Fix UDS ("unix:") scheme for [P] rules. PR 57691 + 65590. + [Janne Peltonen ] + + *) event mpm: Correctly count active child processes in parent process if + child process dies due to MaxConnectionsPerChild. + PR 65592 [Ruediger Pluem] + + *) mod_http2: when a server is restarted gracefully, any idle h2 worker + threads are shut down immediately. + Also, change OpenSSL API use for deprecations in OpenSSL 3.0. + Adds all other, never proposed code changes to make a clean + sync of http2 sources. [Stefan Eissing] + + *) mod_dav: Correctly handle errors returned by dav providers on REPORT + requests. [Ruediger Pluem] + + *) core: do not install core input/output filters on secondary + connections. [Stefan Eissing] + + *) core: Add ap_pre_connection() as a wrapper to ap_run_pre_connection() + and use it to prevent that failures in running the pre_connection + hook cause crashes afterwards. [Ruediger Pluem] + + *) mod_speling: Add CheckBasenameMatch PR 44221. [Christophe Jaillet] + +Changes with Apache 2.4.49 + + *) SECURITY: CVE-2021-40438 (cve.mitre.org) + mod_proxy: Server Side Request Forgery (SSRF) vulnerability [Yann Ylavic] + + *) SECURITY: CVE-2021-39275 (cve.mitre.org) + core: ap_escape_quotes buffer overflow + + *) SECURITY: CVE-2021-36160 (cve.mitre.org) + mod_proxy_uwsgi: Out of bound read vulnerability [Yann Ylavic] + + *) SECURITY: CVE-2021-34798 (cve.mitre.org) + core: null pointer dereference on malformed request + + *) SECURITY: CVE-2021-33193 (cve.mitre.org) + mod_http2: Request splitting vulnerability with mod_proxy [Stefan Eissing] + + *) core/mod_proxy/mod_ssl: + Adding `outgoing` flag to conn_rec, indicating a connection is + initiated by the server to somewhere, in contrast to incoming + connections from clients. + Adding 'ap_ssl_bind_outgoing()` function that marks a connection + as outgoing and is used by mod_proxy instead of the previous + optional function `ssl_engine_set`. This enables other SSL + module to secure proxy connections. + The optional functions `ssl_engine_set`, `ssl_engine_disable` and + `ssl_proxy_enable` are now provided by the core to have backward + compatibility with non-httpd modules that might use them. mod_ssl + itself no longer registers these functions, but keeps them in its + header for backward compatibility. + The core provided optional function wrap any registered function + like it was done for `ssl_is_ssl`. + [Stefan Eissing] + + *) mod_ssl: Support logging private key material for use with + wireshark via log file given by SSLKEYLOGFILE environment + variable. Requires OpenSSL 1.1.1. PR 63391. [Joe Orton] + + *) mod_proxy: Do not canonicalize the proxied URL when both "nocanon" and + "ProxyPassInterpolateEnv On" are configured. PR 65549. + [Joel Self ] + + *) mpm_event: Fix children processes possibly not stopped on graceful + restart. PR 63169. [Joel Self ] + + *) mod_proxy: Fix a potential infinite loop when tunneling Upgrade(d) + protocols from mod_proxy_http, and a timeout triggering falsely when + using mod_proxy_wstunnel, mod_proxy_connect or mod_proxy_http with + upgrade= setting. PRs 65521 and 65519. [Yann Ylavic] + + *) mod_unique_id: Reduce the time window where duplicates may be generated + PR 65159 + [Christophe Jaillet] + + *) mpm_prefork: Block signals for child_init hooks to prevent potential + threads created from there to catch MPM's signals. + [Ruediger Pluem, Yann Ylavic] + + *) Revert "mod_unique_id: Fix potential duplicated ID generation under heavy load. + PR 65159" added in 2.4.47. + This causes issue on Windows. + [Christophe Jaillet] + + *) mod_proxy_uwsgi: Fix PATH_INFO setting for generic worker. [Yann Ylavic] + + *) mod_md: Certificate/keys pairs are verified as matching before a renewal is accepted + as successful or a staged renewal is replacing the existing certificates. + This avoid potential mess ups in the md store file system to render the active + certificates non-working. [@mkauf] + + *) mod_proxy: Faster unix socket path parsing in the "proxy:" URL. + [Yann Ylavic] + + *) mod_ssl: tighten the handling of ALPN for outgoing (proxy) + connections. If ALPN protocols are provided and sent to the + remote server, the received protocol selected is inspected + and checked for a match. Without match, the peer handshake + fails. + An exception is the proposal of "http/1.1" where it is + accepted if the remote server did not answer ALPN with + a selected protocol. This accommodates for hosts that do + not observe/support ALPN and speak http/1.x be default. + + *) mod_proxy: Fix possible reuse/merging of Proxy(Pass)Match worker instances + with others when their URLs contain a '$' substitution. PR 65419 + 65429. + [Yann Ylavic] + + *) mod_dav: Add method_precondition hook. WebDAV extensions define + conditions that must exist before a WebDAV method can be executed. + This hook allows a WebDAV extension to verify these preconditions. + [Graham Leggett] + + *) Add hooks deliver_report and gather_reports to mod_dav.h. Allows other + modules apart from versioning implementations to handle the REPORT method. + [Graham Leggett] + + *) Add dav_get_provider(), dav_open_lockdb(), dav_close_lockdb() and + dav_get_resource() to mod_dav.h. [Graham Leggett] + + *) core: fix ap_escape_quotes substitution logic. [Eric Covener] + + *) core/mpm: add hook 'child_stopping` that gets called when the MPM is + stopping a child process. The additional `graceful` parameter allows + registered hooks to free resources early during a graceful shutdown. + [Yann Ylavic, Stefan Eissing] + + *) mod_proxy: Fix icomplete initialization of BalancerMember(s) from the + balancer-manager, which can lead to a crash. [Yann Ylavic] + + *) mpm_event: Fix graceful stop/restart of children processes if connections + are in lingering close for too long. [Yann Ylavic] + + *) mod_md: fixed a potential null pointer dereference if ACME/OCSP + server returned 2xx responses without content type. Reported by chuangwen. + [chuangwen, Stefan Eissing] + + *) mod_md: + - Domain names in `` can now appear in quoted form. + - Fixed a failure in ACME challenge selection that aborted further searches + when the tls-alpn-01 method did not seem to be suitable. + - Changed the tls-alpn-01 setup to only become unsuitable when none of the + dns names showed support for a configured 'Protocols ... acme-tls/1'. This + allows use of tls-alpn-01 for dns names that are not mapped to a VirtualHost. + [Stefan Eissing] + + *) Add CPING to health check logic. [Jean-Frederic Clere] + + *) core: Split ap_create_request() from ap_read_request(). [Graham Leggett] + + *) core, h2: common ap_parse_request_line() and ap_check_request_header() + code. [Yann Ylavic] + + *) core: Add StrictHostCheck to allow unconfigured hostnames to be + rejected. [Eric Covener] + + *) htcacheclean: Improve help messages. [Christophe Jaillet] + +Changes with Apache 2.4.48 + + *) SECURITY: CVE-2021-31618 (cve.mitre.org) + mod_http2: Fix a potential NULL pointer dereference [Ivan Zhakov] + + *) mod_proxy_wstunnel: Add ProxyWebsocketFallbackToProxyHttp to opt-out the + fallback to mod_proxy_http for WebSocket upgrade and tunneling. + [Yann Ylavic] + + *) mod_proxy: Fix flushing of THRESHOLD_MIN_WRITE data while tunneling. + PR 65294. [Yann Ylavic] + + *) core: Fix a regression that stripped the ETag header from 304 responses. + PR 61820 [Ruediger Pluem, Roy T. Fielding] + + *) core: Adding SSL related inquiry functions to the server API. + These function are always available, even when no module providing + SSL is loaded. They provide their own "shadowing" implementation for + the optional functions of similar name that mod_ssl and impersonators + of mod_ssl provide. + This enables loading of several SSL providing modules when all but + one of them registers itself into the new hooks. Two old-style SSL + modules will not work, as they replace the others optional functions + with their own. + Modules using the old-style optional functions will continue to work + as core supplies its own versions of those. + The following has been added so far: + - ap_ssl_conn_is_ssl() to query if a connection is using SSL. + - ap_ssl_var_lookup() to query SSL related variables for a + server/connection/request. + - Hooks for 'ssl_conn_is_ssl' and 'ssl_var_lookup' where modules + providing SSL can install their own value supplying functions. + - ap_ssl_add_cert_files() to enable other modules like mod_md to provide + certificate and keys for an SSL module like mod_ssl. + - ap_ssl_add_fallback_cert_files() to enable other modules like mod_md to + provide a fallback certificate in case no 'proper' certificate is + available for an SSL module like mod_ssl. + - ap_ssl_answer_challenge() to enable other modules like mod_md to + provide a certificate as used in the RFC 8555 'tls-alpn-01' challenge + for the ACME protocol for an SSL module like mod_ssl. The function + and its hook provide PEM encoded data instead of file names. + - Hooks for 'ssl_add_cert_files', 'ssl_add_fallback_cert_files' and + 'ssl_answer_challenge' where modules like mod_md can provide providers + to the above mentioned functions. + - These functions reside in the new 'http_ssl.h' header file. + [Stefan Eissing] + + *) core/mod_ssl/mod_md: adding OCSP response provisioning as core feature. This + allows modules to access and provide OCSP response data without being tied + of each other. The data is exchanged in standard, portable formats (PEM encoded + certificates and DER encoded responses), so that the actual SSL/crypto + implementations used by the modules are independant of each other. + Registration and retrieval happen in the context of a server (server_rec) + which modules may use to decide if they are configured for this or not. + The area of changes: + 1. core: defines 2 functions in include/http_ssl.h, so that modules may + register a certificate, together with its issuer certificate for OCSP + response provisioning and ask for current response data (DER bytes) later. + Also, 2 hooks are defined that allow modules to implement this OCSP + provisioning. + 2. mod_ssl uses the new functions, in addition to what it did already, to + register its certificates this way. If no one is interested in providing + OCSP, it falls back to its own (if configured) stapling implementation. + 3. mod_md registers itself at the core hooks for OCSP provisioning. Depending + on configuration, it will accept registrations of its own certificates only, + all certificates or none. + [Stefan Eissing] + + *) mod_md: v2.4.0 with improvements and bugfixes + - MDPrivateKeys allows the specification of several types. Beside "RSA" plus + optional key lengths elliptic curves can be configured. This means you can + have multiple certificates for a Managed Domain with different key types. + With ```MDPrivateKeys secp384r1 rsa2048``` you get one ECDSA and one RSA + certificate and all modern client will use the shorter ECDSA, while older + client will get the RSA certificate. + Many thanks to @tlhackque who pushed and helped on this. + - Support added for MDomains consisting of a wildcard. Configuring + ```MDomain *.host.net``` will match all virtual hosts matching that pattern + and obtain one certificate for it (assuming you have 'dns-01' challenge + support configured). Addresses #239. + - Removed support for ACMEv1 servers. The only known installation used to + be Let's Encrypt which has disabled that version more than a year ago for + new accounts. + - Andreas Ulm () implemented the + ```renewing``` call to ```MDMessageCmd``` that can deny a certificate + renewal attempt. This is useful in clustered installations, as + discussed in #233). + - New event ```challenge-setup::```, triggered when the + challenge data for a domain has been created. This is invoked before the + ACME server is told to check for it. The type is one of the ACME challenge + types. This is invoked for every DNS name in a MDomain. + - The max delay for retries has been raised to daily (this is like all + retries jittered somewhat to avoid repeats at fixed time of day). + - Certain error codes reported by the ACME server that indicate a problem + with the configured data now immediately switch to daily retries. For + example: if the ACME server rejects a contact email or a domain name, + frequent retries will most likely not solve the problem. But daily retries + still make sense as there might be an error at the server and un-supervised + certificate renewal is the goal. Refs #222. + - Test case and work around for domain names > 64 octets. Fixes #227. + When the first DNS name of an MD is longer than 63 octets, the certificate + request will not contain a CN field, but leave it up to the CA to choose one. + Currently, Lets Encrypt looks for a shorter name in the SAN list given and + fails the request if none is found. But it is really up to the CA (and what + browsers/libs accept here) and may change over the years. That is why + the decision is best made at the CA. + - Retry delays now have a random +/-[0-50]% modification applied to let + retries from several servers spread out more, should they have been + restarted at the same time of day. + - Fixed several places where the 'badNonce' return code from an ACME server + was not handled correctly. The test server 'pebble' simulates this behaviour + by default and helps nicely in verifying this behaviour. Thanks, pebble! + - Set the default `MDActivationDelay` to 0. This was confusing to users that + new certificates were deemed not usably before a day of delay. When clocks are + correct, using a new certificate right away should not pose a problem. + - When handling ACME authorization resources, the module no longer requires + the server to return a "Location" header, as was necessary in ACMEv1. + Fixes #216. + - Fixed a theoretical uninitialized read when testing for JSON error responses + from the ACME CA. Reported at . + - ACME problem reports from CAs that include parameters in the Content-Type + header are handled correctly. (Previously, the problem text would not be + reported and retries could exceed CA limits.) + - Account Update transactions to V2 CAs now use the correct POST-AS-GET method. + Previously, an empty JSON object was sent - which apparently LE accepted, + but others reject. + [Stefan Eissing, @tlhackque, Andreas Ulm] + +Changes with Apache 2.4.47 + + *) SECURITY: CVE-2021-30641 (cve.mitre.org) + Unexpected section matching with 'MergeSlashes OFF' + + *) SECURITY: CVE-2020-35452 (cve.mitre.org) + mod_auth_digest: possible stack overflow by one nul byte while validating + the Digest nonce. [Yann Ylavic] + + *) SECURITY: CVE-2021-26691 (cve.mitre.org) + mod_session: Fix possible crash due to NULL pointer dereference, which + could be used to cause a Denial of Service with a malicious backend + server and SessionHeader. [Yann Ylavic] + + *) SECURITY: CVE-2021-26690 (cve.mitre.org) + mod_session: Fix possible crash due to NULL pointer dereference, which + could be used to cause a Denial of Service. [Yann Ylavic] + + *) SECURITY: CVE-2020-13950 (cve.mitre.org) + mod_proxy_http: Fix possible crash due to NULL pointer dereference, which + could be used to cause a Denial of Service. [Yann Ylavic] + + *) SECURITY: CVE-2020-13938 (cve.mitre.org) + Windows: Prevent local users from stopping the httpd process [Ivan Zhakov] + + *) SECURITY: CVE-2019-17567 (cve.mitre.org) + mod_proxy_wstunnel, mod_proxy_http: Handle Upgradable protocols end-to-end + negotiation. [Yann Ylavic] + + *) mod_dav_fs: Improve logging output when failing to open files for + writing. PR 64413. [Bingyu Shen ] + + *) mod_http2: Fixed a race condition that could lead to streams being + aborted (RST to the client), although a response had been produced. + [Stefan Eissing] + + *) mod_lua: Add support to Lua 5.4 [Joe Orton, Giovanni Bechis, Ruediger Pluem] + + *) MPM event/worker: Fix possible crash in child process on early signal + delivery. PR 64533. [Ruediger Pluem] + + *) mod_http2: sync with github standalone version 1.15.17 + - Log requests and sent the configured error response in case of early detected + errors like too many or too long headers. [Ruediger Pluem] + - new option 'H2OutputBuffering on/off' which controls the buffering of stream output. + The default is on, which is the behaviour of older mod-h2 versions. When off, all + bytes are made available immediately to the main connection for sending them + out to the client. This fixes interop issues with certain flavours of gRPC, see + also . + [Stefan Eissing] + + *) mod_unique_id: Fix potential duplicated ID generation under heavy load. + PR 65159 + [Jonas Müntener , Christophe Jaillet] + + *) "[mod_dav_fs etag handling] should really honor the FileETag setting". + - It now does. + - Add "Digest" to FileETag directive, allowing a strong ETag to be + generated using a file digest. + - Add ap_make_etag_ex() and ap_set_etag_fd() to allow full control over + ETag generation. + - Add concept of "binary notes" to request_rec, allowing packed bit flags + to be added to a request. + - First binary note - AP_REQUEST_STRONG_ETAG - allows modules to force + the ETag to a strong ETag to comply with RFC requirements, such as those + mandated by various WebDAV extensions. + [Graham Leggett] + + *) mod_proxy_http: Fix a possibly crash when the origin connection gets + interrupted before completion. PR 64234. + [Barnim Dzwillo , Ruediger Pluem] + + *) mod_ssl: Do not keep connections to OCSP responders alive when doing + OCSP requests. PR 64135. [Ruediger Pluem] + + *) mod_ssl: Improve the coalescing filter to buffer into larger TLS + records, and avoid revealing the HTTP header size via TLS record + boundaries (for common response generators). + [Joe Orton, Ruediger Pluem] + + *) mod_proxy_hcheck: Don't pile up health checks if the previous one did + not finish before hcinterval. PR 63010. [Yann Ylavic] + + *) mod_session: Improve session parsing. [Yann Yalvic] + + *) mod_authnz_ldap: Prevent authentications with empty passwords for the + initial bind to fail with status 500. [Ruediger Pluem] + + *) mod_proxy_fcgi: Honor "SetEnv proxy-sendcl" to forward a chunked + Transfer-Encoding from the client, spooling the request body when needed + to provide a Content-Length to the backend. PR 57087. [Yann Ylavic] + + *) mod_proxy: Improve tunneling loop to support half closed connections and + pending data draining (for protocols like rsync). PR 61616. [Yann Ylavic] + + *) mod_proxy_wstunnel: Leave Upgrade requests handling to mod_proxy_http, + allowing for (non-)Upgrade negotiation with the origin server. + [Yann Ylavic] + + *) mod_proxy: Allow ProxyErrorOverride to be restricted to specific status + codes. PR63628. [Martin Drößler ] + + *) core: Add ReadBufferSize, FlushMaxThreshold and FlushMaxPipelined + directives. [Yann Ylavic] + + *) core: Ensure that aborted connections are logged as such. PR 62823 + [Arnaud Grandville ] + + *) http: Allow unknown response status' lines returned in the form of + "HTTP/x.x xxx Status xxx". [Yann Ylavic] + + *) mod_proxy_http: Fix 100-continue deadlock for spooled request bodies, + leading to Request Timeout (408). PR 63855. [Yann Ylavic] + + *) core: Remove headers on 304 Not Modified as specified by RFC7234, as + opposed to passing an explicit subset of headers. PR 61820. + [Giovanni Bechis] + + *) mpm_event: Don't reset connections after lingering close, restoring prior + to 2.4.28 behaviour. [Yann Ylavic] + + *) mpm_event: Kill connections in keepalive state only when there is no more + workers available, not when the maximum number of connections is reached, + restoring prior to 2.4.30 behaviour. [Yann Ylavic] + + *) mod_unique_id: Use base64url encoding for UNIQUE_ID variable, + avoiding the use of '@'. PR 57044. + [Michael Kaufmann ] + + *) mod_rewrite: Extend the [CO] (cookie) flag of RewriteRule to accept a + SameSite attribute. [Eric Covener] + + *) mod_proxy: Add proxy check_trans hook. This allows proxy + modules to decline request handling at early stage. + + *) mod_proxy_wstunnel: Decline requests without an Upgrade + header so ws/wss can be enabled overlapping with later + http/https. + + *) mod_http2: Log requests and sent the configured error response in case of + early detected errors like too many or too long headers. + [Ruediger Pluem, Stefan Eissing] + + *) mod_md: Lowered the required minimal libcurl version from 7.50 to 7.29 + as proposed by . [Stefan Eissing] + + *) mod_ssl: Fix request body buffering with PHA in TLSv1.3. [Joe Orton] + + *) mod_proxy_uwsgi: Fix a crash when sending environment variables with no + value. PR 64598 [Ruediger Pluem] + + *) mod_proxy: Recognize parameters from ProxyPassMatch workers with dollar + substitution, such that they apply to the backend connection. Note that + connection reuse is disabled by default to avoid compatibility issues. + [Takashi Sato, Jan Kaluza, Eric Covener, Yann Ylavic, Jean-Frederic Clere] + +Changes with Apache 2.4.46 + + *) SECURITY: CVE-2020-11984 (cve.mitre.org) + mod_proxy_uwsgi: Malicious request may result in information disclosure + or RCE of existing file on the server running under a malicious process + environment. [Yann Ylavic] + + *) SECURITY: CVE-2020-11993 (cve.mitre.org) + mod_http2: when throttling connection requests, log statements + where possibly made that result in concurrent, unsafe use of + a memory pool. [Stefan Eissing] + + *) SECURITY: CVE-2020-9490 (cve.mitre.org) + mod_http2: a specially crafted value for the 'Cache-Digest' header + request would result in a crash when the server actually tries + to HTTP/2 PUSH a resource afterwards. [Stefan Eissing] + + *) mod_proxy_fcgi: Fix missing APLOGNO macro argument + [Eric Covener, Christophe Jaillet] + +Changes with Apache 2.4.45 + + *) mod_http2: remove support for abandoned http-wg draft + . + [Stefan Eissing] + +Changes with Apache 2.4.44 + + *) mod_proxy_uwsgi: Error out on HTTP header larger than 16K (hard + protocol limit). [Yann Ylavic] + + *) mod_http2: + Fixes : + "LimitRequestFields 0" now disables the limit, as documented. + Fixes : + Do not count repeated headers with same name against the field + count limit. The are merged internally, as if sent in a single HTTP/1 line. + [Stefan Eissing] + + *) mod_http2: Avoid segfaults in case of handling certain responses for + already aborted connections. [Stefan Eissing, Ruediger Pluem] + + *) mod_http2: The module now handles master/secondary connections and has marked + methods according to use. [Stefan Eissing] + + *) core: Drop an invalid Last-Modified header value coming + from a FCGI/CGI script instead of replacing it with Unix epoch. + [Yann Ylavic, Luca Toscano] + + *) Add support for strict content-length parsing through addition of + ap_parse_strict_length() [Yann Ylavic] + + *) mod_proxy_fcgi: ProxyFCGISetEnvIf unsets variables when expression + evaluates to false. PR64365. [Michael König ] + + *) mod_proxy_http: flush spooled request body in one go to avoid + leaking (or long lived) temporary file. PR 64452. [Yann Ylavic] + + *) mod_ssl: Fix a race condition and possible crash when using a proxy client + certificate (SSLProxyMachineCertificateFile). + [Armin Abfalterer ] + + *) mod_ssl: Fix memory leak in stapling code. PR63687. [Stefan Eissing] + + *) mod_http2: Fixed regression that no longer set H2_STREAM_ID and H2_STREAM_TAG. + PR64330 [Stefan Eissing] + + *) mod_http2: Fixed regression that caused connections to close when mod_reqtimeout + was configured with a handshake timeout. Fixes gitub issue #196. + [Stefan Eissing] + + *) mod_proxy_http2: the "ping" proxy parameter + (see ) is now used + when checking the liveliness of a new or reused h2 connection to the backend. + With short durations, this makes load-balancing more responsive. The module + will hold back requests until ping conditions are met, using features of the + HTTP/2 protocol alone. [Ruediger Pluem, Stefan Eissing] + + *) core: httpd is no longer linked against -lsystemd if mod_systemd + is enabled (and built as a DSO). [Rainer Jung] + + *) mod_proxy_http2: respect ProxyTimeout settings on backend connections + while waiting on incoming data. [Ruediger Pluem, Stefan Eissing] + +Changes with Apache 2.4.43 + + *) mod_ssl: Fix memory leak of OCSP stapling response. [Yann Ylavic] + +Changes with Apache 2.4.42 + + *) SECURITY: CVE-2020-1934 (cve.mitre.org) + mod_proxy_ftp: Use of uninitialized value with malicious backend FTP + server. [Eric Covener] + + *) SECURITY: CVE-2020-1927 (cve.mitre.org) + rewrite, core: Set PCRE_DOTALL flag by default to avoid unpredictable + matches and substitutions with encoded line break characters. + The fix for CVE-2019-10098 was not effective. [Ruediger Pluem] + + *) mod_proxy_http: Fix the forwarding of requests with content body when a + balancer member is unavailable; the retry on the next member was issued + with an empty body (regression introduced in 2.4.41). PR63891. + [Yann Ylavic] + + *) core: Use a temporary file when writing the pid file, avoiding + startup failure if an empty pidfile is left over from a + previous crashed or aborted invocation of httpd. PR 63140. + [Nicolas Carrier , Joe Orton] + + *) mod_http2: Fixes issue where mod_unique_id would generate non-unique request + identifier under load, see . + [Michael Kaufmann, Stefan Eissing] + + *) mod_proxy_hcheck: Allow healthcheck expressions to use %{Content-Type}. + PR64140. [Renier Velazco ] + + *) mod_authz_groupfile: Drop AH01666 from loglevel "error" to "info". + PR64172. + + *) mod_usertrack: Add CookieSameSite, CookieHTTPOnly, and CookieSecure + to allow customization of the usertrack cookie. PR64077. + [Prashant Keshvani , Eric Covener] + + *) mod_proxy_ajp: Add "secret" parameter to proxy workers to implement legacy + AJP13 authentication. PR 53098. [Dmitry A. Bakshaev ] + + *) mpm_event: avoid possible KeepAliveTimeout off by -100 ms. + [Eric Covener, Yann Ylavic] + + *) Add a config layout for OpenWRT. [Graham Leggett] + + *) Add support for cross compiling to apxs. If apxs is being executed from + somewhere other than its target location, add that prefix to includes and + library directories. Without this, apxs would fail to find config_vars.mk + and exit. [Graham Leggett] + + *) mod_ssl: Disable client verification on ACME ALPN challenges. Fixes github + issue mod_md#172 (https://github.com/icing/mod_md/issues/172). + [Michael Kaufmann , Stefan Eissing] + + *) mod_ssl: use OPENSSL_init_ssl() to initialise OpenSSL on versions 1.1+. + [Graham Leggett] + + *) mod_ssl: Support use of private keys and certificates from an + OpenSSL ENGINE via PKCS#11 URIs in SSLCertificateFile/KeyFile. + [Anderson Sasaki , Joe Orton] + + *) mod_md: + - Prefer MDContactEmail directive to ServerAdmin for registration. New directive + thanks to Timothe Litt (@tlhackque). + - protocol check for pre-configured "tls-alpn-01" challenge has been improved. It will now + check all matching virtual hosts for protocol support. Thanks to @mkauf. + - Corrected a check when OCSP stapling was configured for hosts + where the responsible MDomain is not clear, by Michal Karm Babacek (@Karm). + - Softening the restrictions where mod_md configuration directives may appear. This should + allow for use in and sections. If all possible variations lead to the configuration + you wanted in the first place, is another matter. + [Michael Kaufmann , Timothe Litt (@tlhackque), + Michal Karm Babacek (@Karm), Stefan Eissing (@icing)] + + *) test: Added continuous testing with Travis CI. + This tests various scenarios on Ubuntu with the full test suite. + Architectures tested: amd64, s390x, ppc64le, arm64 + The tests pass successfully. + [Luca Toscano, Joe Orton, Mike Rumph, and others] + + *) core: Be stricter in parsing of Transfer-Encoding headers. + [ZeddYu , Eric Covener] + + *) mod_ssl: negotiate the TLS protocol version per name based vhost + configuration, when linked with OpenSSL-1.1.1 or later. The base vhost's + SSLProtocol (from the first vhost declared on the IP:port) is now only + relevant if no SSLProtocol is declared for the vhost or globally, + otherwise the vhost or global value apply. [Yann Ylavic] + + *) mod_cgi, mod_cgid: Fix a memory leak in some error cases with large script + output. PR 64096. [Joe Orton] + + *) config: Speed up graceful restarts by using pre-hashed command table. PR 64066. + [Giovanni Bechis , Jim Jagielski] + + *) mod_systemd: New module providing integration with systemd. [Jan Kaluza] + + *) mod_lua: Add r:headers_in_table, r:headers_out_table, r:err_headers_out_table, + r:notes_table, r:subprocess_env_table as read-only native table alternatives + that can be iterated over. [Eric Covener] + + *) mod_http2: Fixed rare cases where a h2 worker could deadlock the main connection. + [Yann Ylavic, Stefan Eissing] + + *) mod_lua: Accept nil assignments to the exposed tables (r.subprocess_env, + r.headers_out, etc) to remove the key from the table. PR63971. + [Eric Covener] + + *) mod_http2: Fixed interaction with mod_reqtimeout. A loaded mod_http2 was disabling the + ssl handshake timeouts. Also, fixed a mistake of the last version that made `H2Direct` + always `on`, regardless of configuration. Found and reported by + and + . [Stefan Eissing] + + *) mod_http2: Multiple field length violations in the same request no longer cause + several log entries to be written. [@mkauf] + + *) mod_ssl: OCSP does not apply to proxy mode. PR 63679. + [Lubos Uhliarik , Yann Ylavic] + + *) mod_proxy_html, mod_xml2enc: Fix build issues with macOS due to r1864469 + [Jim Jagielski] + + *) mod_authn_socache: Increase the maximum length of strings that can be cached by + the module from 100 to 256. PR 62149 [] + + *) mod_proxy: Fix crash by resolving pool concurrency problems. PR 63503 + [Ruediger Pluem, Eric Covener] + + *) core: On Windows, fix a start-up crash if is used with a path that is not + valid (For example, testing for a file on a flash drive that is not mounted) + [Christophe Jaillet] + + *) mod_deflate, mod_brotli: honor "Accept-Encoding: foo;q=0" as per RFC 7231; which + means 'foo' is "not acceptable". PR 58158 [Chistophe Jaillet] + + *) mod_md v2.2.3: + - Configuring MDCAChallenges replaces any previous existing challenge configuration. It + had been additive before which was not the intended behaviour. [@mkauf] + - Fixing order of ACME challenges used when nothing else configured. Code now behaves as + documented for `MDCAChallenges`. Fixes #156. Thanks again to @mkauf for finding this. + - Fixing a potential, low memory null pointer dereference [thanks to @uhliarik]. + - Fixing an incompatibility with a change in libcurl v7.66.0 that added unwanted + "transfer-encoding" to POST requests. This failed in direct communication with + Let's Encrypt boulder server. Thanks to @mkauf for finding and fixing. [Stefan Eissing] + + *) mod_md: Adding the several new features. + The module offers an implementation of OCSP Stapling that can replace fully or + for a limited set of domains the existing one from mod_ssl. OCSP handling + is part of mod_md's monitoring and message notifications. If can be used + for sites that do not have ACME certificates. + The url for a CTLog Monitor can be configured. It is used in the server-status + to link to the external status page of a certificate. + The MDMessageCmd is called with argument "installed" when a new certificate + has been activated on server restart/reload. This allows for processing of + the new certificate, for example to applications that require it in different + locations or formats. + [Stefan Eissing] + + *) mod_proxy_balancer: Fix case-sensitive referer check related to CSRF/XSS + protection. PR 63688. [Armin Abfalterer ] + +Changes with Apache 2.4.41 + + *) SECURITY: CVE-2019-10097 (cve.mitre.org) + mod_remoteip: Fix stack buffer overflow and NULL pointer deference + when reading the PROXY protocol header. [Joe Orton, + Daniel McCarney ] + + *) SECURITY: CVE-2019-9517 (cve.mitre.org) + mod_http2: a malicious client could perform a DoS attack by flooding + a connection with requests and basically never reading responses + on the TCP connection. Depending on h2 worker dimensioning, it was + possible to block those with relatively few connections. [Stefan Eissing] + + *) SECURITY: CVE-2019-10098 (cve.mitre.org) + rewrite, core: Set PCRE_DOTALL flag by default to avoid unpredictable + matches and substitutions with encoded line break characters. + [Yann Ylavic] + + *) SECURITY: CVE-2019-10092 (cve.mitre.org) + Remove HTML-escaped URLs from canned error responses to prevent misleading + text/links being displayed via crafted links. [Eric Covener] + + *) SECURITY: CVE-2019-10082 (cve.mitre.org) + mod_http2: Using fuzzed network input, the http/2 session + handling could be made to read memory after being freed, + during connection shutdown. [Stefan Eissing] + + *) SECURITY: CVE-2019-10081 (cve.mitre.org) + mod_http2: HTTP/2 very early pushes, for example configured with "H2PushResource", + could lead to an overwrite of memory in the pushing request's pool, + leading to crashes. The memory copied is that of the configured push + link header values, not data supplied by the client. [Stefan Eissing] + + *) mod_proxy_balancer: Improve balancer-manager protection against + XSS/XSRF attacks from trusted users. [Joe Orton, + Niels Heinen ] + + *) mod_session: Introduce SessionExpiryUpdateInterval which allows to + configure the session/cookie expiry's update interval. PR 57300. + [Paul Spangler ] + + *) modules/filters: Fix broken compilation when using old GCC (<4.2.x). + PR 63633. [Rainer Jung, Joe Orton] + + *) mod_ssl: Fix startup failure in 2.4.40 with SSLCertificateChainFile + configured for a domain managed by mod_md. [Stefan Eissing] + +Changes with Apache 2.4.40 + + *) core, mod_rewrite: Set PCRE_DOTALL by default. Revert via + RegexDefaultOptions -DOTALL [Yann Ylavic] + + *) core: Remove request details from built-in error documents [Eric Covener] + + *) mod_http2: core setting "LimitRequestFieldSize" is not additionally checked on + merged header fields, just as HTTP/1.1 does. [Stefan Eissing, Michael Kaufmann] + + *) mod_http2: fixed a bug that prevented proper stream cleanup when connection + throttling was in place. Stream resets by clients on streams initiated by them + are counted as possible trigger for throttling. [Stefan Eissing] + + *) mod_http2/mpm_event: Fixes the behaviour when a HTTP/2 connection has nothing + more to write with streams ongoing (flow control block). The timeout waiting + for the client to send WINODW_UPDATE was incorrectly KeepAliveTimeout and not + Timeout as it should be. Fixes PR 63534. [Yann Ylavic, Stefan Eissing] + + *) mod_proxy_balancer: Load balancer required byrequests when bytraffic chosen. + PR 62372. [Jim Jagielski] + + *) mod_proxy_hcheck: Create the configuration for mod_proxy_hcheck + when used in BalancerMember. PR 60757. [Jean-Frederic Clere] + + *) mod_proxy_hcheck: Mute extremely frequent debug message. [Yann Ylavic] + + *) mod_ssl/mod_md: reversing dependency by letting mod_ssl offer hooks for + adding certificates and keys to a virtual host. An additional hook allows + answering special TLS connections as used in ACME challenges. + Adding 2 new hooks for init/get of OCSP stapling status information when + other modules want to provide those. Falls back to own implementation with + same behaviour as before. + [Stefan Eissing] + + *) mod_md: new features + - protocol + - supports the ACMEv2 protocol. It is the default and will be used on the next + certificate renewal, unless another "MDCertificateAuthority" is configured + - ACMEv2 endpoints use the GET via empty POST way of accessing resources, see + announcement by Let's Encrypt: + https://community.letsencrypt.org/t/acme-v2-scheduled-deprecation-of-unauthenticated-resource-gets/74380 + - challenges + - new challenge method 'tls-alpn-01' implemented + - challenge type 'tls-sni-01' has been removed as CAs do not offer this any longer + - supports command configuration to setup/teardown 'dns-01' challenges + - supports wildcard certificates when dns challenges are configured + - status information and monitoring + - a domain exposes its status at https:///.httpd/certificate-status + - Managed Domains are now in Apache's 'server-status' page + - A new handler 'md-status' exposes verbose status information in JSON format + - new directives + - "MDCertificateFile" and "MDCertificateKeyFile" to configure a + Managed Domain that uses static files. Auto-renewal is turned off for those. + - "MDMessageCmd" that is invoked on several events: 'renewed', 'expiring' and + 'errored'. + - "MDWarnWindow" directive to configure when expiration warnings shall be issued. + [Stefan Eissing] + + *) mod_mime_magic: Fix possible corruption of returned strings. + [Christophe Jaillet] + + *) Default "conf/magic": Fix pattern for "audio/x-wav" for WAV files, + remove "audio/unknown" pattern for other RIFF files. + [Àngel Ollé Blázquez ] + + *) mod_proxy_http2: fixing a potential NULL pointer use in logging. + [Christophe Jaillet, Dr Silvio Cesare InfoSect] + + *) mod_dav: Reduce the amount of memory needed when doing PROPFIND's on large + collections by improving the memory management. [Joe Orton, Ruediger Pluem] + + *) mod_proxy_http2: adding support for handling trailers in both directions. + PR 63502. [Stefan Eissing] + + *) mod_proxy_http: forward 100-continue, and minimize race conditions when + reusing backend connections. PR 60330. [Yann Ylavic, Jean-Frederic Clere] + + *) mod_proxy_balancer: Fix some HTML syntax issues. [Christophe Jaillet] + + *) When using mod_status with the Event MPM, report the number of requests + associated with an active connection in the "ACC" field. Previously + zero was always reported with this MPM. PR60647. [Eric Covener] + + *) mod_http2: remove the no longer existing h2_ngn_shed.c from Cmake. + [Stefan Eissing] + + *) mod_proxy/ssl: Proxy SSL client certificate configuration and other proxy + SSL configurations broken inside context. PR 63430. + [Ruediger Pluem, Yann Ylavic] + + *) mod_proxy: allow SSLProxyCheckPeer* usage for all proxy modules. + PR 61857. [Markus Gausling , Yann Ylavic] + + *) mod_reqtimeout: Fix default rates missing (not applied) in 2.4.39. + PR 63325. [Yann Ylavic] + + *) mod_info: Fix output of server settings for PIPE_BUF in mod_info in + the rare case that PIPE_BUF is defined. [Rainer Jung] + + *) mod_md: Store permissions are enforced on file creation, enforcing restrictions in + spite of umask. Fixes . [Stefan Eissing] + +Changes with Apache 2.4.39 + + *) SECURITY: CVE-2019-0197 (cve.mitre.org) + mod_http2: fixes a possible crash when HTTP/2 was enabled for a http: + host or H2Upgrade was enabled for h2 on a https: host. An Upgrade + request from http/1.1 to http/2 that was not the first request on a + connection could lead to a misconfiguration and crash. Servers that + never enabled the h2 protocol or only enabled it for https: and + did not set "H2Upgrade on" are unaffected by this issue. + [Stefan Eissing] + + *) SECURITY: CVE-2019-0196 (cve.mitre.org) + mod_http2: using fuzzed network input, the http/2 request + handling could be made to access freed memory in string + comparison when determining the method of a request and + thus process the request incorrectly. [Stefan Eissing] + + *) SECURITY: CVE-2019-0211 (cve.mitre.org) + MPMs unix: Fix a local privilege escalation vulnerability by not + maintaining each child's listener bucket number in the scoreboard, + preventing unprivileged code like scripts run by/on the server (e.g. via + mod_php) from modifying it persistently to abuse the privileged main + process. [Charles Fol , Yann Ylavic] + + *) SECURITY: CVE-2019-0217 (cve.mitre.org) + mod_auth_digest: Fix a race condition checking user credentials which + could allow a user with valid credentials to impersonate another, + under a threaded MPM. PR 63124. [Simon Kappel ] + + *) SECURITY: CVE-2019-0215 (cve.mitre.org) + mod_ssl: Fix access control bypass for per-location/per-dir client + certificate verification in TLSv1.3. + + *) SECURITY: CVE-2019-0220 (cve.mitre.org) + Merge consecutive slashes in URL's. Opt-out with + `MergeSlashes OFF`. [Eric Covener] + + *) mod_proxy/ssl: Cleanup per-request SSL configuration anytime a backend + connection is recycled/reused to avoid a possible crash with some SSLProxy + configurations in or context. PR 63256. [Yann Ylavic] + + *) mod_log_config: Support %{c}h for conn-hostname, %h for useragent_host + PR 55348 + + *) mod_socache_redis: Support for Redis as socache storage provider. + + *) core: new configuration option 'MergeSlashes on|off' that controls handling of + multiple, consecutive slash ('/') characters in the path component of the request URL. + [Eric Covener] + + *) mod_http2: when SSL renegotiation is inhibited and a 403 ErrorDocument is + in play, the proper HTTP/2 stream reset did not trigger with H2_ERR_HTTP_1_1_REQUIRED. + Fixed. [Michael Kaufmann] + + *) mod_http2: new configuration directive: `H2Padding numbits` to control + padding of HTTP/2 payload frames. 'numbits' is a number from 0-8, + controlling the range of padding bytes added to a frame. The actual number + added is chosen randomly per frame. This applies to HEADERS, DATA and PUSH_PROMISE + frames equally. The default continues to be 0, e.g. no padding. [Stefan Eissing] + + *) mod_http2: ripping out all the h2_req_engine internal features now that mod_proxy_http2 + has no more need for it. Optional functions are still declared but no longer implemented. + While previous mod_proxy_http2 will work with this, it is recommended to run the matching + versions of both modules. [Stefan Eissing] + + *) mod_proxy_http2: changed mod_proxy_http2 implementation and fixed several bugs which + resolve PR63170. The proxy module does now a single h2 request on the (reused) + connection and returns. [Stefan Eissing] + + *) mod_http2/mod_proxy_http2: proxy_http2 checks correct master connection aborted status + to trigger immediate shutdown of backend connections. This is now always signalled + by mod_http2 when the the session is being released. + proxy_http2 now only sends a PING frame to the backend when there is not already one + in flight. [Stefan Eissing] + + *) mod_proxy_http2: fixed an issue where a proxy_http2 handler entered an infinite + loop when encountering certain errors on the backend connection. + See . [Stefan Eissing] + + *) mod_http2: Configuration directives H2Push and H2Upgrade can now be specified per + Location/Directory, e.g. disabling PUSH for a specific set of resources. [Stefan Eissing] + + *) mod_http2: HEAD requests to some module such as mod_cgid caused the stream to + terminate improperly and cause a HTTP/2 PROTOCOL_ERROR. + Fixes . [Michael Kaufmann] + + *) http: Fix possible empty response with mod_ratelimit for HEAD requests. + PR 63192. [Yann Ylavic] + + *) mod_cache_socache: Avoid reallocations and be safe with outgoing data + lifetime. [Yann Ylavic] + + *) mod_http2: enable re-use of slave connections again. Fixed slave connection + keepalives counter. [Stefan Eissing] + + *) mod_reqtimeout: Allow to configure (TLS-)handshake timeouts. + PR 61310. [Yann Ylavic] + + *) core: Split out the ability to parse wildcard files and directories + from the Include/IncludeOptional directives into a generic set of + functions ap_dir_nofnmatch() and ap_dir_fnmatch(). [Graham Leggett] + + *) mod_proxy_wstunnel: Fix websocket proxy over UDS. + PR 62932 + + *) mod_ssl: Don't unset FIPS mode on restart unless it's forced by + configuration (SSLFIPS on) and not active by default in OpenSSL. + PR 63136. [Yann Ylavic] + +Changes with Apache 2.4.38 + + *) SECURITY: CVE-2018-17199 (cve.mitre.org) + mod_session: mod_session_cookie does not respect expiry time allowing + sessions to be reused. [Hank Ibell] + + *) SECURITY: CVE-2018-17189 (cve.mitre.org) + mod_http2: fixes a DoS attack vector. By sending slow request bodies + to resources not consuming them, httpd cleanup code occupies a server + thread unnecessarily. This was changed to an immediate stream reset + which discards all stream state and incoming data. [Stefan Eissing] + + *) SECURITY: CVE-2019-0190 (cve.mitre.org) + mod_ssl: Fix infinite loop triggered by a client-initiated + renegotiation in TLSv1.2 (or earlier) with OpenSSL 1.1.1 and + later. PR 63052. [Joe Orton] + + *) mod_ssl: Clear retry flag before aborting client-initiated renegotiation. + PR 63052 [Joe Orton] + + *) mod_negotiation: Treat LanguagePriority as case-insensitive to match + AddLanguage behavior and HTTP specification. PR 39730 [Christophe Jaillet] + + *) mod_md: incorrect behaviour when synchronizing ongoing ACME challenges + have been fixed. [Michael Kaufmann, Stefan Eissing] + + *) mod_setenvif: We can have expressions that become true if a regex pattern + in the expression does NOT match. In this case val is NULL + and we should just set the value for the environment variable + like in the pattern case. [Ruediger Pluem] + + *) mod_session: Always decode session attributes early. [Hank Ibell] + + *) core: Incorrect values for environment variables are substituted when + multiple environment variables are specified in a directive. [Hank Ibell] + + *) mod_rewrite: Only create the global mutex used by "RewriteMap prg:" when + this type of map is present in the configuration. PR62311. + [Hank Ibell ] + + *) mod_dav: Fix invalid Location header when a resource is created by + passing an absolute URI on the request line [Jim Jagielski] + + *) mod_session_cookie: avoid duplicate Set-Cookie header in the response. + [Emmanuel Dreyfus , Luca Toscano] + + *) mod_ssl: clear *SSL errors before loading certificates and checking + afterwards. Otherwise errors are reported when other SSL using modules + are in play. Fixes PR 62880. [Michael Kaufmann] + + *) mod_ssl: Fix the error code returned in an error path of + 'ssl_io_filter_handshake()'. This messes-up error handling performed + in 'ssl_io_filter_error()' [Yann Ylavic] + + *) mod_ssl: Fix $HTTPS definition for "SSLEngine optional" case, and fix + authz provider so "Require ssl" works correctly in HTTP/2. + PR 61519, 62654. [Joe Orton, Stefan Eissing] + + *) mod_proxy: If ProxyPassReverse is used for reverse mapping of relative + redirects, subsequent ProxyPassReverse statements, whether they are + relative or absolute, may fail. PR 60408. [Peter Haworth ] + + *) mod_lua: Now marked as a stable module [https://s.apache.org/Xnh1] + +Changes with Apache 2.4.37 + + *) mod_ssl: Fix HTTP/2 failures when using OpenSSL 1.1.1. [Rainer Jung] + + *) mod_ssl: Fix crash during SSL renegotiation with OptRenegotiate set, + when client certificates are available from the original handshake + but were originally not verified and should get verified now. + This is a regression in 2.4.36 (unreleased). [Ruediger Pluem] + + *) mod_ssl: Correctly merge configurations that have client certificates set + by SSLProxyMachineCertificate{File|Path}. [Ruediger Pluem] + +Changes with Apache 2.4.36 + + *) mod_brotli, mod_deflate: Restore the separate handling of 304 Not Modified + responses. Regression introduced in 2.4.35. + + *) mod_proxy_scgi, mod_proxy_uwsgi: improve error handling when sending the + body of the response. [Jim Jagielski] + + *) mpm_event: Stop issuing AH00484 "server reached MaxRequestWorkers..." when + there are still idle threads available. When there are less idle threads than + MinSpareThreads, issue new one-time message AH10159. Matches worker MPM. + [Eric Covener] + + *) mod_http2: adding defensive code for stream EOS handling, in case the request handler + missed to signal it the normal way (eos buckets). Addresses github issues + https://github.com/icing/mod_h2/issues/164, https://github.com/icing/mod_h2/issues/167 + and https://github.com/icing/mod_h2/issues/170. [Stefan Eissing] + + *) ab: Add client certificate support. PR 55774. [Graham Leggett] + + *) ab: Disable printing temp key for OpenSSL before + version 1.0.2. SSL_get_server_tmp_key is not available + there. [Rainer Jung] + + *) mod_ssl: Fix a regression that the configuration settings for verify mode + and verify depth were taken from the frontend connection in case of + connections by the proxy to the backend. PR 62769. [Ruediger Pluem] + + *) MPMs: Initialize all runtime/asynchronous objects on a dedicated pool and + before signals handling to avoid lifetime issues on restart or shutdown. + PR 62658. [Yann Ylavic] + + *) mod_ssl: Add support for OpenSSL 1.1.1 and TLSv1.3. TLSv1.3 has + behavioural changes compared to v1.2 and earlier; client and + configuration changes should be expected. SSLCipherSuite is + enhanced for TLSv1.3 ciphers, but applies at vhost level only. + [Stefan Eissing, Yann Ylavic, Ruediger Pluem, Joe Orton] + + *) mod_auth_basic: Be less tolerant when parsing the credencial. Only spaces + should be accepted after the authorization scheme. \t are also tolerated. + [Christophe Jaillet] + + *) mod_socache_redis: New socache submodule provider to allow use + of Redis as storage backend. [Jim Jagielski] + + *) mod_proxy_hcheck: Fix issues with interval determination. PR 62318 + [Jim Jagielski] + + *) mod_proxy_hcheck: Fix issues with TCP health checks. PR 61499 + [Dominik Stillhard ] + + *) mod_proxy_hcheck: take balancer's SSLProxy* directives into account. + [Jim Jagielski] + + *) mod_status, mod_echo: Fix the display of client addresses. + They were truncated to 31 characters which is not enough for IPv6 addresses. + This is done by deprecating the use of the 'client' field and using + the new 'client64' field in worker_score. + PR 54848 [Bernhard Schmidt , Jim Jagielski] + +Changes with Apache 2.4.35 + + *) http: Enforce consistently no response body with both 204 and 304 + statuses. [Yann Ylavic] + + *) mod_status: Cumulate CPU time of exited child processes in the + "cu" and "cs" values. Add CPU time of the parent process to the + "c" and "s" values. + [Rainer Jung] + + *) mod_proxy: Improve the balancer member data shown in mod_status when + "ProxyStatus" is "On": add "busy" count and show byte counts in + auto mode always in units of kilobytes. [Rainer Jung] + + *) mod_status: Add cumulated response duration time in milliseconds. + [Rainer Jung] + + *) mod_status: Complete the data shown for async MPMs in "auto" mode. + Added number of processes, number of stopping processes and number + of busy and idle workers. [Rainer Jung] + + *) mod_ratelimit: Don't interfere with "chunked" encoding, fixing regression + introduced in 2.4.34. PR 62568. [Yann Ylavic] + + *) mod_proxy: Remove load order and link dependency between mod_lbmethod_* + modules and mod_proxy. PR 62557. [Ruediger Pluem, William Rowe] + + *) Allow the argument to , , , , + and to be quoted. This is primarily for the benefit of + . [Eric Covener] + + *) mod_watchdog: Correct some log messages. [Rainer Jung] + + *) mod_md: When the last domain name from an MD is moved to another one, + that now empty MD gets moved to the store archive. PR 62572. + [Stefan Eissing] + + *) mod_ssl: Fix merging of SSLOCSPOverrideResponder. [Jeff Trawick, + [Frank Meier ] + + *) mod_proxy_balancer: Restore compatibility with APR 1.4. [Joe Orton] + +Changes with Apache 2.4.34 + + *) SECURITY: CVE-2018-8011 (cve.mitre.org) + mod_md: DoS via Coredumps on specially crafted requests + + *) SECURITY: CVE-2018-1333 (cve.mitre.org) + mod_http2: DoS for HTTP/2 connections by specially crafted requests + + *) Introduce zh-cn and zh-tw (simplified and traditional Chinese) error + document translations. [CodeingBoy, popcorner] + + *) event: avoid possible race conditions with modules on the child pool. + [Stefan Fritsch] + + *) mod_proxy: Fix a corner case where the ProxyPassReverseCookieDomain or + ProxyPassReverseCookiePath directive could fail to update correctly + 'domain=' or 'path=' in the 'Set-Cookie' header. PR 61560. + [Christophe Jaillet] + + *) mod_ratelimit: fix behavior when proxing content. PR 62362. + [Luca Toscano, Yann Ylavic] + + *) core: Re-allow '_' (underscore) in hostnames. + [Eric Covener] + + *) mod_authz_core: If several parameters are used in a AuthzProviderAlias + directive, if these parameters are not enclosed in quotation mark, only + the first one is handled. The other ones are silently ignored. + Add a message to warn about such a spurious configuration. + PR 62469 [Hank Ibell , Christophe Jaillet] + + *) mod_md: improvements and bugfixes + - MDNotifyCmd now takes additional parameter that are passed on to the called command. + - ACME challenges have better checks for interference with other modules + - ACME challenges are only handled for domains managed by the module, allowing + other ACME clients to operate for other domains in the server. + - better libressl integration + + *) mod_proxy_wstunnel: Add default schema ports for 'ws' and 'wss'. + PR 62480. [Lubos Uhliarik } + + *) logging: Some early logging-related startup messages could be lost + when using syslog for the global ErrorLog. [Eric Covener] + + *) mod_cache: Handle case of an invalid Expires header value RFC compliant + like the case of an Expires time in the past: allow to overwrite the + non-caching decision using CacheStoreExpired and respect Cache-Control + "max-age" and "s-maxage". [Rainer Jung] + + *) mod_xml2enc: Fix forwarding of error metadata/responses. PR 62180. + [Micha Lenk , Yann Ylavic] + + *) mod_proxy_http: Fix response header thrown away after the previous one + was considered too large and truncated. PR 62196. [Yann Ylavic] + + *) core: Add and handle AP_GETLINE_NOSPC_EOL flag for ap_getline() family + of functions to consume the end of line when the buffer is exhausted. + PR 62198. [Yann Ylavic] + + *) mod_proxy_http: Add new worker parameter 'responsefieldsize' to + allow maximum HTTP response header size to be increased past 8192 + bytes. PR 62199. [Hank Ibell ] + + *) mod_ssl: Extend SSLOCSPEnable with mode 'leaf' that only checks the leaf + of a certificate chain. PR62112. + [Ricardo Martin Camarero ] + + *) http: Fix small memory leak per request when handling persistent + connections. [Ruediger Pluem, Joe Orton] + + *) mod_proxy_html: Fix variable interpolation and memory allocation failure + in ProxyHTMLURLMap. PR 62344. [Ewald Dieterich ] + + *) mod_remoteip: Fix RemoteIP{Trusted,Internal}ProxyList loading broken by 2.4.30. + PR 62220. [Chritophe Jaillet, Yann Ylavic] + + *) mod_remoteip: When overriding the useragent address from X-Forwarded-For, + zero out what had been initialized as the connection-level port. PR59931. + [Hank Ibell ] + + *) core: In ONE_PROCESS/debug mode, cleanup everything when exiting. + [Yann Ylavic] + + *) mod_proxy_balancer: Add hot spare member type and corresponding flag (R). + Hot spare members are used as drop-in replacements for unusable workers + in the same load balancer set. This differs from hot standbys which are + only used when all workers in a set are unusable. PR 61140. [Jim Riggs] + + *) suexec: Add --enable-suexec-capabilites support on Linux, to use + setuid/setgid capability bits rather than a setuid root binary. + [Joe Orton] + + *) suexec: Add support for logging to syslog as an alternative to + logging to a file; use --without-suexec-logfile --with-suexec-syslog. + [Joe Orton] + + *) mod_ssl: Restore 2.4.29 behaviour in SSL vhost merging/enabling + which broke some rare but previously-working configs. [Joe Orton] + + *) core, log: improve sanity checks for the ErrorLog's syslog config, and + explicitly allow only lowercase 'syslog' settings. PR 62102 + [Luca Toscano, Jim Riggs, Christophe Jaillet] + + *) mod_http2: accurate reporting of h2 data input/output per request via + mod_logio. Fixes an issue where output sizes where counted n-times on + reused slave connections. [Stefan Eissing] + See github issue: https://github.com/icing/mod_h2/issues/158 + + *) mod_http2: Fix unnecessary timeout waits in case streams are aborted. + [Stefan Eissing] + + *) mod_http2: restoring the v1.10.16 keepalive timeout behaviour of mod_http2. + [Stefan Eissing] + + *) mod_proxy: Do not restrict the maximum pool size for backend connections + any longer by the maximum number of threads per process and use a better + default if mod_http2 is loaded. + [Yann Ylavic, Ruediger Pluem, Stefan Eissing, Gregg Smith] + + *) mod_slotmem_shm: Add generation number to shm filename to fix races + with graceful restarts. PRs 62044 and 62308. [Jim Jagielski, Yann Ylavic] + + *) core: Preserve the original HTTP request method in the '%] + + *) mod_remoteip: make proxy-protocol work on slave connections, e.g. in + HTTP/2 requests. [Stefan Eissing] + See also https://github.com/roadrunner2/mod-proxy-protocol/issues/6 + + *) mod_ssl: Fix merging of proxy SSL context outside sections, + regression introduced in 2.4.30. PR 62232. [Rainer Jung, Yann Ylavic] + + *) mod_md: Fix compilation with OpenSSL before version 1.0.2. [Rainer Jung] + + *) mod_dumpio: do nothing below log level TRACE7. [Yann Ylavic] + + *) mod_remoteip: Restore compatibility with APR 1.4 (apr_sockaddr_is_wildcard). + [Eric Covener] + + *) core: On ECBDIC platforms, some errors related to oversized headers + may be misreported or be logged as ASCII escapes. PR 62200 + [Hank Ibell ] + + *) mod_ssl: Fix cmake-based build. PR 62266. [Rainer Jung] + + *) core: Add , and conditional + section containers. [Eric Covener, Joe Orton] + + *) rotatelogs: Add -D option to create parent directories. PR 46669. + [Philippe Lantin , Ben Reser, Rainer Jung] + +Changes with Apache 2.4.33 + + *) core: Fix request timeout logging and possible crash for error_log hooks. + [Yann Ylavic] + + *) mod_slomem_shm: Fix failure to create balancers's slotmems in Windows MPM, + where children processes need to attach them instead since they are owned + by the parent process already. [Yann Ylavic] + + *) ab: try all destination socket addresses returned by + apr_sockaddr_info_get instead of failing on first one when not available. + Needed for instance if localhost resolves to both ::1 and 127.0.0.1 + e.g. if both are in /etc/hosts. [Jan Kaluza] + + *) ab: Use only one connection to determine working destination socket + address. [Jan Kaluza] + + *) ab: LibreSSL doesn't have or require Windows applink.c. [Gregg L. Smith] + + *) htpasswd/htdigest: Disable support for bcrypt on EBCDIC platforms. + apr-util's bcrypt implementation doesn't tolerate EBCDIC. [Eric Covener] + + *) htpasswd/htdbm: report the right limit when get_password() overflows. + [Yann Ylavic] + + *) htpasswd: Don't fail in -v mode if password file is unwritable. + PR 61631. [Joe Orton] + + *) htpasswd: don't point to (unused) stack memory on output + to make static analysers happy. PR 60634. + [Yann Ylavic, reported by shqking and Zhenwei Zou] + +Changes with Apache 2.4.32 + + *) mod_access_compat: Fail if a comment is found in an Allow or Deny + directive. [Jan Kaluza] + + *) mod_authz_host: Ignore comments after "Require host", logging a + warning, or logging an error if the line is otherwise empty. + [Jan Kaluza, Joe Orton] + + *) rotatelogs: Fix expansion of %Z in localtime (-l) mode, and fix + Y2K38 bug. [Joe Orton] + + *) mod_ssl: Support SSL DN raw variable extraction without conversion + to UTF-8, using _RAW suffix on variable names. [Joe Orton] + + *) ab: Fix https:// connection failures (regression in 2.4.30); fix + crash generating CSV output for large -n. [Joe Orton, Jan Kaluza] + +Changes with Apache 2.4.31 (not released) + + *) mod_proxy_fcgi: Add the support for mod_proxy's flushpackets and flushwait + parameters. [Luca Toscano, Ruediger Pluem, Yann Ylavic] + + *) mod_ldap: Avoid possible crashes, hangs, and busy loops due to + improper merging of the cache lock in vhost config. + PR 43164 [Eric Covener] + + *) mpm_event: Do lingering close in worker(s). [Yann Ylavic] + + *) mpm_queue: Put fdqueue code in common for MPMs event and worker. + [Yann Ylavic] + +Changes with Apache 2.4.30 (not released) + + *) SECURITY: CVE-2017-15710 (cve.mitre.org) + Out of bound write in mod_authnz_ldap with AuthLDAPCharsetConfig enabled + [Eric Covener, Luca Toscano, Yann Ylavic] + + *) SECURITY: CVE-2018-1283 (cve.mitre.org) + mod_session: CGI-like applications that intend to read from mod_session's + 'SessionEnv ON' could be fooled into reading user-supplied data instead. + [Yann Ylavic] + + *) SECURITY: CVE-2018-1303 (cve.mitre.org) + mod_cache_socache: Fix request headers parsing to avoid a possible crash + with specially crafted input data. [Ruediger Pluem] + + *) SECURITY: CVE-2018-1301 (cve.mitre.org) + core: Possible crash with excessively long HTTP request headers. + Impractical to exploit with a production build and production LogLevel. + [Yann Ylavic] + + *) SECURITY: CVE-2017-15715 (cve.mitre.org) + core: Configure the regular expression engine to match '$' to the end of + the input string only, excluding matching the end of any embedded + newline characters. Behavior can be changed with new directive + 'RegexDefaultOptions'. [Yann Ylavic] + + *) SECURITY: CVE-2018-1312 (cve.mitre.org) + mod_auth_digest: Fix generation of nonce values to prevent replay + attacks across servers using a common Digest domain. This change + may cause problems if used with round robin load balancers. PR 54637 + [Stefan Fritsch] + + *) SECURITY: CVE-2018-1302 (cve.mitre.org) + mod_http2: Potential crash w/ mod_http2. + [Stefan Eissing] + + *) mod_proxy: Provide an RFC1035 compliant version of the hostname in the + proxy_worker_shared structure. PR62085 [Graham Leggett] + + *) mod_proxy: Worker schemes and hostnames which are too large are no + longer fatal errors; it is logged and the truncated values are stored. + [Jim Jagielski] + + *) mod_proxy: Allow setting options to globally defined balancer from + ProxyPass used in VirtualHost. Balancers are now merged using the new + merge_balancers method which merges the balancers options. [Jan Kaluza] + + *) logresolve: Fix incorrect behavior or segfault if -c flag is used + Fixes: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=823259 + [Stefan Fritsch] + + *) mod_remoteip: Add support for PROXY protocol (code donated by Cloudzilla). + Add ability for PROXY protocol processing to be optional to donated code. + See also: http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt + [Cloudzilla/roadrunner2@GitHub, Jim Jagielski, Daniel Ruggeri] + + *) mod_proxy, mod_ssl: Handle SSLProxy* directives in sections, + allowing per backend TLS configuration. [Yann Ylavic] + + *) mod_proxy_uwsgi: Add in UWSGI proxy (sub)module. [Roberto De Ioris, + Jim Jagielski] + + *) mod_proxy_balancer,mod_slotmem_shm: Rework SHM reuse/deletion to not + depend on the number of restarts (non-Unix systems) and preserve shared + names as much as possible on configuration changes for SHMs and persisted + files. PR 62044. [Yann Ylavic, Jim Jagielski] + + *) mod_http2: obsolete code removed, no more events on beam pool destruction, + discourage content encoders on http2-status response (where they do not work). + [Stefan Eissing] + + *) mpm_event: Let the listener thread do its maintenance job on resources + shortage. PR 61979. [Yann Ylavic] + + *) mpm_event: Wakeup the listener to re-enable listening sockets. + [Yann Ylavic] + + *) mod_ssl: The SSLCompression directive will now give an error if used + with an OpenSSL build which does not support any compression methods. + [Joe Orton] + + *) mpm_event,worker: Mask signals for threads created by modules in child + init, so that they don't receive (implicitly) the ones meant for the MPM. + PR 62009. [Armin Abfalterer , Yann Ylavic] + + *) mod_md: new experimental, module for managing domains across virtual hosts, + implementing the Let's Encrypt ACMEv1 protocol to signup and renew + certificates. Please read the modules documentation for further instructions + on how to use it. [Stefan Eissing] + + *) mod_proxy_html: skip documents shorter than 4 bytes + PR 56286 [Micha Lenk ] + + *) core, mpm_event: Avoid a small memory leak of the scoreboard handle, for + the lifetime of the connection, each time it is processed by MPM event. + [Yann Ylavic] + + *) mpm_event: Update scoreboard status for KeepAlive state. [Yann Ylavic] + + *) mod_ldap: Fix a case where a full LDAP cache would continually fail to + purge old entries and log AH01323. PR61891. + [Hendrik Harms ] + + *) mpm_event: close connections not reported as handled by any module to + avoid losing track of them and leaking scoreboard entries. PR 61551. + [Yann Ylavic] + + *) core: A signal received while stopping could have crashed the main + process. PR 61558. [Yann Ylavic] + + *) mod_ssl: support for mod_md added. [Stefan Eissing] + + *) mod_proxy_html: process parsed comments immediately. + Fixes bug (seen in the wild when used with IBM's HTTPD bundle) + where parsed comments may be lost. [Nick Kew] + + *) mod_proxy_html: introduce doctype for HTML 5 [Nick Kew] + + *) mod_proxy_html: fix typo-bug processing "strict" vs "transitional" + HTML/XHTML. PR 56457 [Nick Kew] + + *) mpm_event: avoid a very unlikely race condition between the listener and + the workers when the latter fails to add a connection to the pollset. + [Yann Ylavic] + + *) core: silently ignore a not existent file path when IncludeOptional + is used. PR 57585. [Alberto Murillo Silva , Luca Toscano] + + *) mod_macro: fix usability of globally defined macros in .htaccess files. + PR 57525. [Jose Kahan , Yann Ylavic] + + *) mod_rewrite, core: add the Vary header when a condition evaluates to true + and the related RewriteRule is used in a Directory context + (triggering an internal redirect). [Luca Toscano] + + *) ab: Make the TLS layer aware that the underlying socket is nonblocking, + and use/handle POLLOUT where needed to avoid busy IOs and recover write + errors when appropriate. [Yann Ylavic] + + *) ab: Keep reading nonblocking to exhaust TCP or SSL buffers when previous + read was incomplete (the SSL case can cause the next poll() to timeout + since data are buffered already). PR 61301 [Luca Toscano, Yann Ylavic] + + *) mod_http2: avoid unnecessary data retrieval for a trace log. Allow certain + information retrievals on null bucket beams where it makes sense. [Stefan Eissing] + +Changes with Apache 2.4.29 + + *) mod_unique_id: Use output of the PRNG rather than IP address and + pid, avoiding sleep() call and possible DNS issues at startup, + plus improving randomness for IPv6-only hosts. [Jan Kaluza] + + *) mod_rewrite, core: Avoid the 'Vary: Host' response header when HTTP_HOST + is used in a condition that evaluates to true. PR 58231 [Luca Toscano, Yann Ylavic] + + *) mod_http2: v0.10.12, removed optimization for mutex handling in bucket + beams that could lead to assertion failure in edge cases. + [Stefan Eissing] + + *) mod_proxy: Fix regression for non decimal loadfactor parameter introduced + in 2.4.28. [Jim Jagielski] + + *) mod_authz_dbd: fix a segmentation fault if AuthzDBDQuery is not set. + PR 61546. [Lubos Uhliarik ] + + *) mod_rewrite: Add support for starting External Rewriting Programs + as non-root user on UNIX systems by specifying username and group + name as third argument of RewriteMap directive. [Jan Kaluza] + + *) core: Rewrite the Content-Length filter to avoid excessive memory + consumption. Chunked responses will be generated in more cases + than in previous releases. PR 61222. [Joe Orton, Ruediger Pluem] + + *) mod_ssl: Fix SessionTicket callback return value, which does seem to + matter with OpenSSL 1.1. [Yann Ylavic] + +Changes with Apache 2.4.28 + + *) SECURITY: CVE-2017-9798 (cve.mitre.org) + Corrupted or freed memory access. must now be used in the + main configuration file (httpd.conf) to register HTTP methods before the + .htaccess files. [Yann Ylavic] + + *) event: Avoid possible blocking in the listener thread when shutting down + connections. PR 60956. [Yann Ylavic] + + *) mod_speling: Don't embed referer data in a link in error page. + PR 38923 [Nick Kew] + + *) htdigest: prevent a buffer overflow when a string exceeds the allowed max + length in a password file. PR 61511. + [Luca Toscano, Hanno Böck ] + + *) mod_proxy: loadfactor parameter can now be a decimal number (eg: 1.25). + [Jim Jagielski] + + *) mod_proxy_wstunnel: Allow upgrade to any protocol dynamically. + PR 61142. + + *) mod_watchdog/mod_proxy_hcheck: Time intervals can now be specified + down to the millisecond. Supports 'mi' (minute), 'ms' (millisecond), + 's' (second) and 'hr' (hour!) time suffixes. [Jim Jagielski] + + *) mod_http2: Fix for stalling when more than 32KB are written to a + suspended stream. [Stefan Eissing] + + *) build: allow configuration without APR sources. [Jacob Champion] + + *) mod_ssl, ab: Fix compatibility with LibreSSL. PR 61184. + [Bernard Spil , Michael Schlenker , + Yann Ylavic] + + *) core/log: Support use of optional "tag" in syslog entries. + PR 60525. [Ben Rubson , Jim Jagielski] + + *) mod_proxy: Fix ProxyAddHeaders merging. [Joe Orton] + + *) core: Disallow multiple Listen on the same IP:port when listener buckets + are configured (ListenCoresBucketsRatio > 0), consistently with the single + bucket case (default), thus avoiding the leak of the corresponding socket + descriptors on graceful restart. [Yann Ylavic] + + *) event: Avoid listener periodic wake ups by using the pollset wake-ability + when available. PR 57399. [Yann Ylavic, Luca Toscano] + + *) mod_proxy_wstunnel: Fix detection of unresponded request which could have + led to spurious HTTP 502 error messages sent on upgrade connections. + PR 61283. [Yann Ylavic] + +Changes with Apache 2.4.27 + + *) SECURITY: CVE-2017-9789 (cve.mitre.org) + mod_http2: Read after free. When under stress, closing many connections, + the HTTP/2 handling code would sometimes access memory after it has been + freed, resulting in potentially erratic behaviour. + [Stefan Eissing] + + *) SECURITY: CVE-2017-9788 (cve.mitre.org) + mod_auth_digest: Uninitialized memory reflection. The value placeholder + in [Proxy-]Authorization headers type 'Digest' was not initialized or + reset before or between successive key=value assignments. + [William Rowe] + + *) COMPATIBILITY: mod_lua: Remove the undocumented exported 'apr_table' + global variable when using Lua 5.2 or later. This was exported as a + side effect from luaL_register, which is no longer supported as of + Lua 5.2 which deprecates pollution of the global namespace. + [Rainer Jung] + + *) COMPATIBILITY: mod_http2: Disable and give warning when using Prefork. + The server will continue to run, but HTTP/2 will no longer be negotiated. + [Stefan Eissing] + + *) COMPATIBILITY: mod_proxy_fcgi: Revert to 2.4.20 FCGI behavior for the + default ProxyFCGIBackendType, fixing a regression with PHP-FPM. PR 61202. + [Jacob Champion, Jim Jagielski] + + *) mod_lua: Improve compatibility with Lua 5.1, 5.2 and 5.3. + PR58188, PR60831, PR61245. [Rainer Jung] + + *) mod_http2: Simplify ready queue, less memory and better performance. Update + mod_http2 version to 1.10.7. [Stefan Eissing] + + *) Allow single-char field names inadvertently disallowed in 2.4.25. + PR 61220. [Yann Ylavic] + + *) htpasswd / htdigest: Do not apply the strict permissions of the temporary + passwd file to a possibly existing passwd file. PR 61240. [Ruediger Pluem] + + *) core: Avoid duplicate HEAD in Allow header. + This is a regression in 2.4.24 (unreleased), 2.4.25 and 2.4.26. + PR 61207. [Christophe Jaillet] + +Changes with Apache 2.4.26 + + *) SECURITY: CVE-2017-7679 (cve.mitre.org) + mod_mime can read one byte past the end of a buffer when sending a + malicious Content-Type response header. [Yann Ylavic] + + *) SECURITY: CVE-2017-7668 (cve.mitre.org) + The HTTP strict parsing changes added in 2.2.32 and 2.4.24 introduced a + bug in token list parsing, which allows ap_find_token() to search past + the end of its input string. By maliciously crafting a sequence of + request headers, an attacker may be able to cause a segmentation fault, + or to force ap_find_token() to return an incorrect value. + [Jacob Champion] + + *) SECURITY: CVE-2017-7659 (cve.mitre.org) + A maliciously constructed HTTP/2 request could cause mod_http2 to + dereference a NULL pointer and crash the server process. + + *) SECURITY: CVE-2017-3169 (cve.mitre.org) + mod_ssl may dereference a NULL pointer when third-party modules call + ap_hook_process_connection() during an HTTP request to an HTTPS port. + [Yann Ylavic] + + *) SECURITY: CVE-2017-3167 (cve.mitre.org) + Use of the ap_get_basic_auth_pw() by third-party modules outside of the + authentication phase may lead to authentication requirements being + bypassed. + [Emmanuel Dreyfus , Jacob Champion, Eric Covener] + + *) HTTP/2 support no longer tagged as "experimental" but is instead considered + fully production ready. + + *) mod_http2: Fix for possible CPU busy loop introduced in v1.10.3 where a stream may keep + the session in continuous check for state changes that never happen. + [Stefan Eissing] + + *) mod_proxy_wstunnel: Add "upgrade" parameter to allow upgrade to other + protocols. [Jean-Frederic Clere] + + *) MPMs unix: Place signals handlers and helpers out of DSOs to avoid + a possible crash if a signal is caught during (graceful) restart. + PR 60487. [Yann Ylavic] + + *) mod_rewrite: When a substitution is a fully qualified URL, and the + scheme/host/port matches the current virtual host, stop interpreting the + path component as a local path just because the first component of the + path exists in the filesystem. Adds RewriteOption "LegacyPrefixDocRoot" + to revert to previous behavior. PR60009. + [Hank Ibell ] + + *) core: ap_parse_form_data() URL-decoding doesn't work on EBCDIC + platforms. PR61124. [Hank Ibell ] + + *) ab: enable option processing for setting a custom HTTP method also for + non-SSL builds. [Rainer Jung] + + *) core: EBCDIC fixes for interim responses with additional headers. + [Eric Covener] + + *) mod_env: when processing a 'SetEnv' directive, warn if the environment + variable name includes a '='. It is likely a configuration error. + PR 60249 [Christophe Jaillet] + + *) Evaluate nested If/ElseIf/Else configuration blocks. + [Luca Toscano, Jacob Champion] + + *) mod_rewrite: Add 'BNP' (backreferences-no-plus) flag to RewriteRule to + allow spaces in backreferences to be encoded as %20 instead of '+'. + [Eric Covener] + + *) mod_rewrite: Add the possibility to limit the escaping to specific + characters in backreferences by listing them in the B flag. + [Eric Covener] + + *) mod_substitute: Fix spurious AH01328 (Line too long) errors on EBCDIC + systems. [Eric Covener] + + *) mod_http2: fail requests without ERROR log in case we need to read interim + responses and see only garbage. This can happen if proxied servers send + data where none should be, e.g. a body for a HEAD request. [Stefan Eissing] + + *) mod_proxy_http2: adding support for Reverse Proxy Request headers. + [Stefan Eissing] + + *) mod_http2: fixed possible deadlock that could occur when connections were + terminated early with ongoing streams. Fixed possible hanger with timeout + on race when connection considers itself idle. [Stefan Eissing] + + *) mod_http2: MaxKeepAliveRequests now limits the number of times a + slave connection gets reused. [Stefan Eissing] + + *) mod_brotli: Add a new module for dynamic Brotli (RFC 7932) compression. + [Evgeny Kotkov] + + *) mod_proxy_http2: Fixed bug in re-attempting proxy requests after + connection error. Reliability of reconnect handling improved. + [Stefan Eissing] + + *) mod_http2: better performance, eliminated need for nested locks and + thread privates. Moving request setups from the main connection to the + worker threads. Increase number of spare connections kept. + [Stefan Eissing] + + *) mod_http2: input buffering and dynamic flow windows for increased + throughput. Requires nghttp2 >= v1.5.0 features. Announced at startup + in mod_http2 INFO log as feature 'DWINS'. [Stefan Eissing] + + *) mod_http2: h2 workers with improved scalability for better scheduling + performance. There are H2MaxWorkers threads created at start and the + number is kept constant for now. [Stefan Eissing] + + *) mod_http2: obsoleted option H2SessionExtraFiles, will be ignored and + just log a warning. [Stefan Eissing] + + *) mod_autoindex: Add IndexOptions UseOldDateFormat to allow the date + format from 2.2 in the Last Modified column. PR60846. + [Hank Ibell ] + + *) core: Add %{REMOTE_PORT} to the expression parser. PR59938 + [Hank Ibell ] + + *) mod_cache: Fix a regression in 2.4.25 for the forward proxy case by + computing and using the same entity key according to when the cache + checks, loads and saves the request. + PR 60577. [Yann Ylavic] + + *) mod_proxy_hcheck: Don't validate timed out responses. [Yann Ylavic] + + *) mod_proxy_hcheck: Ensure thread-safety when concurrent healthchecks are + in use (ProxyHCTPsize > 0). PR 60071. [Yann Ylavic, Jim Jagielski] + + *) core: %{DOCUMENT_URI} used in nested SSI expressions should point to the + URI originally requested by the user, not the nested documents URI. This + restores the behavior of this variable to match the "legacy" SSI parser. + PR60624. [Hank Ibell ] + + *) mod_proxy_fcgi: Add ProxyFCGISetEnvIf to fixup CGI environment + variables just before invoking the FastCGI. [Eric Covener, + Jacob Champion] + + *) mod_proxy_fcgi: Return to 2.4.20-and-earlier behavior of leaving + a "proxy:fcgi://" prefix in the SCRIPT_FILENAME environment variable by + default. Add ProxyFCGIBackendType to allow the type of backend to be + specified so these kinds of fixups can be restored without impacting + FPM. PR60576 [Eric Covener, Jim Jagielski] + + *) mod_ssl: work around leaks on (graceful) restart. [Yann Ylavic] + + *) mod_ssl: Add support for OpenSSL 1.1.0. [Rainer Jung] + + *) Don't set SO_REUSEPORT unless ListenCoresBucketsRatio is greater + than zero. [Eric Covener] + + *) mod_http2: moving session cleanup to pre_close hook to avoid races with + modules already shut down and slave connections still operating. + [Stefan Eissing] + + *) mod_lua: Support for Lua 5.3 + + *) mod_proxy_http2: support for ProxyPreserverHost directive. [Stefan Eissing] + + *) mod_http2: fix for crash when running out of memory. + [Robert Swiecki , Stefan Eissing] + + *) mod_proxy_fcgi: Return HTTP 504 rather than 503 in case of proxy timeout. + [Luca Toscano] + + *) mod_http2: not counting file buckets again stream max buffer limits. + Effectively transferring static files in one step from slave to master + connection. [Stefan Eissing] + + *) mod_http2: comforting ap_check_pipeline() on slave connections + to facilitate reuse (see https://github.com/icing/mod_h2/issues/128). + [Stefan Eissing, reported by Armin Abfalterer] + + *) mod_http2: http/2 streams now with state handling/transitions as defined + in RFC7540. Stream cleanup/connection shutdown reworked to become easier + to understand/maintain/debug. Added many asserts on state and cleanup + transitions. [Stefan Eissing] + + *) mod_auth_digest: Use an anonymous shared memory segment by default, + preventing startup failure after unclean shutdown. PR 54622. + [Jan Kaluza] + + *) mod_filter: Fix AddOutputFilterByType with non-content-level filters. + PR 58856. [Micha Lenk ] + + *) mod_watchdog: Fix semaphore leak over restarts. [Jim Jagielski] + + *) mod_http2: regression fix on PR 59348, on graceful restart, ongoing + streams are finished normally before the final GOAWAY is sent. + [Stefan Eissing, ] + + *) mod_proxy: Allow the per-request environment variable "no-proxy" to + be used as an alternative to ProxyPass /path !. This is primarily + to set exceptions for ProxyPass specified in context. + Use SetEnvIf, not SetEnv. PR 60458. [Eric Covener] + + *) mod_http2: fixes PR60599, sending proper response for conditional requests + answered by mod_cache. [Jeff Wheelhouse, Stefan Eissing] + + *) mod_http2: rework of stream resource cleanup to avoid a crash in a close + of a lingering connection. Prohibit special file bucket beaming for + shared buckets. Files sent in stream output now use the stream pool + as read buffer, reducing memory footprint of connections. + [Yann Ylavic, Stefan Eissing] + + *) mod_proxy_fcgi, mod_fcgid: Fix crashes in ap_fcgi_encoded_env_len() when + modules add empty environment variables to the request. PR 60275. + [] + + *) mod_http2: fix for possible page fault when stream is resumed during + session shutdown. [sidney-j-r-m (github)] + + *) mod_http2: fix for h2 session ignoring new responses while already + open streams continue to have data available. [Stefan Eissing] + + *) mod_http2: adding support for MergeTrailers directive. [Stefan Eissing] + + *) mod_http2: limiting DATA frame sizes by TLS record sizes in use on the + connection. Flushing outgoing frames earlier. [Stefan Eissing] + + *) mod_http2: cleanup beamer registry on server reload. PR 60510. + [Pavel Mateja , Stefan Eissing] + + *) mod_proxy_{ajp,fcgi}: Fix a possible crash when reusing an established + backend connection, happening with LogLevel trace2 or higher configured, + or at any log level with compilers not detected as C99 compliant (e.g. + MSVC on Windows). [Yann Ylavic] + + *) mod_ext_filter: Don't interfere with "error buckets" issued by other + modules. PR 60375. [Eric Covener, Lubos Uhliarik] + + *) mod_http2: fixes https://github.com/icing/mod_h2/issues/126 e.g. beam + bucket lifetime handling when data is sent over temporary pools. + [Stefan Eissing] + +Changes with Apache 2.4.25 + + *) Fix some build issues related to various modules. + [Rainer Jung] + +Changes with Apache 2.4.24 (not released) + + *) SECURITY: CVE-2016-8740 (cve.mitre.org) + mod_http2: Mitigate DoS memory exhaustion via endless + CONTINUATION frames. + [Naveen Tiwari and CDF/SEFCOM at Arizona State + University, Stefan Eissing] + + *) SECURITY: CVE-2016-2161 (cve.mitre.org) + mod_auth_digest: Prevent segfaults during client entry allocation when + the shared memory space is exhausted. + [Maksim Malyutin , Eric Covener, Jacob Champion] + + *) SECURITY: CVE-2016-0736 (cve.mitre.org) + mod_session_crypto: Authenticate the session data/cookie with a + MAC (SipHash) to prevent deciphering or tampering with a padding + oracle attack. [Yann Ylavic, Colm MacCarthaigh] + + *) SECURITY: CVE-2016-8743 (cve.mitre.org) + Enforce HTTP request grammar corresponding to RFC7230 for request lines + and request headers, to prevent response splitting and cache pollution by + malicious clients or downstream proxies. [William Rowe, Stefan Fritsch] + + *) Validate HTTP response header grammar defined by RFC7230, resulting + in a 500 error in the event that invalid response header contents are + detected when serving the response, to avoid response splitting and cache + pollution by malicious clients, upstream servers or faulty modules. + [Stefan Fritsch, Eric Covener, Yann Ylavic] + + *) core: Mitigate [f]cgi CVE-2016-5387 "httpoxy" issues. + [Dominic Scheirlinck , Yann Ylavic] + + *) mod_rewrite: Limit runaway memory use by short circuiting some kinds of + looping RewriteRules when the local path significantly exceeds + LimitRequestLine. PR 60478. [Jeff Wheelhouse ] + + *) mod_ratelimit: Allow for initial "burst" amount at full speed before + throttling: PR 60145 [Andy Valencia , + Jim Jagielski] + + *) mod_socache_memcache: Provide memcache stats to mod_status. + [Jim Jagielski] + + *) mod_file_cache: mod_file_cache should be able to serve files that + haven't had a Content-Type set via e.g. mod_mime. [Eric Covener] + + *) http_filters: Fix potential looping in new check_headers() due to new + pattern of ap_die() from http header filter. Explicitly clear the + previous headers and body. + + *) core: Drop Content-Length header and message-body from HTTP 204 responses. + PR 51350 [Luca Toscano] + + *) mod_proxy: Honor a server scoped ProxyPass exception when ProxyPass is + configured in , like in 2.2. PR 60458. + [Eric Covener] + + *) mod_lua: Fix default value of LuaInherit directive. It should be + 'parent-first' instead of 'none', as per documentation. PR 60419 + [Christophe Jaillet] + + *) core: New directive HttpProtocolOptions to control httpd enforcement + of various RFC7230 requirements. [Stefan Fritsch, William Rowe] + + *) core: Permit unencoded ';' characters to appear in proxy requests and + Location: response headers. Corresponds to modern browser behavior. + [William Rowe] + + *) core: ap_rgetline_core now pulls from r->proto_input_filters. + + *) core: Correctly parse an IPv6 literal host specification in an absolute + URL in the request line. [Stefan Fritsch] + + *) core: New directive RegisterHttpMethod for registering non-standard + HTTP methods. [Stefan Fritsch] + + *) mod_socache_memcache: Pass expiration time through to memcached. PR 55445. + [Faidon Liambotis , Joe Orton] + + *) mod_cache: Use the actual URI path and query-string for identifying the + cached entity (key), such that rewrites are taken into account when + running afterwards (CacheQuickHandler off). PR 21935. [Yann Ylavic] + + *) mod_http2: new directive 'H2EarlyHints' to enable sending of HTTP status + 103 interim responses. Disabled by default. [Stefan Eissing] + + *) mod_ssl: Fix quick renegotiation (OptRenegotiaton) with no intermediate + in the client certificate chain. PR 55786. [Yann Ylavic] + + *) event: Allow to use the whole allocated scoreboard (up to ServerLimit + slots) to avoid scoreboard full errors when some processes are finishing + gracefully. Also, make gracefully finishing processes close all + keep-alive connections. PR 53555. [Stefan Fritsch] + + *) mpm_event: Don't take over scoreboard slots from gracefully finishing + threads. [Stefan Fritsch] + + *) mpm_event: Free memory earlier when shutting down processes. + [Stefan Fritsch] + + *) mod_status: Display the process slot number in the async connection + overview. [Stefan Fritsch] + + *) mod_dir: Responses that go through "FallbackResource" might appear to + hang due to unterminated chunked encoding. PR58292. [Eric Covener] + + *) mod_dav: Fix a potential cause of unbounded memory usage or incorrect + behavior in a routine that sends 's to the output filters. + [Evgeny Kotkov] + + *) mod_http2: new directive 'H2PushResource' to enable early pushes before + processing of the main request starts. Resources are announced to the + client in Link headers on a 103 early hint response. + All responses with status code <400 are inspected for Link header and + trigger pushes accordingly. 304 still does prevent pushes. + 'H2PushResource' can mark resources as 'critical' which gives them higher + priority than the main resource. This leads to preferred scheduling for + processing and, when content is available, will send it first. 'critical' + is also recognized on Link headers. [Stefan Eissing] + + *) mod_proxy_http2: uris in Link headers are now mapped back to a suitable + local url when available. Relative uris with an absolute path are mapped + as well. This makes reverse proxy mapping available for resources + announced in this header. + With 103 interim responses being forwarded to the main client connection, + this effectively allows early pushing of resources by a reverse proxied + backend server. [Stefan Eissing] + + *) mod_proxy_http2: adding support for newly proposed 103 status code. + [Stefan Eissing] + + *) mpm_unix: Apache fails to start if previously crashed then restarted with + the same PID (e.g. in container). PR 60261. + [Val , Yann Ylavic] + + *) mod_http2: unannounced and multiple interim responses (status code < 200) + are parsed and forwarded to client until a final response arrives. + [Stefan Eissing] + + *) mod_proxy_http2: improved robustness when main connection is closed early + by resetting all ongoing streams against the backend. + [Stefan Eissing] + + *) mod_http2: allocators from slave connections are released earlier, + resulting in less overall memory use on busy, long lived connections. + [Stefan Eissing] + + *) mod_remoteip: Pick up where we left off during a subrequest rather + than running with the modified XFF but original TCP address. + PR 49839/PR 60251 + + *) http: Respond with "408 Request Timeout" when a timeout occurs while + reading the request body. [Yann Ylavic] + + *) mod_http2: connection shutdown revisited: corrected edge cases on + shutting down ongoing streams, changed log warnings to be less noisy + when waiting on long running tasks. [Stefan Eissing] + + *) mod_http2: changed all AP_DEBUG_ASSERT to ap_assert to have them + available also in normal deployments. [Stefan Eissing] + + *) mod_http2/mod_proxy_http2: 100-continue handling now properly implemented + up to the backend. Reused HTTP/2 proxy connections with more than a second + not used will block request bodies until a PING answer is received. + Requests headers are not delayed by this, since they are repeatable in + case of failure. This greatly increases robustness, especially with + busy server and/or low keepalive connections. [Stefan Eissing] + + *) mod_proxy_http2: fixed duplicate symbols with mod_http2. + [Stefan Eissing] + + *) mod_http2: rewrite of how responses and trailers are transferred between + master and slave connection. Reduction of internal states for tasks + and streams, stability. Heuristic id generation for slave connections + to better keep promise of connection ids unique at given point int time. + Fix for mod_cgid interop in high load situations. + Fix for handling of incoming trailers when no request body is sent. + [Stefan Eissing] + + *) mod_http2: fix suspended handling for streams. Output could become + blocked in rare cases. [Stefan Eissing] + + *) mpm_winnt: Prevent a denial of service when the 'data' AcceptFilter is in + use by replacing it with the 'connect' filter. PR 59970. [Jacob Champion] + + *) mod_cgid: Resolve a case where a short CGI response causes a subsequent + CGI to be killed prematurely, resulting in a truncated subsequent + response. [Eric Covener] + + *) mod_proxy_hcheck: Set health check URI and expression correctly for health + check worker. PR 60038 [zdeno ] + + *) mod_http2: if configured with nghttp2 1.14.0 and onward, invalid request + headers will immediately reset the stream with a PROTOCOL error. Feature + logged by module on startup as 'INVHD' in info message. + [Stefan Eissing] + + *) mod_http2: fixed handling of stream buffers during shutdown. + [Stefan Eissing] + + *) mod_reqtimeout: Fix body timeout disabling for CONNECT requests to avoid + triggering mod_proxy_connect's AH01018 once the tunnel is established. + [Yann Ylavic] + + *) ab: Set the Server Name Indication (SNI) extension on outgoing TLS + connections (unless -I is specified), according to the Host header (if + any) or the requested URL's hostname otherwise. [Yann Ylavic] + + *) mod_proxy_fcgi: avoid loops when ProxyErrorOverride is enabled + and the error documents are proxied. PR 55415. [Luca Toscano] + + *) mod_proxy_fcgi: read the whole FCGI response even when the content + has not been modified (HTTP 304) or in case of a precondition failure + (HTTP 412) to avoid subsequent bogus reads and confusing + error messages logged. [Luca Toscano] + + *) mod_http2: h2 status resource follows latest draft, see + http://www.ietf.org/id/draft-benfield-http2-debug-state-01.txt + [Stefan Eissing] + + *) mod_http2: handling graceful shutdown gracefully, e.g. handling existing + streams to the end. [Stefan Eissing] + + *) mod_proxy_{http,ajp,fcgi}: don't reuse backend connections with data + available before the request is sent. PR 57832. [Yann Ylavic] + + *) mod_proxy_balancer: Prevent redirect loops between workers within a + balancer by limiting the number of redirects to the number balancer + members. PR 59864 [Ruediger Pluem] + + *) mod_proxy: Correctly consider error response codes by the backend when + processing failonstatus. PR 59869 [Ruediger Pluem] + + *) mod_dav: Add dav_get_provider_name() function to obtain the name + of the provider from mod_dav. [Graham Leggett] + + *) mod_dav: Add support for childtags to dav_error. + [Jari Urpalainen ] + + *) mod_proxy_fcgi: Fix 2.4.23 breakage for mod_rewrite per-dir and query + string showing up in SCRIPT_FILENAME. PR59815 + + *) mod_include: Fix a potential memory misuse while evaluating expressions. + PR59844. [Eric Covener] + + *) mod_http2: new H2CopyFiles directive that changes treatment of file + handles in responses. Necessary in order to fix broken lifetime handling + in modules such as mod_wsgi. + + *) mod_http2: removing timeouts on master connection while requests are + being processed. Requests may timeout, but the master only times out when + no more requests are active. [Stefan Eissing] + + *) mod_http2: fixes connection flush when answering SETTINGS without any + stream open. [Moto Ishizawa <@summerwind>, Stefan Eissing] + +Changes with Apache 2.4.23 + + *) mod_ssl: reset client-verify state of ssl when aborting renegotiations. + [Erki Aring , Stefan Eissing] + + *) mod_sed: Fix 'x' command processing. [Christophe Jaillet] + + *) configure: Fix ./configure edge-case failures around dependencies + of mod_proxy_hcheck. [William Rowe, Ruediger Pluem, Jeff Trawick] + +Changes with Apache 2.4.22 + + *) mod_http2: fix for request abort when connections drops, introduced in + 1.5.8 + +Changes with Apache 2.4.21 + + *) core: Added support for HTTP code 451. PR 58985. + [Yehuda Katz , Jim Jagielski] + + *) ab: Use caseless matching for HTTP tokens (e.g. content-length). PR 59111. + [Yann Ylavic] + + *) mod_http2: more rigid error handling in DATA frame assembly, leading + to deterministic connection errors if assembly fails. + [Stefan Eissing, Pal Nilsen ] + + *) abs: Include OPENSSL_Applink when compiling on Windows, to resolve + failures under Visual Studio 2015 and other mismatched MSVCRT flavors. + PR59630 [Jan Ehrhardt ] + + *) mod_ssl: Add "no_crl_for_cert_ok" flag to SSLCARevocationCheck directive + to opt-in previous behaviour (2.2) with CRLs verification when checking + certificate(s) with no corresponding CRL. [Yann Ylavic] + + *) mpm_event, mpm_worker: Fix computation of MinSpareThreads' lower bound + according the number of listeners buckets. [Yann Ylavic] + + *) Add ap_cstr_casecmp[n]() - placeholder of apr_cstr_casecmp[n] functions + for case-insensitive C/POSIX-locale token comparison. + [Jim Jagielski, William Rowe, Yann Ylavic, Branko Čibej] + + *) mod_userdir: Constify and save a few bytes in the conf pool when + parsing the "UserDir" directive. [Christophe Jaillet] + + *) mod_cache: Fix (max-stale with no '=') and enforce (check + integers after '=') Cache-Control header parsing. + [Christophe Jaillet] + + *) core: Add -DDUMP_INCLUDES configtest option to show the tree + of Included configuration files. + [Jacob Champion ] + + *) mod_proxy_fcgi: Avoid passing a filename of proxy:fcgi:// as + SCRIPT_FILENAME to a FastCGI server. PR59618. + [Jacob Champion ] + + *) mod_dav: Add dav_get_provider_name() function to obtain the name + of the provider from mod_dav. + [Jari Urpalainen ] + + *) mod_proxy_http2: properly care for HTTP2 flow control of the frontend + connection is HTTP/1.1. [Patch supplied by Evgeny Kotkov] + + *) mod_http2: improved cleanup of connection/streams/tasks to always + have deterministic order regardless of event initiating it. Addresses + reported crashes due to memory read after free issues. + [Stefan Eissing] + + *) mod_ssl: Correct the interaction between SSLProxyCheckPeerCN and newer + SSLProxyCheckPeerName directives since release 2.4.5, such that disabling + either disables both, and that enabling either triggers the new, more + comprehensive SSLProxyCheckPeerName behavior. Only a single configuration + remains to enable the legacy behavior, which is to explicitly disable + SSLProxyCheckPeerName, and enable SSLProxyCheckPeerCN. [William Rowe] + + *) mod_include: add the + statements. [Christophe Jaillet] + + *) split-logfile: Fix perl error: 'Can't use string ("example.org:80") + as a symbol ref while "strict refs"'. PR 56329. + [Holger Mauermann ] + + *) mod_proxy: Prevent ProxyPassReverse from doing a substitution when + the URL parameter interpolates to an empty string. PR 56603. + [] + + *) core: Fix -D[efined] or [d] variables lifetime across restarts. + PR 57328. [Armin Abfalterer , Yann Ylavic]. + + *) mod_proxy: Preserve original request headers even if they differ + from the ones to be forwarded to the backend. PR 45387. + [Yann Ylavic] + + *) mod_ssl: dump SSL IO/state for the write side of the connection(s), + like reads (level TRACE4). [Yann Ylavic] + + *) mod_proxy_fcgi: Ignore body data from backend for 304 responses. PR 57198. + [Jan Kaluza] + + *) mod_ssl: Do not crash when looking up SSL related variables during + expression evaluation on non SSL connections. PR 57070 [Ruediger Pluem] + + *) mod_proxy_ajp: Fix handling of the default port (8009) in the + ProxyPass and configurations. PR 57259. [Yann Ylavic] + + *) mpm_event: Avoid a possible use after free when notifying the end of + connection during lingering close. PR 57268. [Eric Covener, Yann Ylavic] + + *) mod_ssl: Fix recognition of OCSP stapling responses that are encoded + improperly or too large. [Jeff Trawick] + + *) core: Add ap_log_data(), ap_log_rdata(), etc. for logging buffers. + [Jeff Trawick] + + *) mod_proxy_fcgi, mod_authnz_fcgi: stop reading the response and issue an + error when parsing or forwarding the response fails. [Yann Ylavic] + + *) mod_ssl: Fix a memory leak in case of graceful restarts with OpenSSL >= 0.9.8e + PR 53435 [tadanori , Sebastian Wiedenroth ] + + *) mod_proxy_connect: Don't issue AH02447 on sockets hangups, let the read + determine whether it is a normal close or a real error. PR 57168. [Yann + Ylavic] + + *) mod_proxy_wstunnel: abort backend connection on polling error to avoid + further processing. [Yann Ylavic] + + *) core: Support custom ErrorDocuments for HTTP 501 and 414 status codes. + PR 57167 [Edward Lu ] + + *) mod_proxy_connect: Fix ProxyRemote to https:// backends on EBCDIC + systems. PR 57092 [Edward Lu ] + + *) mod_cache: Avoid a 304 response to an unconditional request when an AH00752 + CacheLock error occurs during cache revalidation. [Eric Covener] + + *) mod_ssl: Move OCSP stapling information from a per-certificate store to + a per-server hash. PR 54357, PR 56919. [Alex Bligh , + Yann Ylavic, Kaspar Brand] + + *) mod_cache_socache: Change average object size hint from 32 bytes to + 2048 bytes. [Rainer Jung] + + *) mod_cache_socache: Add cache status to server-status. [Rainer Jung] + + *) event: Fix worker-listener deadlock in graceful restart. + PR 56960. + + *) Concat strings at compile time when possible. PR 53741. + + *) mod_substitute: Restrict configuration in .htaccess to + FileInfo as documented. [Rainer Jung] + + *) mod_substitute: Make maximum line length configurable. [Rainer Jung] + + *) mod_substitute: Fix line length limitation in case of regexp plus flatten. + [Rainer Jung] + + *) mod_proxy: Truncated character worker names are no longer fatal + errors. PR53218. [Jim Jagielski] + + *) mod_dav: Set r->status_line in dav_error_response. PR 55426. + + *) mod_proxy_http, mod_cache: Avoid (unlikely) accesses to freed memory. + [Yann Ylavic, Christophe Jaillet] + + *) http_protocol: fix logic in ap_method_list_(add|remove) in order: + - to correctly reset bits + - not to modify the 'method_mask' bitfield unnecessarily + [Christophe Jaillet] + + *) mod_slotmem_shm: Increase log level for some originally debug messages. + [Jim Jagielski] + + *) mod_ldap: In 2.4.10, some LDAP searches or comparisons might be done with + the wrong credentials when a backend connection is reused. + [Eric Covener] + + *) mod_macro: Add missing APLOGNO for some Warning log messages. + [Christophe Jaillet] + + *) mod_cache: Avoid sending 304 responses during failed revalidations + PR56881. [Eric Covener] + + *) mod_status: Honor client IP address using mod_remoteip. PR 55886. + [Jim Jagielski] + + *) cmake-based build for Windows: Fix incompatibility with cmake 2.8.12 + and later. PR 56615. [Chuck Liu , Jeff Trawick] + + *) mod_ratelimit: Drop severity of AH01455 and AH01457 (ap_pass_brigade + failed) messages from ERROR to TRACE1. Other filters do not bother + re-reporting failures from lower level filters. PR56832. [Eric Covener] + + *) core: Avoid useless warning message when parsing a section guarded by + if $(foo) is used within the section. + PR 56503 [Christophe Jaillet] + + *) mod_proxy_fcgi: Fix faulty logging of large amounts of stderr from the + application. PR 56858. [Manuel Mausz ] + + *) mod_proxy_http: Proxy responses with error status and + "ProxyErrorOverride On" hang until proxy timeout. + PR53420 [Rainer Jung] + + *) mod_log_config: Allow three character log formats to be registered. For + backwards compatibility, the first character of a three-character format + must be the '^' (caret) character. [Eric Covener] + + *) mod_lua: Don't quote Expires and Path values. PR 56734. + [Keith Mashinter, ] + + *) mod_authz_core: Allow 'es to be seen from auth + stanzas under virtual hosts. PR 56870. [Eric Covener] + +Changes with Apache 2.4.10 + + *) SECURITY: CVE-2014-0117 (cve.mitre.org) + mod_proxy: Fix crash in Connection header handling which allowed a denial + of service attack against a reverse proxy with a threaded MPM. + [Ben Reser] + + *) SECURITY: CVE-2014-3523 (cve.mitre.org) + Fix a memory consumption denial of service in the WinNT MPM, used in all + Windows installations. Workaround: AcceptFilter {none|connect} + [Jeff Trawick] + + *) SECURITY: CVE-2014-0226 (cve.mitre.org) + Fix a race condition in scoreboard handling, which could lead to + a heap buffer overflow. [Joe Orton, Eric Covener] + + *) SECURITY: CVE-2014-0118 (cve.mitre.org) + mod_deflate: The DEFLATE input filter (inflates request bodies) now + limits the length and compression ratio of inflated request bodies to + avoid denial of service via highly compressed bodies. See directives + DeflateInflateLimitRequestBody, DeflateInflateRatioLimit, + and DeflateInflateRatioBurst. [Yann Ylavic, Eric Covener] + + *) SECURITY: CVE-2014-0231 (cve.mitre.org) + mod_cgid: Fix a denial of service against CGI scripts that do + not consume stdin that could lead to lingering HTTPD child processes + filling up the scoreboard and eventually hanging the server. By + default, the client I/O timeout (Timeout directive) now applies to + communication with scripts. The CGIDScriptTimeout directive can be + used to set a different timeout for communication with scripts. + [Rainer Jung, Eric Covener, Yann Ylavic] + + *) mod_ssl: Extend the scope of SSLSessionCacheTimeout to sessions + resumed by TLS session resumption (RFC 5077). [Rainer Jung] + + *) mod_deflate: Don't fail when flushing inflated data to the user-agent + and that coincides with the end of stream ("Zlib error flushing inflate + buffer"). PR 56196. [Christoph Fausak ] + + *) mod_proxy_ajp: Forward local IP address as a custom request attribute + like we already do for the remote port. [Rainer Jung] + + *) core: Include any error notes set by modules in the canned error + response for 403 errors. [Jeff Trawick] + + *) mod_ssl: Set an error note for requests rejected due to + SSLStrictSNIVHostCheck. [Jeff Trawick] + + *) mod_ssl: Fix issue with redirects to error documents when handling + SNI errors. [Jeff Trawick] + + *) mod_ssl: Fix tmp DH parameter leak, adjust selection to prefer + larger keys and support up to 8192-bit keys. [Ruediger Pluem, + Joe Orton] + + *) mod_dav: Fix improper encoding in PROPFIND responses. PR 56480. + [Ben Reser] + + *) WinNT MPM: Improve error handling for termination events in child. + [Jeff Trawick] + + *) mod_proxy: When ping/pong is configured for a worker, don't send or + forward "100 Continue" (interim) response to the client if it does + not expect one. [Yann Ylavic] + + *) mod_ldap: Be more conservative with the last-used time for + LDAPConnectionPoolTTL. PR54587 [Eric Covener] + + *) mod_ldap: LDAP connections used for authn were not respecting + LDAPConnectionPoolTTL. PR54587 [Eric Covener] + + *) mod_proxy_fcgi: Fix occasional high CPU when handling request bodies. + [Jeff Trawick] + + *) event MPM: Fix possible crashes (third-party modules accessing c->sbh) + or occasional missed mod_status updates under load. PR 56639. + [Edward Lu ] + + *) mod_authnz_ldap: Support primitive LDAP servers do not accept + filters, such as "SDBM-backed LDAP" on z/OS, by allowing a special + filter "none" to be specified in AuthLDAPURL. [Eric Covener] + + *) mod_deflate: Fix inflation of files larger than 4GB. PR 56062. + [Lukas Bezdicka ] + + *) mod_deflate: Handle Zlib header and validation bytes received in multiple + chunks. PR 46146. [Yann Ylavic] + + *) mod_proxy: Allow reverse-proxy to be set via explicit handler. + [ryo takatsuki ] + + *) ab: support custom HTTP method with -m argument. PR 56604. + [Roman Jurkov ] + + *) mod_proxy_balancer: Correctly encode user provided data in management + interface. PR 56532 [Maksymilian, ] + + *) mod_proxy: Don't limit the size of the connectable Unix Domain Socket + paths. [Graham Dumpleton, Christophe Jaillet, Yann Ylavic] + + *) mod_proxy_fcgi: Support iobuffersize parameter. [Jeff Trawick] + + *) event: Send the SSL close notify alert when the KeepAliveTimeout + expires. PR54998. [Yann Ylavic] + + *) mod_ssl: Ensure that the SSL close notify alert is flushed to the client. + PR54998. [Tim Kosse , Yann Ylavic] + + *) mod_proxy: Shutdown (eg. SSL close notify) the backend connection before + closing. [Yann Ylavic] + + *) mod_auth_form: Add a debug message when the fields on a form are not + recognised. [Graham Leggett] + + *) mod_cache: Preserve non-cacheable headers forwarded from an origin 304 + response. PR 55547. [Yann Ylavic] + + *) mod_proxy_wstunnel: Fix the use of SSL connections with the "wss:" + scheme. PR55320. [Alex Liu ] + + *) mod_socache_shmcb: Correct counting of expirations for status display. + Expirations happening during retrieval were not counted. [Rainer Jung] + + *) mod_cache: Retry unconditional request with the full URL (including the + query-string) when the origin server's 304 response does not match the + conditions used to revalidate the stale entry. [Yann Ylavic]. + + *) mod_alias: Stop setting CONTEXT_PREFIX and CONTEXT_DOCUMENT environment + variables as a result of AliasMatch. [Eric Covener] + + *) mod_cache: Don't add cached/revalidated entity headers to a 304 response. + PR 55547. [Yann Ylavic] + + *) mod_proxy_scgi: Support Unix sockets. ap_proxy_port_of_scheme(): + Support default SCGI port (4000). [Jeff Trawick] + + *) mod_cache: Fix AH00784 errors on Windows when the the CacheLock directive + is enabled. [Eric Covener] + + *) mod_expires: don't add Expires header to error responses (4xx/5xx), + be they generated or forwarded. PR 55669. [Yann Ylavic] + + *) mod_proxy_fcgi: Don't segfault when failing to connect to the backend. + (regression in 2.4.9 release) [Jeff Trawick] + + *) mod_authn_socache: Fix crash at startup in certain configurations. + PR 56371. (regression in 2.4.7) [Jan Kaluza] + + *) mod_ssl: restore argument structure for "exec"-type SSLPassPhraseDialog + programs to the form used in releases up to 2.4.7, and emulate + a backwards-compatible behavior for existing setups. [Kaspar Brand] + + *) mod_ssl: Add SSLOCSPUseRequestNonce directive to control whether or not + OCSP requests should use a nonce to be checked against the responder's + one. PR 56233. [Yann Ylavic, Kaspar Brand] + + *) mod_ssl: "SSLEngine off" will now override a Listen-based default + and does disable mod_ssl for the vhost. [Joe Orton] + + *) mod_lua: Enforce the max post size allowed via r:parsebody() + [Daniel Gruno] + + *) mod_lua: Use binary comparison to find boundaries for multipart + objects, as to not terminate our search prematurely when hitting + a NULL byte. [Daniel Gruno] + + *) mod_ssl: add workaround for SSLCertificateFile when using OpenSSL + versions before 0.9.8h and not specifying an SSLCertificateChainFile + (regression introduced with 2.4.8). PR 56410. [Kaspar Brand] + + *) mod_ssl: bring SNI behavior into better conformance with RFC 6066: + no longer send warning-level unrecognized_name(112) alerts, + and limit startup warnings to cases where an OpenSSL version + without TLS extension support is used. PR 56241. [Kaspar Brand] + + *) mod_proxy_html: Avoid some possible memory access violation in case of + specially crafted files, when the ProxyHTMLMeta directive is turned on. + Follow up of PR 56287 [Christophe Jaillet] + + *) mod_auth_form: Make sure the optional functions are loaded even when + the AuthFormProvider isn't specified. [Graham Leggett] + + *) mod_ssl: avoid processing bogus SSLCertificateKeyFile values + (and logging garbled file names). PR 56306. [Kaspar Brand] + + *) mod_ssl: fix merging of global and vhost-level settings with the + SSLCertificateFile, SSLCertificateKeyFile, and SSLOpenSSLConfCmd + directives. PR 56353. [Kaspar Brand] + + *) mod_headers: Allow the "value" parameter of Header and RequestHeader to + contain an ap_expr expression if prefixed with "expr=". [Eric Covener] + + *) rotatelogs: Avoid creation of zombie processes when -p is used on + Unix platforms. [Joe Orton] + + *) mod_authnz_fcgi: New module to enable FastCGI authorizer + applications to authenticate and/or authorize clients. + [Jeff Trawick] + + *) mod_proxy: Do not try to parse the regular expressions passed by + ProxyPassMatch as URL as they do not follow their syntax. + PR 56074. [Ruediger Pluem] + + *) mod_reqtimeout: Resolve unexpected timeouts on keepalive requests + under the Event MPM. PR56216. [Frank Meier ] + + *) mod_proxy_fcgi: Fix sending of response without some HTTP headers + that might be set by filters. PR 55558. [Jim Riggs ] + + *) mod_proxy_html: Do not delete the wrong data from HTML code when a + "http-equiv" meta tag specifies a Content-Type behind any other + "http-equiv" meta tag. PR 56287 [Micha Lenk ] + + *) mod_proxy: Don't reuse a SSL backend connection whose requested SNI + differs. PR 55782. [Yann Ylavic] + + *) Add suspend_connection and resume_connection hooks to notify modules + when the thread/connection relationship changes. (Should be implemented + for any third-party async MPMs.) [Jeff Trawick] + + *) mod_proxy_wstunnel: Don't issue AH02447 and log a 500 on routine + hangups from websockets origin servers. PR 56299 + [Yann Ylavic, Edward Lu , Eric Covener] + + *) mod_proxy_wstunnel: Don't pool backend websockets connections, + because we need to handshake every time. PR 55890. + [Eric Covener] + + *) mod_lua: Redesign how request record table access behaves, + in order to utilize the request record from within these tables. + [Daniel Gruno] + + *) mod_lua: Add r:wspeek for peeking at WebSocket frames. [Daniel Gruno] + + *) mod_lua: Log an error when the initial parsing of a Lua file fails. + [Daniel Gruno, Felipe Daragon ] + + *) mod_lua: Reformat and escape script error output. + [Daniel Gruno, Felipe Daragon ] + + *) mod_lua: URL-escape cookie keys/values to prevent tainted cookie data + from causing response splitting. + [Daniel Gruno, Felipe Daragon ] + + *) mod_lua: Disallow newlines in table values inside the request_rec, + to prevent HTTP Response Splitting via tainted headers. + [Daniel Gruno, Felipe Daragon ] + + *) mod_lua: Remove the non-working early/late arguments for + LuaHookCheckUserID. [Daniel Gruno] + + *) mod_lua: Change IVM storage to use shm [Daniel Gruno] + + *) mod_lua: More verbose error logging when a handler function cannot be + found. [Daniel Gruno] + +Changes with Apache 2.4.9 + + *) mod_ssl: Work around a bug in some older versions of OpenSSL that + would cause a crash in SSL_get_certificate for servers where the + certificate hadn't been sent. [Stephen Henson] + + *) mod_lua: Add a fixups hook that checks if the original request is intended + for LuaMapHandler. This fixes a bug where FallbackResource invalidates the + LuaMapHandler directive in certain cases by changing the URI before the map + handler code executes [Daniel Gruno, Daniel Ferradal ]. + +Changes with Apache 2.4.8 (not released) + + *) SECURITY: CVE-2014-0098 (cve.mitre.org) + Clean up cookie logging with fewer redundant string parsing passes. + Log only cookies with a value assignment. Prevents segfaults when + logging truncated cookies. + [William Rowe, Ruediger Pluem, Jim Jagielski] + + *) SECURITY: CVE-2013-6438 (cve.mitre.org) + mod_dav: Keep track of length of cdata properly when removing + leading spaces. Eliminates a potential denial of service from + specifically crafted DAV WRITE requests + [Amin Tora ] + + *) core: Support named groups and backreferences within the LocationMatch, + DirectoryMatch, FilesMatch and ProxyMatch directives. (Requires + non-ancient PCRE library) [Graham Leggett] + + *) core: draft-ietf-httpbis-p1-messaging-23 corrections regarding + TE/CL conflicts. [Yann Ylavic, Jim Jagielski] + + *) core: Detect incomplete request and response bodies, log an error and + forward it to the underlying filters. PR 55475 [Yann Ylavic] + + *) mod_dir: Add DirectoryCheckHandler to allow a 2.2-like behavior, skipping + execution when a handler is already set. PR53929. [Eric Covener] + + *) mod_ssl: Do not perform SNI / Host header comparison in case of a + forward proxy request. [Ruediger Pluem] + + *) mod_ssl: Remove the hardcoded algorithm-type dependency for the + SSLCertificateFile and SSLCertificateKeyFile directives, to enable + future algorithm agility, and deprecate the SSLCertificateChainFile + directive (obsoleted by SSLCertificateFile). [Kaspar Brand] + + *) mod_rewrite: Add RewriteOptions InheritDown, InheritDownBefore, + and IgnoreInherit to allow RewriteRules to be pushed from parent scopes + to child scopes without explicitly configuring each child scope. + PR56153. [Edward Lu ] + + *) prefork: Fix long delays when doing a graceful restart. + PR 54852 [Jim Jagielski, Arkadiusz Miskiewicz ] + + *) FreeBSD: Disable IPv4-mapped listening sockets by default for versions + 5+ instead of just for FreeBSD 5. PR 53824. [Jeff Trawick] + + *) mod_proxy_wstunnel: Avoid busy loop on client errors, drop message + IDs 02445, 02446, and 02448 to TRACE1 from DEBUG. PR 56145. + [Joffroy Christen , Eric Covener] + + *) mod_remoteip: Correct the trusted proxy match test. PR 54651. + [Yoshinori Ehara , Eugene L ] + + *) mod_proxy_fcgi: Fix error message when an unexpected protocol version + number is received from the application. PR 56110. [Jeff Trawick] + + *) mod_remoteip: Use the correct IP addresses to populate the proxy_ips field. + PR 55972. [Mike Rumph] + + *) mod_lua: Update r:setcookie() to accept a table of options and add domain, + path and httponly to the list of options available to set. + PR 56128 [Edward Lu , Daniel Gruno] + + *) mod_lua: Fix r:setcookie() to add, rather than replace, + the Set-Cookie header. PR56105 + [Kevin J Walters , Edward Lu ] + + *) mod_lua: Allow for database results to be returned as a hash with + row-name/value pairs instead of just row-number/value. [Daniel Gruno] + + *) mod_rewrite: Add %{CONN_REMOTE_ADDR} as the non-useragent counterpart to + %{REMOTE_ADDR}. PR 56094. [Edward Lu ] + + *) WinNT MPM: If ap_run_pre_connection() fails or sets c->aborted, don't + save the socket for reuse by the next worker as if it were an + APR_SO_DISCONNECTED socket. Restores 2.2 behavior. [Eric Covener] + + *) mod_dir: Don't search for a DirectoryIndex or DirectorySlash on a URL + that was just rewritten by mod_rewrite. PR53929. [Eric Covener] + + *) mod_session: When we have a session we were unable to decode, + behave as if there was no session at all. [Thomas Eckert + ] + + *) mod_session: Fix problems interpreting the SessionInclude and + SessionExclude configuration. PR 56038. [Erik Pearson + ] + + *) mod_authn_core: Allow 'es to be seen from auth + stanzas under virtual hosts. PR 55622. [Eric Covener] + + *) mod_proxy_fcgi: Use apr_socket_timeout_get instead of hard-coded + 30 seconds timeout. [Jan Kaluza] + + *) build: only search for modules (config*.m4) in known subdirectories, see + build/config-stubs. [Stefan Fritsch] + + *) mod_cache_disk: Fix potential hangs on Windows when using mod_cache_disk. + PR 55833. [Eric Covener] + + *) mod_ssl: Add support for OpenSSL configuration commands by introducing + the SSLOpenSSLConfCmd directive. [Stephen Henson, Kaspar Brand] + + *) mod_proxy: Remove (never documented) syntax which + is equivalent to . [Christophe Jaillet] + + *) mod_authz_user, mod_authz_host, mod_authz_groupfile, mod_authz_dbm, + mod_authz_dbd, mod_authnz_ldap: Support the expression parser within the + require directives. [Graham Leggett] + + *) mod_proxy_http: Core dumped under high load. PR 50335. + [Jan Kaluza ] + + *) mod_socache_shmcb.c: Remove arbitrary restriction on shared memory size + previously limited to 64MB. [Jens Låås ] + + *) mod_lua: Use binary copy when dealing with uploads through r:parsebody() + to prevent truncating files. [Daniel Gruno] + +Changes with Apache 2.4.7 + + *) SECURITY: CVE-2013-4352 (cve.mitre.org) + mod_cache: Fix a NULL pointer deference which allowed untrusted + origin servers to crash mod_cache in a forward proxy + configuration. [Graham Leggett] + + *) APR 1.5.0 or later is now required for the event MPM. + + *) slotmem_shm: Error detection. [Jim Jagielski] + + *) event: Use skiplist data structure. [Jim Jagielski] + + *) event: Fail at startup with message AP02405 if the APR atomic + implementation is not compatible with the MPM. [Jim Jagielski] + + *) mpm_unix: Add ap_mpm_podx_* implementation to avoid code duplication + and align w/ trunk. [Jim Jagielski] + + *) Fix potential rejection of valid MaxMemFree and ThreadStackSize + directives. [Mike Rumph ] + + *) mod_proxy_fcgi: Remove 64K limit on encoded length of all envvars. + An individual envvar with an encoded length of more than 16K will be + omitted. [Jeff Trawick] + + *) mod_proxy_fcgi: Handle reading protocol data that is split between + packets. [Jeff Trawick] + + *) mod_ssl: Improve handling of ephemeral DH and ECDH keys by + allowing custom parameters to be configured via SSLCertificateFile, + and by adding standardized DH parameters for 1024/2048/3072/4096 bits. + Unless custom parameters are configured, the standardized parameters + are applied based on the certificate's RSA/DSA key size. [Kaspar Brand] + + *) mod_ssl, configure: Require OpenSSL 0.9.8a or later. [Kaspar Brand] + + *) mod_ssl: drop support for export-grade ciphers with ephemeral RSA + keys, and unconditionally disable aNULL, eNULL and EXP ciphers + (not overridable via SSLCipherSuite). [Kaspar Brand] + + *) mod_proxy: Added support for unix domain sockets as the + backend server endpoint. This also introduces an unintended + incompatibility for third party modules using the mod_proxy + proxy_worker_shared structure, especially for balancer lbmethod + modules. [Jim Jagielski, Blaise Tarr ] + + *) Add experimental cmake-based build system for Windows. [Jeff Trawick, + Tom Donovan] + + *) event MPM: Fix possible crashes (third party modules accessing c->sbh) + or occasional missed mod_status updates for some keepalive requests + under load. [Eric Covener] + + *) mod_authn_socache: Support optional initialization arguments for + socache providers. [Chris Darroch] + + *) mod_session: Reset the max-age on session save. PR 47476. [Alexey + Varlamov ] + + *) mod_session: After parsing the value of the header specified by the + SessionHeader directive, remove the value from the response. PR 55279. + [Graham Leggett] + + *) mod_headers: Allow for format specifiers in the substitution string + when using Header edit. [Daniel Ruggeri] + + *) mod_dav: dav_resource->uri is treated as unencoded. This was an + unnecessary ABI changed introduced in 2.4.6. PR 55397. + + *) mod_dav: Don't require lock tokens for COPY source. PR 55306. + + *) core: Don't truncate output when sending is interrupted by a signal, + such as from an exiting CGI process. PR 55643. [Jeff Trawick] + + *) WinNT MPM: Exit the child if the parent process crashes or is terminated. + [Oracle Corporation] + + *) Windows: Correct failure to discard stderr in some error log + configurations. (Error message AH00093) [Jeff Trawick] + + *) mod_session_crypto: Allow using exec: calls to obtain session + encryption key. [Daniel Ruggeri] + + *) core: Add missing Reason-Phrase in HTTP response headers. + PR 54946. [Rainer Jung] + + *) mod_rewrite: Make rewrite websocket-aware to allow proxying. + PR 55598. [Chris Harris ] + + *) mod_ldap: When looking up sub-groups, use an implicit objectClass=* + instead of an explicit cn=* filter. [David Hawes ] + + *) ab: Add wait time, fix processing time, and output write errors only if + they occurred. [Christophe Jaillet] + + *) worker MPM: Don't forcibly kill worker threads if the child process is + exiting gracefully. [Oracle Corporation] + + *) core: apachectl -S prints wildcard name-based virtual hosts twice. + PR54948 [Eric Covener] + + *) mod_auth_basic: Add AuthBasicUseDigestAlgorithm directive to + allow migration of passwords from digest to basic authentication. + [Chris Darroch] + + *) ab: Add a new -l parameter in order not to check the length of the responses. + This can be useful with dynamic pages. + PR9945, PR27888, PR42040 [] + + *) Suppress formatting of startup messages written to the console when + ErrorLogFormat is used. [Jeff Trawick] + + *) mod_auth_digest: Be more specific when the realm mismatches because the + realm has not been specified. [Graham Leggett] + + *) mod_proxy: Add a note in the balancer manager stating whether changes + will or will not be persisted and whether settings are inherited. + [Daniel Ruggeri, Jim Jagielski] + + *) core: Add util_fcgi.h and associated definitions and support + routines for FastCGI, based largely on mod_proxy_fcgi. + [Jeff Trawick] + + *) mod_headers: Add 'Header note header-name note-name' for copying a response + headers value into a note. [Eric Covener] + + *) mod_headers: Add 'setifempty' command to Header and RequestHeader. + [Eric Covener] + + *) mod_logio: new format-specifier %S (sum) which is the sum of received + and sent byte counts. + PR54015 [Christophe Jaillet] + + *) mod_deflate: Improve error detection when decompressing request bodies + with trailing garbage: handle case where trailing bytes are in + the same bucket. [Rainer Jung] + + *) mod_authz_groupfile, mod_authz_user: Reduce severity of AH01671 and AH01663 + from ERROR to DEBUG, since these modules do not know what mod_authz_core + is doing with their AUTHZ_DENIED return value. [Eric Covener] + + *) mod_ldap: add TRACE5 for LDAP retries. [Eric Covener] + + *) mod_ldap: retry on an LDAP timeout during authn. [Eric Covener] + + *) mod_ldap: Change "LDAPReferrals off" to actually set the underlying LDAP + SDK option to OFF, and introduce "LDAPReferrals default" to take the SDK + default, sans rebind authentication callback. + [Jan Kaluza ] + + *) core: Log a message at TRACE1 when the client aborts a connection. + [Eric Covener] + + *) WinNT MPM: Don't crash during child process initialization if the + Listen protocol is unrecognized. [Jeff Trawick] + + *) modules: Fix some compiler warnings. [Guenter Knauf] + + *) Sync 2.4 and trunk + - Avoid some memory allocation and work when TRACE1 is not activated + - fix typo in include guard + - indent + - No need to lower the string before removing the path, it is just + a waste of time... + - Save a few cycles + [Christophe Jaillet ] + + *) mod_filter: Add "change=no" as a proto-flag to FilterProtocol + to remove a providers initial flags set at registration time. + [Eric Covener] + + *) core, mod_ssl: Enable the ability for a module to reverse the sense of + a poll event from a read to a write or vice versa. This is a step on + the way to allow mod_ssl taking full advantage of the event MPM. + [Graham Leggett] + + *) Makefile.win: Install proper pcre DLL file during debug build install. + PR 55235. [Ben Reser ] + + *) mod_ldap: Fix a potential memory leak or corruption. PR 54936. + [Zhenbo Xu ] + + *) ab: Fix potential buffer overflows when processing the T and X + command-line options. PR 55360. + [Mike Rumph ] + + *) fcgistarter: Specify SO_REUSEADDR to allow starting a server + with old connections in TIME_WAIT. [Jeff Trawick] + + *) core: Add open_htaccess hook which, in conjunction with dirwalk_stat + and post_perdir_config (introduced in 2.4.5), allows mpm-itk to be + used without patches to httpd core. [Stefan Fritsch] + + *) support/htdbm: fix processing of -t command line switch. Regression + introduced in 2.4.4 + PR 55264 [Jo Rhett ] + + *) mod_lua: add websocket support via r:wsupgrade, r:wswrite, r:wsread + and r:wsping. [Daniel Gruno] + + *) mod_lua: add support for writing/reading cookies via r:getcookie and + r:setcookie. [Daniel Gruno] + + *) mod_lua: If the first yield() of a LuaOutputFilter returns a string, it should + be prefixed to the response as documented. [Eric Covener] + Note: Not present in 2.4.7 CHANGES + + *) mod_lua: Remove ETAG, Content-Length, and Content-MD5 when a LuaOutputFilter + is configured without mod_filter. [Eric Covener] + Note: Not present in 2.4.7 CHANGES + + *) mod_lua: Register LuaOutputFilter scripts as changing the content and + content-length by default, when run my mod_filter. Previously, + growing or shrinking a response that started with Content-Length set + would require mod_filter and FilterProtocol change=yes. [Eric Covener] + Note: Not present in 2.4.7 CHANGES + + *) mod_lua: Return a 500 error if a LuaHook* script doesn't return a + numeric return code. [Eric Covener] + Note: Not present in 2.4.7 CHANGES + +Changes with Apache 2.4.6 + + *) Revert a broken fix for PR54948 that was applied to 2.4.5 (which was + not released) and found post-2.4.5 tagging. + +Changes with Apache 2.4.5 + + *) SECURITY: CVE-2013-1896 (cve.mitre.org) + mod_dav: Sending a MERGE request against a URI handled by mod_dav_svn with + the source href (sent as part of the request body as XML) pointing to a + URI that is not configured for DAV will trigger a segfault. [Ben Reser + ] + + *) SECURITY: CVE-2013-2249 (cve.mitre.org) + mod_session_dbd: Make sure that dirty flag is respected when saving + sessions, and ensure the session ID is changed each time the session + changes. This changes the format of the updatesession SQL statement. + Existing configurations must be changed. + [Takashi Sato, Graham Leggett] + + *) mod_auth_basic: Add a generic mechanism to fake basic authentication + using the ap_expr parser. AuthBasicFake allows the administrator to + construct their own username and password for basic authentication based + on their needs. [Graham Leggett] + + *) mpm_event: Check that AsyncRequestWorkerFactor is not negative. PR 54254. + [Jackie Zhang ] + + *) mod_proxy: Ensure we don't attempt to amend a table we are iterating + through, ensuring that all headers listed by Connection are removed. + [Graham Leggett, Co-Advisor ] + + *) mod_proxy_http: Make the proxy-interim-response environment variable + effective by formally overriding origin server behaviour. [Graham + Leggett, Co-Advisor ] + + *) mod_proxy: Fix seg-faults when using the global pool on threaded + MPMs [Thomas Eckert , Graham Leggett, + Jim Jagielski] + + *) mod_deflate: Remove assumptions as to when an EOS bucket might arrive. + Gracefully step aside if the body size is zero. [Graham Leggett] + + *) mod_ssl: Fix possible truncation of OCSP responses when reading from the + server. [Joe Orton] + + *) core: Support the SINGLE_LISTEN_UNSERIALIZED_ACCEPT optimization + on Linux kernel versions 3.x and above. PR 55121. [Bradley Heilbrun + ] + + *) mod_cache_socache: Make sure the CacheSocacheMaxSize directive is merged + correctly. [Jens Låås ] + + *) rotatelogs: add -n number-of-files option to rotate through a number + of fixed-name logfiles. [Eric Covener] + + *) mod_proxy: Support web-socket tunnels via mod_proxy_wstunnel. + [Jim Jagielski] + + *) mod_cache_socache: Use the name of the socache implementation when performing + a lookup rather than using the raw arguments. [Martin Ksellmann + ] + + *) core: Add dirwalk_stat hook. [Jeff Trawick] + + *) core: Add post_perdir_config hook. + [Steinar Gunderson ] + + *) proxy_util: NULL terminate the right buffer in 'send_http_connect'. + [Christophe Jaillet] + + *) mod_remoteip: close file in error path. [Christophe Jaillet] + + *) core: make the "default" parameter of the "ErrorDocument" option case + insensitive. PR 54419 [Tianyin Xu ] + + *) mod_proxy_html: make the "ProxyHTMLFixups" options case insensitive. + PR 54420 [Tianyin Xu ] + + *) mod_cache: Make option "CacheDisable" in mod_cache case insensitive. + PR 54462 [Tianyin Xu ] + + *) mod_cache: If a 304 response indicates an entity not currently cached, then + the cache MUST disregard the response and repeat the request without the + conditional. [Graham Leggett, Co-Advisor ] + + *) mod_cache: Ensure that we don't attempt to replace a cached response + with an older response as per RFC2616 13.12. [Graham Leggett, Co-Advisor + ] + + *) core, mod_cache: Ensure RFC2616 compliance in ap_meets_conditions() + with weak validation combined with If-Range and Range headers. Break + out explicit conditional header checks to be useable elsewhere in the + server. Ensure weak validation RFC compliance in the byteranges filter. + Ensure RFC validation compliance when serving cached entities. PR 16142 + [Graham Leggett, Co-Advisor ] + + *) core: Add the ability to do explicit matching on weak and strong ETags + as per RFC2616 Section 13.3.3. [Graham Leggett, Co-Advisor + ] + + *) mod_cache: Ensure that updated responses to HEAD requests don't get + mistakenly paired with a previously cached body. Ensure that any existing + body is removed when a HEAD request is cached. [Graham Leggett, + Co-Advisor ] + + *) mod_cache: Honour Cache-Control: no-store in a request. [Graham Leggett] + + *) mod_cache: Make sure that contradictory entity headers present in a 304 + Not Modified response are caught and cause the entity to be removed. + [Graham Leggett] + + *) mod_cache: Make sure Vary processing handles multivalued Vary headers and + multivalued headers referred to via Vary. [Graham Leggett] + + *) mod_cache: When serving from cache, only the last header of a multivalued + header was taken into account. Fixed. Ensure that Warning headers are + correctly handled as per RFC2616. [Graham Leggett] + + *) mod_cache: Ignore response headers specified by no-cache=header and + private=header as specified by RFC2616 14.9.1 What is Cacheable. Ensure + that these headers are still processed when multiple Cache-Control + headers are present in the response. PR 54706 [Graham Leggett, + Yann Ylavic ] + + *) mod_cache: Invalidate cached entities in response to RFC2616 Section + 13.10 Invalidation After Updates or Deletions. PR 15868 [Graham + Leggett] + + *) mod_dav: Improve error handling in dav_method_put(), add new + dav_join_error() function. PR 54145. [Ben Reser ] + + *) mod_dav: Do not fail PROPPATCH when prop namespace is not known. + PR 52559 [Diego Santa Cruz ] + + *) mod_dav: When a PROPPATCH attempts to remove a non-existent dead + property on a resource for which there is no dead property in the same + namespace httpd segfaults. PR 52559 [Diego Santa Cruz + ] + + *) mod_dav: Sending an If or If-Match header with an invalid ETag doesn't + result in a 412 Precondition Failed for a COPY operation. PR54610 + [Timothy Wood ] + + *) mod_dav: Make sure that when we prepare an If URL for Etag comparison, + we compare unencoded paths. PR 53910 [Timothy Wood ] + + *) mod_deflate: Remove assumptions as to when an EOS bucket might arrive. + Gracefully step aside if the body size is zero. [Graham Leggett] + + *) 'AuthGroupFile' and 'AuthUserFile' do not accept anymore the optional + 'standard' keyword . It was unused and not documented. + PR54463 [Tianyin Xu and Christophe Jaillet] + + *) core: Do not over allocate memory within 'ap_rgetline_core' for + the common case. [Christophe Jaillet] + + *) core: speed up (for common cases) and reduce memory usage of + ap_escape_logitem(). This should save 70-100 bytes in the request + pool for a default config. [Christophe Jaillet] + + *) mod_dav: Ensure URI is correctly uriencoded on return. PR 54611 + [Timothy Wood ] + + *) mod_proxy: Reject invalid values for Max-Forwards. [Graham Leggett, + Co-Advisor ] + + *) mod_cache: RFC2616 14.9.3 The s-maxage directive also implies the + semantics of the proxy-revalidate directive. [Graham Leggett] + + *) mod_ssl: add support for subjectAltName-based host name checking + in proxy mode (SSLProxyCheckPeerName). PR 54030. [Kaspar Brand] + + *) core: Use the proper macro for HTTP/1.1. [Graham Leggett] + + *) event MPM: Provide error handling for ThreadStackSize. PR 54311 + [Tianyin Xu , Christophe Jaillet] + + *) mod_dav: Do not segfault on PROPFIND with a zero length DBM. + PR 52559 [Diego Santa Cruz ] + + *) core: Improve error message where client's request-line exceeds + LimitRequestLine. PR 54384 [Christophe Jaillet] + + *) mod_macro: New module that provides macros within configuration files. + [Fabien Coelho] + + *) mod_cache_socache: New cache implementation backed by mod_socache + that replaces mod_mem_cache known from httpd 2.2. [Graham + Leggett] + + *) htpasswd: Add -v option to verify a password. [Stefan Fritsch] + + *) mod_proxy: Add BalancerInherit and ProxyPassInherit to control + whether Proxy Balancers and Workers are inherited by vhosts + (default is On). [Jim Jagielski] + + *) mod_authnz_ldap: Allow using exec: calls to obtain LDAP bind + password. [Daniel Ruggeri] + + *) Added balancer parameter failontimeout to allow server admin + to configure an IO timeout as an error in the balancer. + [Daniel Ruggeri] + + *) mod_auth_digest: Fix crashes if shm initialization failed. [Stefan + Fritsch] + + *) htpasswd, htdbm: Fix password generation. PR 54735. [Stefan Fritsch] + + *) core: Add workaround for gcc bug on sparc/64bit. PR 52900. + [Stefan Fritsch] + + *) mod_setenvif: Fix crash in case SetEnvif and SetEnvIfExpr are used + together. PR 54881. [Ruediger Pluem] + + *) htdigest: Fix buffer overflow when reading digest password file + with very long lines. PR 54893. [Rainer Jung] + + *) ap_expr: Add the ability to base64 encode and base64 decode + strings and to generate their SHA1 and MD5 hash. + [Graham Leggett, Stefan Fritsch] + + *) mod_log_config: Fix crash when logging request end time for a failed + request. PR 54828 [Rainer Jung] + + *) mod_ssl: Catch missing, mismatched or encrypted client cert/key pairs + with SSLProxyMachineCertificateFile/Path directives. PR 52212, PR 54698. + [Keith Burdis , Joe Orton, Kaspar Brand] + + *) mod_ssl: Quiet FIPS mode weak keys disabled and FIPS not selected emits + in the error log to debug level. [William Rowe] + + *) mod_cache_disk: CacheMinFileSize and CacheMaxFileSize were always + using compiled in defaults of 1000000/1 respectively. [Eric Covener] + + *) mod_lbmethod_heartbeat, mod_heartmonitor: Respect DefaultRuntimeDir/ + DEFAULT_REL_RUNTIMEDIR for the heartbeat storage file. [Jeff Trawick] + + *) mod_include: Use new ap_expr for 'elif', like 'if', + if legacy parser is not specified. PR 54548 [Tom Donovan] + + *) mod_lua: Add some new functions: r:htpassword(), r:mkdir(), r:mkrdir(), + r:rmdir(), r:touch(), r:get_direntries(), r.date_parse_rfc(). + [Guenter Knauf] + + *) mod_lua: Add multipart form data handling. [Daniel Gruno] + + *) mod_lua: If a LuaMapHandler doesn't return any value, log a warning + and treat it as apache2.OK. [Eric Covener] + + *) mod_lua: Add bindings for apr_dbd/mod_dbd database access + [Daniel Gruno] + + *) mod_lua: Add LuaInputFilter/LuaOutputFilter for creating content + filters in Lua [Daniel Gruno] + + *) mod_lua: Allow scripts handled by the lua-script handler to return + a status code to the client (such as a 302 or a 500) [Daniel Gruno] + + *) mod_lua: Decline handling 'lua-script' if the file doesn't exist, + rather than throwing an internal server error. [Daniel Gruno] + + *) mod_lua: Add functions r:flush and r:sendfile as well as additional + request information to the request_rec structure. [Daniel Gruno] + + *) mod_lua: Add a server scope for Lua states, which creates a pool of + states with manageable minimum and maximum size. [Daniel Gruno] + + *) mod_lua: Add new directive, LuaMapHandler, for dynamically mapping + URIs to Lua scripts and functions using regular expressions. + [Daniel Gruno] + + *) mod_lua: Add new directive LuaCodeCache for controlling in-memory + caching of lua scripts. [Daniel Gruno] + +Changes with Apache 2.4.4 + + *) SECURITY: CVE-2012-3499 (cve.mitre.org) + Various XSS flaws due to unescaped hostnames and URIs HTML output in + mod_info, mod_status, mod_imagemap, mod_ldap, and mod_proxy_ftp. + [Jim Jagielski, Stefan Fritsch, Niels Heinen ] + + *) SECURITY: CVE-2012-4558 (cve.mitre.org) + XSS in mod_proxy_balancer manager interface. [Jim Jagielski, + Niels Heinen ] + + *) mod_dir: Add support for the value 'disabled' in FallbackResource. + [Vincent Deffontaines] + + *) mod_proxy_connect: Don't keepalive the connection to the client if the + backend closes the connection. PR 54474. [Pavel Mateja ] + + *) mod_lua: Add bindings for mod_dbd/apr_dbd database access. + [Daniel Gruno] + + *) mod_proxy: Allow for persistence of local changes made via the + balancer-manager between graceful/normal restarts and power + cycles. [Jim Jagielski] + + *) mod_proxy: Fix startup crash with mis-defined balancers. + PR 52402. [Jim Jagielski] + + *) --with-module: Fix failure to integrate them into some existing + module directories. PR 40097. [Jeff Trawick] + + *) htcacheclean: Fix potential segfault if "-p" is omitted. [Joe Orton] + + *) mod_proxy_http: Honour special value 0 (unlimited) of LimitRequestBody + PR 54435. [Pavel Mateja ] + + *) mod_proxy_ajp: Support unknown HTTP methods. PR 54416. + [Rainer Jung] + + *) htcacheclean: Fix list options "-a" and "-A". + [Rainer Jung] + + *) mod_slotmem_shm: Fix mistaken reset of num_free for restored shm. + [Jim Jagielski] + + *) mod_proxy: non-existence of byrequests is not an immediate error. + [Jim Jagielski] + + *) mod_proxy_balancer: Improve output of balancer-manager (re: Drn, + Dis, Ign, Stby). PR 52478 [Danijel ] + + *) configure: Fix processing of --disable-FEATURE for various features. + [Jeff Trawick] + + *) mod_dialup/mod_http: Prevent a crash in mod_dialup in case of internal + redirect. PR 52230. + + *) various modules, rotatelogs: Replace use of apr_file_write() with + apr_file_write_full() to prevent incomplete writes. PR 53131. + [Nicolas Viennot , Stefan Fritsch] + + *) ab: Support socket timeout (-s timeout). + [Guido Serra ] + + *) httxt2dbm: Correct length computation for the 'value' stored in the + DBM file. PR 47650 [jon buckybox com] + + *) core: Be more correct about rejecting directives that cannot work in + sections. [Stefan Fritsch] + + *) core: Fix directives like LogLevel that need to know if they are invoked + at virtual host context or in Directory/Files/Location/If sections to + work properly in If sections that are not in a Directory/Files/Location. + [Stefan Fritsch] + + *) mod_xml2enc: Fix problems with charset conversion altering the + Content-Length. [Micha Lenk ] + + *) ap_expr: Add req_novary function that allows HTTP header lookups + without adding the name to the Vary header. [Stefan Fritsch] + + *) mod_slotmem_*: Add in new fgrab() function which forces a grab and + slot allocation on a specified slot. Allow for clearing of inuse + array. [Jim Jagielski] + + *) mod_proxy_ftp: Fix segfaults on IPv4 requests to hosts with DNS + AAAA records. PR 40841. [Andrew Rucker Jones , , Jim Jagielski] + + *) mod_auth_form: Make sure that get_notes_auth() sets the user as does + get_form_auth() and get_session_auth(). Makes sure that REMOTE_USER + does not vanish during mod_include driven subrequests. [Graham + Leggett] + + *) mod_cache_disk: Resolve errors while revalidating disk-cached files on + Windows ("...rename tempfile to datafile failed..."). PR 38827 + [Eric Covener] + + *) mod_proxy_balancer: Bring XML output up to date. [Jim Jagielski] + + *) htpasswd, htdbm: Optionally read passwords from stdin, as more + secure alternative to -b. PR 40243. [Adomas Paltanavicius , Stefan Fritsch] + + *) htpasswd, htdbm: Add support for bcrypt algorithm (requires + apr-util 1.5 or higher). PR 49288. [Stefan Fritsch] + + *) htpasswd, htdbm: Put full 48bit of entropy into salt, improve + error handling. Add some of htpasswd's improvements to htdbm, + e.g. warn if password is truncated by crypt(). [Stefan Fritsch] + + *) mod_auth_form: Support the expr parser in the + AuthFormLoginRequiredLocation, AuthFormLoginSuccessLocation and + AuthFormLogoutLocation directives. [Graham Leggett] + + *) mod_ssl: Add support for TLS-SRP (Secure Remote Password key exchange + for TLS, RFC 5054). PR 51075. [Quinn Slack , + Christophe Renou, Peter Sylvester] + + *) mod_rewrite: Stop mergeing RewriteBase down to subdirectories + unless new option 'RewriteOptions MergeBase' is configured. + PR 53963. [Eric Covener] + + *) mod_header: Allow for exposure of loadavg and server load using new + format specifiers %l, %i, %b [Jim Jagielski] + + *) core: Make ap_regcomp() return AP_REG_ESPACE if out of memory. Make + ap_pregcomp() abort if out of memory. This raises the minimum PCRE + requirement to version 6.0. [Stefan Fritsch] + + *) mod_proxy: Add ability to configure the sticky session separator. + PR 53893. [, Jim Jagielski] + + *) mod_dumpio: Correctly log large messages + PR 54179 [Marek Wianecki ] + + *) core: Don't fail at startup with AH00554 when Include points to + a directory without any wildcard character. [Eric Covener] + + *) core: Fail startup if the argument to ServerTokens is unrecognized. + [Jackie Zhang ] + + *) mod_log_forensic: Don't log a spurious "-" if a request has been rejected + before mod_log_forensic could attach its id to it. [Stefan Fritsch] + + *) rotatelogs: Omit the second argument for the first invocation of + a post-rotate program when -p is used, per the documentation. + [Joe Orton] + + *) mod_session_dbd: fix a segmentation fault in the function dbd_remove. + PR 53452. [, Reimo Rebane] + + *) core: Functions to provide server load values: ap_get_sload() and + ap_get_loadavg(). [Jim Jagielski, Jan Kaluza , + Jeff Trawick] + + *) mod_ldap: Fix regression in handling "server unavailable" errors on + Windows. PR 54140. [Eric Covener] + + *) syslog logging: Remove stray ", referer" at the end of some messages. + [Jeff Trawick] + + *) "Iterate" directives: Report an error if no arguments are provided. + [Jeff Trawick] + + *) mod_ssl: Change default for SSLCompression to off, as compression + causes security issues in most setups. (The so called "CRIME" attack). + [Stefan Fritsch] + + *) ab: add TLS1.1/TLS1.2 options to -f switch, and adapt output + to more accurately report the negotiated protocol. PR 53916. + [Nicolás Pernas Maradei , Kaspar Brand] + + *) core: ErrorDocument now works for requests without a Host header. + PR 48357. [Jeff Trawick] + + *) prefork: Avoid logging harmless errors during graceful stop. + [Joe Orton, Jeff Trawick] + + *) mod_proxy: When concatting for PPR, avoid cases where we + concat ".../" and "/..." to create "...//..." [Jim Jagielski] + + *) mod_cache: Wrong content type and character set when + mod_cache serves stale content because of a proxy error. + PR 53539. [Rainer Jung, Ruediger Pluem] + + *) mod_proxy_ajp: Fix crash in packet dump code when logging + with LogLevel trace7 or trace8. PR 53730. [Rainer Jung] + + *) httpd.conf: Removed the configuration directives setting a bad_DNT + environment introduced in 2.4.3. The actual directives are commented + out in the default conf file. + + *) core: Apply length limit when logging Status header values. + [Jeff Trawick, Chris Darroch] + + *) mod_proxy_balancer: The nonce is only derived from the UUID iff + not set via the 'nonce' balancer param. [Jim Jagielski] + + *) mod_ssl: Match wildcard SSL certificate names in proxy mode. + PR 53006. [Joe Orton] + + *) Windows: Fix output of -M, -L, and similar command-line options + which display information about the server configuration. + [Jeff Trawick] + +Changes with Apache 2.4.3 + + *) SECURITY: CVE-2012-3502 (cve.mitre.org) + mod_proxy_ajp, mod_proxy_http: Fix an issue in back end + connection closing which could lead to privacy issues due + to a response mixup. PR 53727. [Rainer Jung] + + *) SECURITY: CVE-2012-2687 (cve.mitre.org) + mod_negotiation: Escape filenames in variant list to prevent a + possible XSS for a site where untrusted users can upload files to + a location with MultiViews enabled. [Niels Heinen ] + + *) mod_authnz_ldap: Don't try a potentially expensive nested groups + search before exhausting all AuthLDAPGroupAttribute checks on the + current group. PR 52464 [Eric Covener] + + *) mod_lua: Add new directive LuaAuthzProvider to allow implementing an + authorization provider in lua. [Stefan Fritsch] + + *) core: Be less strict when checking whether Content-Type is set to + "application/x-www-form-urlencoded" when parsing POST data, + or we risk losing data with an appended charset. PR 53698 + [Petter Berntsen ] + + *) httpd.conf: Added configuration directives to set a bad_DNT environment + variable based on User-Agent and to remove the DNT header field from + incoming requests when a match occurs. This currently has the effect of + removing DNT from requests by MSIE 10.0 because it deliberately violates + the current specification of DNT semantics for HTTP. [Roy T. Fielding] + + *) mod_socache_shmcb: Fix bus error due to a misalignment + in some 32 bit builds, especially on Solaris Sparc. + PR 53040. [Rainer Jung] + + *) mod_cache: Set content type in case we return stale content. + [Ruediger Pluem] + + *) Windows: Fix SSL failures on windows with AcceptFilter https none. + PR 52476. [Jeff Trawick] + + *) ab: Fix read failure when targeting SSL server. [Jeff Trawick] + + *) The following now respect DefaultRuntimeDir/DEFAULT_REL_RUNTIMEDIR: + - mod_auth_digest: shared memory file + [Jeff Trawick] + + *) htpasswd: Use correct file mode for checking if file is writable. + PR 45923. [Stefan Fritsch] + + *) mod_rewrite: Fix crash with dbd RewriteMaps. PR 53663. [Mikhail T. + ] + + *) mod_ssl: Add new directive SSLCompression to disable TLS-level + compression. PR 53219. [Björn Jacke , Stefan Fritsch] + + *) mod_lua: Add a few missing request_rec fields. Rename remote_ip to + client_ip to match conn_rec. [Stefan Fritsch] + + *) mod_lua: Change prototype of vm_construct, to work around gcc bug which + causes a segfault. PR 52779. [Dick Snippe ] + + *) mpm_event: Don't count connections in lingering close state when + calculating how many additional connections may be accepted. + [Stefan Fritsch] + + *) mod_ssl: If exiting during initialization because of a fatal error, + log a message to the main error log pointing to the appropriate + virtual host error log. [Stefan Fritsch] + + *) mod_proxy_ajp: Reduce memory usage in case of many keep-alive requests on + one connection. PR 52275. [Naohiro Ooiwa ] + + *) mod_proxy_balancer: Restore balancing after a failed worker has + recovered when using lbmethod_bybusyness. PR 48735. [Jeff Trawick] + + *) mod_setenvif: Compile some global regex only once during startup. + This should save some memory, especially with .htaccess. + [Stefan Fritsch] + + *) core: Add the port number to the vhost's name in the scoreboard. + [Stefan Fritsch] + + *) mod_proxy: Fix ProxyPassReverse for balancer configurations. + PR 45434. [Joe Orton] + + *) mod_lua: Add the parsebody function for parsing POST data. PR 53064. + [Daniel Gruno] + + *) apxs: Use LDFLAGS from config_vars.mk in addition to CFLAGS and CPPFLAGS. + [Stefan Fritsch] + + *) mod_proxy: Fix memory leak or possible corruption in ProxyBlock + implementation. [Ruediger Pluem, Joe Orton] + + *) mod_proxy: Check hostname from request URI against ProxyBlock list, + not forward proxy, if ProxyRemote* is configured. [Joe Orton] + + *) mod_proxy_connect: Avoid DNS lookup on hostname from request URI + if ProxyRemote* is configured. PR 43697. [Joe Orton] + + *) mpm_event, mpm_worker: Remain active amidst prevalent child process + resource shortages. [Jeff Trawick] + + *) Add "strict" and "warnings" pragmas to Perl scripts. [Rich Bowen] + + *) The following now respect DefaultRuntimeDir/DEFAULT_REL_RUNTIMEDIR: + - core: the scoreboard (ScoreBoardFile), pid file (PidFile), and + mutexes (Mutex) + [Jim Jagielski] + + *) ab: Fix bind() errors. [Joe Orton] + + *) mpm_event: Don't do a blocking write when starting a lingering close + from the listener thread. PR 52229. [Stefan Fritsch] + + *) mod_so: If a filename without slashes is specified for LoadFile or + LoadModule and the file cannot be found in the server root directory, + try to use the standard dlopen() search path. [Stefan Fritsch] + + *) mpm_event, mpm_worker: Fix cases where the spawn rate wasn't reduced + after child process resource shortages. [Jeff Trawick] + + *) mpm_prefork: Reduce spawn rate after a child process exits due to + unexpected poll or accept failure. [Jeff Trawick] + + *) core: Log value of Status header line in script responses rather + than the fixed header name. [Chris Darroch] + + *) mod_ssl: Fix handling of empty response from OCSP server. + [Jim Meyering , Joe Orton] + + *) mpm_event: Fix handling of MaxConnectionsPerChild. [Stefan Fritsch] + + *) mod_authz_core: If an expression in "Require expr" returns denied and + references %{REMOTE_USER}, trigger authentication and retry. PR 52892. + [Stefan Fritsch] + + *) core: Always log if LimitRequestFieldSize triggers. [Stefan Fritsch] + + *) mod_deflate: Skip compression if compression is enabled at SSL level. + [Stefan Fritsch] + + *) core: Add missing HTTP status codes registered with IANA. + [Julian Reschke , Rainer Jung] + + *) mod_ldap: Treat the "server unavailable" condition as a transient + error with all LDAP SDKs. [Filip Valder ] + + *) core: Fix spurious "not allowed here" error returned when the Options + directive is used in .htaccess and "AllowOverride Options" (with no + specific options restricted) is configured. PR 53444. [Eric Covener] + + *) mod_authz_core: Fix parsing of Require arguments in . + PR 53048. [Stefan Fritsch] + + *) mod_log_config: Fix %{abc}C truncating cookie values at first "=". + PR 53104. [Greg Ames] + + *) mod_ext_filter: Fix error_log spam when input filters are configured. + [Joe Orton] + + *) mod_rewrite: Add "AllowAnyURI" option. PR 52774. [Joe Orton] + + *) htdbm, htpasswd: Don't crash if crypt() fails (e.g. with FIPS enabled). + [Paul Wouters , Joe Orton] + + *) core: Use a TLS 1.0 close_notify alert for internal dummy connection if + the chosen listener is configured for https. [Joe Orton] + + *) mod_proxy: Use the the same hostname for SNI as for the HTTP request when + forwarding to SSL backends. PR 53134. + [Michael Weiser , Ruediger Pluem] + + *) mod_info: Display all registered providers. [Stefan Fritsch] + + *) mod_ssl: Send the error message for speaking http to an https port using + HTTP/1.0 instead of HTTP/0.9, and omit the link that may be wrong when + using SNI. PR 50823. [Stefan Fritsch] + + *) core: Fix segfault in logging if r->useragent_addr or c->client_addr is + unset. PR 53265. [Stefan Fritsch] + + *) log_server_status: Bring Perl style forward to the present, use + standard modules, update for new format of server-status output. + PR 45424. [Richard Bowen, Dave Brondsema, and others] + + *) mod_sed, mod_log_debug, mod_rewrite: Symbol namespace cleanups. + [Joe Orton, André Malo] + + *) core: Prevent "httpd -k restart" from killing server in presence of + config error. [Joe Orton] + + *) mod_proxy_fcgi: If there is an error reading the headers from the + backend, send an error to the client. PR 52879. [Stefan Fritsch] + +Changes with Apache 2.4.2 + + *) SECURITY: CVE-2012-0883 (cve.mitre.org) + envvars: Fix insecure handling of LD_LIBRARY_PATH that could lead to the + current working directory to be searched for DSOs. [Stefan Fritsch] + + *) mod_slotmem_shm: Honor DefaultRuntimeDir [Jim Jagielski] + + *) mod_ssl: Fix crash with threaded MPMs due to race condition when + initializing EC temporary keys. [Stefan Fritsch] + + *) mod_rewrite: Fix RewriteCond integer checks to be parsed correctly. + PR 53023. [Axel Reinhold , André Malo] + + *) mod_proxy: Add the forcerecovery balancer parameter that determines if + recovery for balancer workers is enforced. [Ruediger Pluem] + + *) Fix MPM DSO load failure on AIX. [Jeff Trawick] + + *) mod_proxy: Correctly set up reverse proxy worker. PR 52935. + [Petter Berntsen ] + + *) mod_sed: Don't define PATH_MAX to a potentially undefined value, causing + compile problems on GNU hurd. [Stefan Fritsch] + + *) core: Add ap_runtime_dir_relative() and DefaultRuntimeDir. + [Jeff Trawick] + + *) core: Fix breakage of Listen directives with MPMs that use a + per-directory config. PR 52904. [Stefan Fritsch] + + *) core: Disallow directives in AllowOverrideList which are only allowed + in VirtualHost or server context. These are usually not prepared to be + called in .htaccess files. [Stefan Fritsch] + + *) core: In AllowOverrideList, do not allow 'None' together with other + directives. PR 52823. [Stefan Fritsch] + + *) mod_slotmem_shm: Support DEFAULT_REL_RUNTIMEDIR for file-based shm. + [Jim Jagielski] + + *) core: Fix merging of AllowOverrideList and ContentDigest. + [Stefan Fritsch] + + *) mod_request: Fix validation of the KeptBodySize argument so it + doesn't always throw a configuration error. PR 52981 [Eric Covener] + + *) core: Add filesystem paths to access denied / access failed messages + AH00035 and AH00036. [Eric Covener] + + *) mod_dumpio: Properly handle errors from subsequent input filters. + PR 52914. [Stefan Fritsch] + + *) Unix MPMs: Fix small memory leak in parent process if connect() + failed when waking up children. [Joe Orton] + + *) "DirectoryIndex disabled" now undoes DirectoryIndex settings in + the current configuration section, not just previous config sections. + PR 52845. [Eric Covener] + + *) mod_xml2enc: Fix broken handling of EOS buckets which could lead to + response headers not being sent. PR 52766. [Stefan Fritsch] + + *) mod_ssl: Properly free the GENERAL_NAMEs. PR 32652. [Kaspar Brand] + + *) core: Check during config test that directories for the access + logs actually exist. PR 29941. [Stefan Fritsch] + + *) mod_xml2enc, mod_proxy_html: Enable per-module loglevels. + [Stefan Fritsch] + + *) mod_filter: Fix segfault with AddOutputFilterByType. PR 52755. + [Stefan Fritsch] + + *) mod_session: Sessions are encoded as application/x-www-form-urlencoded + strings, however we do not handle the encoding of spaces properly. + Fixed. [Graham Leggett] + + *) Configuration: Example in comment should use a path consistent + with the default configuration. PR 52715. + [Rich Bowen, Jens Schleusener, Rainer Jung] + + *) Configuration: Switch documentation links from trunk to 2.4. + [Rainer Jung] + + *) configure: Fix out of tree build using apr and apr-util in srclib. + [Rainer Jung] + +Changes with Apache 2.4.1 + + *) SECURITY: CVE-2012-0053 (cve.mitre.org) + Fix an issue in error responses that could expose "httpOnly" cookies + when no custom ErrorDocument is specified for status code 400. + [Eric Covener] + + *) mod_proxy_balancer: Fix crash on Windows. PR 52402 [Mladen Turk] + + *) core: Check during configtest that the directories for error logs exist. + PR 29941 [Stefan Fritsch] + + *) Core configuration: add AllowOverride option to treat syntax + errors in .htaccess as non-fatal. PR 52439 [Nick Kew, Jim Jagielski] + + *) core: Fix memory consumption in core output filter with streaming + bucket types like CGI or PIPE. [Joe Orton, Stefan Fritsch] + + *) configure: Disable modules at configure time if a prerequisite module + is not enabled. PR 52487. [Stefan Fritsch] + + *) Rewrite and proxy now decline what they don't support rather + than fail the request. [Joe Orton] + + *) Fix building against external apr plus apr-util if apr is not installed + in a system default path. [Rainer Jung] + + *) Doxygen fixes and improvements. [Joe Orton, Igor Galić] + + *) core: Fix building against PCRE 8.30 by switching from the obsolete + pcre_info() to pcre_fullinfo(). PR 52623 [Ruediger Pluem, Rainer Jung] + +Changes with Apache 2.4.0 + + *) SECURITY: CVE-2012-0031 (cve.mitre.org) + Fix scoreboard issue which could allow an unprivileged child process + to cause the parent to crash at shutdown rather than terminate + cleanly. [Joe Orton] + + *) mod_ssl: Fix compilation with xlc on AIX. PR 52394. [Stefan Fritsch] + + *) SECURITY: CVE-2012-0021 (cve.mitre.org) + mod_log_config: Fix segfault (crash) when the '%{cookiename}C' log format + string is in use and a client sends a nameless, valueless cookie, causing + a denial of service. The issue existed since version 2.2.17 and 2.3.3. + PR 52256. [Rainer Canavan ] + + *) mod_ssl: when compiled against OpenSSL 1.0.1 or later, allow explicit + control of TLSv1.1 and TLSv1.2 through the SSLProtocol directive. + [Kaspar Brand] + + *) mod_ssl: set OPENSSL_NO_SSL_INTERN when compiling against OpenSSL 1.0.1 + or later, to improve binary compatibility with future OpenSSL releases. + [Kaspar Brand] + + *) mod_mime: Don't arbitrarily bypass AddOutputFilter during a ProxyPass, + but then allow AddOutputFilter during a RewriteRule [P]. Make mod_mime + behave identically in both cases. PR52342. [Graham Leggett] + + *) Move ab, logresolve, httxt2dbm and apxs to bin from sbin, along with + corresponding man pages. [Graham Leggett] + + *) Distinguish properly between the bindir and sbindir directories when + installing binaries. Previously all binaries were silently installed to + sbindir, whether they were system administration commands or not. + [Graham Leggett] + +Changes with Apache 2.3.16 + + *) SECURITY: CVE-2011-4317 (cve.mitre.org) + Resolve additional cases of URL rewriting with ProxyPassMatch or + RewriteRule, where particular request-URIs could result in undesired + backend network exposure in some configurations. + [Joe Orton] + + *) core: Limit line length in .htaccess to 8K like in 2.2.x, to avoid + additional DoS potential. [Stefan Fritsch] + + *) core, all modules: Add unique tag to most error log messages. [Stefan + Fritsch] + + *) mod_socache_memcache: Change provider name from "mc" to "memcache" to + match module name. [Stefan Fritsch] + + *) mod_slotmem_shm: Change provider name from "shared" to "shm" to match + module name. [Stefan Fritsch] + + *) mod_ldap: Fix segfault with Solaris LDAP when enabling ldaps. This + requires an apr-util fix in which is available in apr-util >= 1.4.0. + PR 42682. [Stefan Fritsch] + + *) mod_rewrite: Add the AllowNoSlash RewriteOption, which makes it possible + for RewriteRules to be placed in .htaccess files that match the directory + with no trailing slash. PR 48304. + [Matthew Byng-Maddick ] + + *) mod_session_crypto: Add a SessionCryptoPassphraseFile directive so that + the administrator can hide the keys from the configuration. [Graham + Leggett] + + *) Introduce a per request version of the remote IP address, which can be + optionally modified by a module when the effective IP of the client + is not the same as the real IP of the client (such as a load balancer). + Introduce a per connection "peer_ip" and a per request "client_ip" to + distinguish between the raw IP address of the connection and the effective + IP address of the request. [Graham Leggett] + + *) ap_pass_brigade_fchk() function added. [Jim Jagielski] + + *) core: Pass ap_errorlog_info struct to error log hook. [Stefan Fritsch] + + *) mod_cache_disk: Make sure we check return codes on all writes and + attempts to close, and clean up after ourselves in these cases. + PR43589. [Graham Leggett] + + *) mod_cache_disk: Remove the unnecessary intermediate brigade while + writing to disk. Fixes a problem where mod_disk_cache was leaving + buckets in the intermediate brigade and not passing them to out on + exit. [Florian S. , Graham Leggett] + + *) mod_ssl: use a shorter setting for SSLCipherSuite in the default + default configuration file, and add some more information about + configuring a speed-optimized alternative. + [Kaspar Brand] + + *) mod_ssl: drop support for the SSLv2 protocol. [Kaspar Brand] + + *) mod_lua: Stop losing track of all but the most specific LuaHook* directives + when multiple per-directory config sections are used. Adds LuaInherit + directive to control how parent sections are merged. [Eric Covener] + + *) Server directive display (-L): Include directives of DSOs. + [Jeff Trawick] + + *) mod_cache: Make sure we merge headers correctly when we handle a + non cacheable conditional response. PR52120. [Graham Leggett] + + *) Pre GA removal of components that will not be included: + - mod_noloris was superseded by mod_reqtimeout + - mod_serf + - mpm_simple + [Rainer Jung] + + *) core: Set MaxMemFree 2048 by default. [Stefan Fritsch] + + *) mpm_event: Fix assertion failure during very high load. [Stefan Fritsch] + + *) configure: Additional modules loaded by default: mod_headers. + Modules moved from module set "few" to "most" and no longer loaded + by default: mod_actions, mod_allowmethods, mod_auth_form, mod_buffer, + mod_cgi(d), mod_include, mod_negotiation, mod_ratelimit, mod_request, + mod_userdir. [Rainer Jung] + + *) mod_lua: Use the right lua scope when used as a hook. [Rainer Jung] + + *) configure: Only load the really imporant modules (i.e. those enabled by + the 'few' selection) by default. Don't handle modules enabled with + --enable-foo specially. [Stefan Fritsch] + + *) end-generation hook: Fix false notification of end-of-generation for + temporary intervals with no active MPM children. [Jeff Trawick] + + *) mod_ssl: Add support for configuring persistent TLS session ticket + encryption/decryption keys (useful for clustered environments). + [Paul Querna, Kaspar Brand] + + *) mod_usertrack: Use random value instead of remote IP address. + [Stefan Fritsch] + +Changes with Apache 2.3.15 + + *) SECURITY: CVE-2011-3348 (cve.mitre.org) + mod_proxy_ajp: Respond with HTTP_NOT_IMPLEMENTED when the method is not + recognized. [Jean-Frederic Clere] + + *) SECURITY: CVE-2011-3192 (cve.mitre.org) + core: Fix handling of byte-range requests to use less memory, to avoid + denial of service. If the sum of all ranges in a request is larger than + the original file, ignore the ranges and send the complete file. + PR 51714. [Stefan Fritsch, Jim Jagielski, Ruediger Pluem, Eric Covener, + ] + + *) SECURITY: CVE-2011-3607 (cve.mitre.org) + core: Fix integer overflow in ap_pregsub. This can be triggered e.g. + with mod_setenvif via a malicious .htaccess. [Stefan Fritsch] + + *) SECURITY: CVE-2011-3368 (cve.mitre.org) + Reject requests where the request-URI does not match the HTTP + specification, preventing unexpected expansion of target URLs in + some reverse proxy configurations. [Joe Orton] + + *) configure: Load all modules in the generated default configuration + when using --enable-load-all-modules. [Rainer Jung] + + *) mod_reqtimeout: Change the default to set some reasonable timeout + values. [Stefan Fritsch] + + *) core, mod_dav_fs: Change default ETag to be "size mtime", i.e. remove + the inode. PR 49623. [Stefan Fritsch] + + *) mod_lua: Expose SSL variables via r:ssl_var_lookup(). [Eric Covener] + + *) mod_lua: LuaHook{AccessChecker,AuthChecker,CheckUserID,TranslateName} + can now additionally be run as "early" or "late" relative to other modules. + [Eric Covener] + + *) configure: By default, only load those modules that are either required + or explicitly selected by a configure --enable-foo argument. The + LoadModule statements for modules enabled by --enable-mods-shared=most + and friends will be commented out. [Stefan Fritsch] + + *) mod_lua: Prevent early Lua hooks (LuaHookTranslateName and + LuaHookQuickHandler) from being configured in , , + and htaccess where the configuration would have been ignored. + [Eric Covener] + + *) mod_lua: Resolve "attempt to index local 'r' (a userdata value)" errors + in LuaMapHandler scripts [Eric Covener] + + *) mod_log_debug: Rename optional argument from if= to expr=, to be more + in line with other config directives. [Stefan Fritsch] + + *) mod_headers: Require an expression to be specified with expr=, to be more + in line with other config directives. [Stefan Fritsch] + + *) mod_substitute: To prevent overboarding memory usage, limit line length + to 1MB. [Stefan Fritsch] + + *) mod_lua: Make the query string (r.args) writable. [Eric Covener] + + *) mod_include: Add support for application/x-www-form-urlencoded encoding + and decoding. [Graham Leggett] + + *) rotatelogs: Add -c option to force logfile creation in every rotation + interval, even if empty. [Jan Kaluža ] + + *) core: Limit ap_pregsub() to 64K, add ap_pregsub_ex() for longer strings. + [Stefan Fritsch] + + *) mod_session_crypto: Refactor to support the new apr_crypto API. + [Graham Leggett] + + *) http: Add missing Location header if local URL-path is used as + ErrorDocument for 30x. [Stefan Fritsch] + + *) mod_buffer: Make sure we step down for subrequests, but not for internal + redirects triggered by mod_rewrite. [Graham Leggett] + + *) mod_lua: add r:construct_url as a wrapper for ap_construct_url. + [Eric Covener] + + *) mod_remote_ip: Fix configuration of internal proxies. PR 49272. + [Jim Riggs ] + + *) mpm_winnt: Handle AcceptFilter 'none' mode correctly; resolve specific + server IP endpoint and remote client IP upon connection. [William Rowe] + + *) mod_setenvif: Remove OID match which is obsoleted by SetEnvIfExpr with + PeerExtList(). [Stefan Fritsch] + + *) mpm_prefork, mpm_worker, mpm_event: If a child is created just before + graceful restart and then exits because of a missing lock file, don't + shutdown the whole server. PR 39311. [Shawn Michael + ] + + *) mpm_event: Check the return value from ap_run_create_connection. + PR 41194. [Davi Arnaut] + + *) mod_mime_magic: Add signatures for PNG and SWF to the example config. + PR 48352. [Jeremy Wagner-Kaiser ] + + *) core, unixd: Add -D DUMP_RUN_CFG option to dump some configuration items + from the parsed (or default) config. This is useful for init scripts that + need to setup temporary directories and permissions. [Stefan Fritsch] + + *) core, mod_actions, mod_asis: Downgrade error log messages which accompany + a 404 request status from loglevel error to info. PR 35768. [Stefan + Fritsch] + + *) core: Fix hook sorting with Perl modules. PR 45076. [Torsten Foertsch + ] + + *) core: Enforce LimitRequestFieldSize after multiple headers with the same + name have been merged. [Stefan Fritsch] + + *) mod_ssl: If MaxMemFree is set, ask OpenSSL >= 1.0.0 to reduce memory + usage. PR 51618. [Cristian Rodríguez , + Stefan Fritsch] + + *) mod_ssl: At startup, when checking a server certificate whether it + matches the configured ServerName, also take dNSName entries in the + subjectAltName extension into account. PR 32652, PR 47051. [Kaspar Brand] + + *) mod_substitute: Reduce memory usage and copying of data. PR 50559. + [Stefan Fritsch] + + *) mod_ssl/proxy: enable the SNI extension for backend TLS connections + [Kaspar Brand] + + *) Add wrappers for malloc, calloc, realloc that check for out of memory + situations and use them in many places. PR 51568, PR 51569, PR 51571. + [Stefan Fritsch] + + *) Fix cross-compilation of mod_cgi/mod_cgid when APR_HAVE_STRUCT_RLIMIT is + false but RLIMIT_* are defined. PR51371. [Eric Covener] + + *) core: Correctly obey ServerName / ServerAlias if the Host header from the + request matches the VirtualHost address. + PR 51709. [Micha Lenk ] + + *) mod_unique_id: Use random number generator to initialize counter. + PR 45110. [Stefan Fritsch] + + *) core: Add convenience API for apr_random. [Stefan Fritsch] + + *) core: Add MaxRangeOverlaps and MaxRangeReversals directives to control + the number of overlapping and reversing ranges (respectively) permitted + before returning the entire resource, with a default limit of 20. + [Jim Jagielski] + + *) mod_ldap: Optional function uldap_ssl_supported(r) always returned false + if called from a virtual host with mod_ldap directives in it. Did not + affect mod_authnz_ldap's usage of mod_ldap. [Eric Covener] + + *) mod_filter: Instead of dropping the Accept-Ranges header when a filter + registered with AP_FILTER_PROTO_NO_BYTERANGE is present, + set the header value to "none". [Eric Covener, Ruediger Pluem] + + *) core: Allow MaxRanges none|unlimited|default and set 'Accept-Ranges: none' + in the case Ranges are being ignored with MaxRanges none. + [Eric Covener] + + *) mod_ssl: revamp CRL-based revocation checking when validating + certificates of clients or proxied servers. Completely delegate + CRL processing to OpenSSL, and add a new [Proxy]CARevocationCheck + directive for controlling the revocation checking mode. [Kaspar Brand] + + *) core: Add MaxRanges directive to control the number of ranges permitted + before returning the entire resource, with a default limit of 200. + [Eric Covener] + + *) mod_cache: Ensure that CacheDisable can correctly appear within + a LocationMatch. [Graham Leggett] + + *) mod_cache: Fix the moving of the CACHE filter, which erroneously + stood down if the original filter was not added by configuration. + [Graham Leggett] + + *) mod_ssl: improve certificate error logging. PR 47408. [Kaspar Brand] + + *) mod_authz_groupfile: Increase length limit of lines in the group file to + 16MB. PR 43084. [Stefan Fritsch] + + *) core: Increase length limit of lines in the configuration file to 16MB. + PR 45888. PR 50824. [Stefan Fritsch] + + *) core: Add API for resizable buffers. [Stefan Fritsch] + + *) mod_ldap: Enable LDAPConnectionTimeout for LDAP toolkits that have + LDAP_OPT_CONNECT_TIMEOUT instead of LDAP_OPT_NETWORK_TIMEOUT, such + as Tivoli Directory Server 6.3 and later. [Eric Covener] + + *) mod_ldap: Change default number of retries from 10 to 3, and add + an LDAPRetries and LDAPRetryDelay directives. [Eric Covener] + + *) mod_authnz_ldap: Don't retry during authentication, because this just + multiplies the ample retries already being done by mod_ldap. [Eric Covener] + + *) configure: Allow to explicitly disable modules even with module selection + 'reallyall'. [Stefan Fritsch] + + *) mod_rewrite: Check validity of each internal (int:) RewriteMap even if the + RewriteEngine is disabled in server context, avoiding a crash while + referencing the invalid int: map at runtime. PR 50994. + [Ben Noordhuis ] + + *) mod_ssl, configure: require OpenSSL 0.9.7 or later. [Kaspar Brand] + + *) mod_ssl: remove ssl_toolkit_compat layer. [Kaspar Brand] + + *) mod_ssl, configure, ab: drop support for RSA BSAFE SSL-C toolkit. + [Kaspar Brand] + + *) mod_usertrack: Run mod_usertrack earlier in the fixups hook to ensure the + cookie is set when modules such as mod_rewrite trigger a redirect. Also + use r->err_headers_out for the cookie, for the same reason. PR29755. + [Sami J. Mäkinen , Eric Covener] + + *) mod_proxy_http, mod_proxy_connect: Add 'proxy-status' and + 'proxy-source-port' request notes for logging. PR 30195. [Stefan Fritsch] + + *) configure: Enable ldap modules in 'all' and 'most' selections if ldap + is compiled into apr-util. [Stefan Fritsch] + + *) core: Add ap_check_cmd_context()-check if a command is executed in + .htaccess file. [Stefan Fritsch] + + *) mod_deflate: Fix endless loop if first bucket is metadata. PR 51590. + [Torsten Foertsch ] + + *) mod_authn_socache: Fix to work in .htaccess if not configured anywhere + in httpd.conf, and introduce an AuthnCacheEnable directive. + PR 51991 [Nick Kew] + + *) mod_xml2enc: new (formerly third-party) module supporting + internationalisation for filters via smart charset sniffing + and conversion. [Nick Kew] + + *) mod_proxy_html: new (formerly third-party) module to fix up + HTML links in a reverse proxy situation, where a backend + generates URLs that are not resolvable by Clients. [Nick Kew] + +Changes with Apache 2.3.14 + + *) mod_proxy_ajp: Improve trace logging. [Rainer Jung] + + *) mod_proxy_ajp: Respect "reuse" flag in END_REPONSE packets. + [Rainer Jung] + + *) mod_proxy: enable absolute URLs to be rewritten with ProxyPassReverse, + e.g. to reverse proxy "Location: https://other-internal-server/login" + [Nick Kew] + + *) prefork, worker, event: Make sure crashes are logged to the error log if + httpd has already detached from the console. [Stefan Fritsch] + + *) prefork, worker, event: Reduce period during startup/restart where a + successive signal may be lost. PR 43696. [Arun Bhalla ] + + *) mod_allowmethods: Correct Merging of "reset" and do not allow an + empty parameter list for the AllowMethods directive. [Rainer Jung] + + *) configure: Update selection of modules for 'all' and 'most'. 'all' will + now enable all modules except for example and test modules. Make the + selection for 'most' more useful (including ssl and proxy). Both 'all' + and 'most' will now disable modules if dependencies are missing instead + of aborting. If a specific module is requested with --enable-XXX=yes, + missing dependencies will still cause configure to exit with an error. + [Stefan Fritsch] + + *) mod_ldap: Revert the integration of apr-ldap as ap_ldap which was done + in 2.3.13. [Stefan Fritsch] + + *) core: For '*' or '_default_' vhosts, use a wildcard address of any + address family, rather than IPv4 only. [Joe Orton] + + *) core, mod_rewrite, mod_ssl, mod_nw_ssl: Make the SERVER_NAME variable + include [ ] for literal IPv6 addresses, as mandated by RFC 3875. + PR 26005. [Stefan Fritsch] + + *) mod_negotiation: Fix parsing of Content-Length in type maps. PR 42203. + [Nagae Hidetake ] + + *) core: Add more logging to ap_scan_script_header_err* functions. Add + ap_scan_script_header_err*_ex functions that take a module index for + logging. + mod_cgi, mod_cgid, mod_proxy_fcgi, mod_proxy_scgi, mod_isapi: Use the + new functions in order to make logging configurable per-module. + [Stefan Fritsch] + + *) mod_dir: Add DirectoryIndexRedirect to send an external redirect to + the proper index. [Eric Covener] + + *) mod_deflate: Don't try to compress requests with a zero sized body. + PR 51350. [Stefan Fritsch] + + *) core: Fix startup on IPv6-only systems. PR 50592. [Joe Orton, + ] + + *) suexec: Add environment variables CONTEXT_DOCUMENT_ROOT, CONTEXT_PREFIX, + REDIRECT_ERROR_NOTES, REDIRECT_SCRIPT_FILENAME, REQUEST_SCHEME to the + whitelist in suexec. PR 51499. [Graham Laverty , + Stefan Fritsch] + + *) mod_rewrite: Fix regexp RewriteCond with NoCase. [Stefan Fritsch] + + *) mod_log_debug: New module that allows to log custom messages at various + phases in the request processing. [Stefan Fritsch] + + *) mod_ssl: Add some debug logging when loading server certificates. + PR 37912. [Nick Burch ] + + *) configure: Support reallyall option also for --enable-mods-static. + [Rainer Jung] + + *) mod_socache_dc: add --with-distcache to configure for choosing + the distcache installation directory. [Rainer Jung] + + *) mod_socache_dc: use correct build variable MOD_SOCACHE_DC_LDADD + instead of MOD_SOCACHE_LDADD in build macro. [Rainer Jung] + + *) mod_lua, mod_deflate: respect platform specific runpath linker + flag. [Rainer Jung] + + *) configure: Only link the httpd binary against PCRE. No other support + binary needs PCRE. [Rainer Jung] + + *) configure: tolerate dependency checking failures for modules if + they have been enabled implicitly. [Rainer Jung] + + *) configure: Allow to specify module specific custom linker flags via + the MOD_XXX_LDADD variables. [Rainer Jung] + +Changes with Apache 2.3.13 + + *) ab: Support specifying the local address to use. PR 48930. + [Peter Schuller ] + + *) core: Add support to ErrorLogFormat for logging the system unique + thread id under Linux. [Stefan Fritsch] + + *) event: New AsyncRequestWorkerFactor directive to influence how many + connections will be accepted per process. [Stefan Fritsch] + + *) prefork, worker, event: Rename MaxClients to MaxRequestWorkers which + describes more accurately what it does. [Stefan Fritsch] + + *) rotatelogs: Add -p argument to specify custom program to invoke + after a log rotation. PR 51285. [Sven Ulland , + Joe Orton] + + *) mod_ssl: Don't do OCSP checks for valid self-issued certs. [Kaspar Brand] + + *) mod_ssl: Avoid unnecessary renegotiations with SSLVerifyDepth 0. + PR 48215. [Kaspar Brand] + + *) mod_status: Display information about asynchronous connections in the + server-status. PR 44377. [Stefan Fritsch] + + *) mpm_event: If the number of connections of a process is very high, or if + all workers are busy, don't accept new connections in that process. + [Stefan Fritsch] + + *) mpm_event: Process lingering close asynchronously instead of tying up + worker threads. [Jeff Trawick, Stefan Fritsch] + + *) mpm_event: If MaxMemFree is set, limit the number of pools that is kept + around. [Stefan Fritsch] + + *) mpm_event: Fix graceful restart aborting connections. PR 43359. + [Takashi Sato ] + + *) mod_ssl: Disable AECDH ciphers in example config. PR 51363. + [Rob Stradling ] + + *) core: Introduce new function ap_get_conn_socket() to access the socket of + a connection. [Stefan Fritsch] + + *) mod_data: Introduce a filter to support RFC2397 data URLs. [Graham + Leggett] + + *) mod_userdir/mod_alias/mod_vhost_alias: Correctly set DOCUMENT_ROOT, + CONTEXT_DOCUMENT_ROOT, CONTEXT_PREFIX. PR 26052. PR 46198. + [Stefan Fritsch] + + *) core: Allow to override document_root on a per-request basis. Introduce + new context_document_root and context_prefix which provide information + about non-global URI-to-directory mappings (from e.g. mod_userdir or + mod_alias) to scripts. PR 49705. [Stefan Fritsch] + + *) core: Add and to complement sections. + [Stefan Fritsch] + + *) mod_ext_filter: Remove DebugLevel option in favor of per-module loglevel. + [Stefan Fritsch] + + *) mod_include: Make the "#if expr" element use the new "ap_expr" expression + parser. The old parser can still be used by setting the new directive + SSILegacyExprParser. [Stefan Fritsch] + + *) core: Add some features to ap_expr for use by mod_include: a restricted + mode that does not allow to bypass request access restrictions; new + variables DOCUMENT_URI (alias for REQUEST_URI), LAST_MODIFIED; -A as an + alias for -U; an additional data entry in ap_expr_eval_ctx_t for use by + the consumer; an extensible ap_expr_exec_ctx() API that allows to use that + data entry. [Stefan Fritsch] + + *) mod_include: Merge directory configs instead of one SSI* config directive + causing all other per-directory SSI* config directives to be reset. + [Stefan Fritsch] + + *) mod_charset_lite: Remove DebugLevel option in favour of per-module + loglevel. [Stefan Fritsch] + + *) core: Add ap_regexec_len() function that works with non-null-terminated + strings. PR 51231. [Yehezkel Horowitz ] + + *) mod_authnz_ldap: If the LDAP server returns constraint violation, + don't treat this as an error but as "auth denied". [Stefan Fritsch] + + *) mod_proxy_fcgi|scgi: Add support for "best guess" of PATH_INFO + for SCGI/FCGI. PR 50880, 50851. [Mark Montague , + Jim Jagielski] + + *) mod_cache: When content is served stale, and there is no means to + revalidate the content using ETag or Last-Modified, and we have + mandated no stale-on-error behaviour, stand down and don't cache. + Saves a cache write that will never be read. + [Graham Leggett] + + *) mod_reqtimeout: Fix a timed out connection going into the keep-alive + state after a timeout when discarding a request body. PR 51103. + [Stefan Fritsch] + + *) core: Add various file existence test operators to ap_expr. + [Stefan Fritsch] + + *) mod_proxy_express: New mass reverse-proxy switch extension for + mod_proxy. [Jim Jagielski] + + *) configure: Fix script error when configuring module set "reallyall". + [Rainer Jung] + +Changes with Apache 2.3.12 + + *) configure, core: Provide easier support for APR's hook probe + capability. [Jim Jagielski, Jeff Trawick] + + *) Silence autoconf 2.68 warnings. [Rainer Jung] + + *) mod_authnz_ldap: Resolve crash when LDAP is used for authorization only + [Scott Hill ] + + *) support: Make sure check_forensic works with mod_unique_id loaded + [Joe Schaefer] + + *) Add child_status hook for tracking creation/termination of MPM child + processes. Add end_generation hook for notification when the last + MPM child of a generation exits. [Jeff Trawick] + + *) mod_ldap: Make LDAPSharedCacheSize 0 create a non-shared-memory cache per + process as opposed to disabling caching completely. This allows to use + the non-shared-memory cache as a workaround for the shared memory cache + not being available during graceful restarts. PR 48958. [Stefan Fritsch] + + *) Add new ap_reserve_module_slots/ap_reserve_module_slots_directive API, + necessary if a module (like mod_perl) registers additional modules late + in the startup phase. [Stefan Fritsch] + + *) core: Prevent segfault if DYNAMIC_MODULE_LIMIT is reached. PR 51072. + [Torsten Förtsch ] + + *) WinNT MPM: Improve robustness under heavy load. [Jeff Trawick] + + *) MinGW build improvements. PR 49535. [John Vandenberg + , Jeff Trawick] + + *) core: Support module names with colons in loglevel configuration. + [Torsten Förtsch ] + + *) mod_ssl, ab: Support OpenSSL compiled without SSLv2 support. + [Stefan Fritsch] + + *) core: Abort if the MPM is changed across restart. [Jeff Trawick] + + *) mod_proxy_ajp: Add support for 'ProxyErrorOverride on'. PR 50945. + [Peter Pramberger , Jim Jagielski] + + *) mod_proxy_fcgi: Add support for 'ProxyErrorOverride on'. PR 50913. + [Mark Montague , Jim Jagielski] + + *) core: Change the APIs of ap_cfg_getline() and ap_cfg_getc() to return an + error code. Abort with a nice error message if a config line is too long. + Partial fix for PR 50824. [Stefan Fritsch] + + *) mod_info: Dump config to stdout during startup if -DDUMP_CONFIG is + specified. PR 31956. [Stefan Fritsch] + + *) Restore visibility of DEFAULT_PIDLOG to core and modules. MPM + helper function ap_remove_pid() added. [Jeff Trawick] + + *) Enable DEFAULT_REL_RUNTIMEDIR on Windows and NetWare. [various] + + *) Correct C++ incompatibility with http_log.h. [Stefan Fritsch, Jeff + Trawick] + + *) mod_log_config: Prevent segfault. PR 50861. [Torsten Förtsch + ] + + *) core: AllowEncodedSlashes new option NoDecode to allow encoded slashes + in request URL path info but not decode them. Change behavior of option + "On" to decode the encoded slashes as 2.0 and 2.2 do. PR 35256, + PR 46830. [Dan Poirier] + + *) mod_ssl: Check SNI hostname against Host header case-insensitively. + PR 49491. [Mayank Agrawal ] + + *) mod_ldap: Add LDAPConnectionPoolTTL to give control over lifetime + of bound backend LDAP connections. PR47634 [Eric Covener] + + *) mod_cache: Make CacheEnable and CacheDisable configurable per + directory in addition to per server, making them work from within + a LocationMatch. [Graham Leggett] + + *) worker, event, prefork: Correct several issues when built as + DSOs; most notably, the scoreboard was reinitialized during graceful + restart, such that processes of the previous generation were not + observable. [Jeff Trawick] + +Changes with Apache 2.3.11 + + *) mod_win32: Added shebang check for '! so that .vbs scripts work as CGI. + Win32's cscript interpreter can only use a single quote as comment char. + [Guenter Knauf] + + *) mod_proxy: balancer-manager now uses POST instead of GET. + [Jim Jagielski] + + *) core: new util function: ap_parse_form_data(). Previously, + this capability was tucked away in mod_request. [Jim Jagielski] + + *) core: new hook: ap_run_pre_read_request. [Jim Jagielski] + + *) modules: Fix many modules that were not correctly initializing if they + were not active during server startup but got enabled later during a + graceful restart. [Stefan Fritsch] + + *) core: Create new ap_state_query function that allows modules to determine + if the current configuration run is the initial one at server startup, + and if the server is started for testing/config dumping only. + [Stefan Fritsch] + + *) mod_proxy: Runtime configuration of many parameters for existing + balancers via the balancer-manager. [Jim Jagielski] + + *) mod_proxy: Runtime addition of new workers (BalancerMember) for existing + balancers via the balancer-manager. [Jim Jagielski] + + *) mod_cache: When a bad Expires date is present, we need to behave as if + the Expires is in the past, not as if the Expires is missing. PR 16521. + [Co-Advisor ] + + *) mod_cache: We must ignore quoted-string values that appear in a + Cache-Control header. PR 50199. [Graham Leggett] + + *) mod_dav: Revert change to send 501 error if unknown Content-* header is + received for a PUT request. PR 42978. [Stefan Fritsch] + + *) mod_cache: Respect s-maxage as described by RFC2616 14.9.3, which must + take precedence if present. PR 35247. [Graham Leggett] + + *) mod_ssl: Fix a possible startup failure if multiple SSL vhosts + are configured with the same ServerName and private key file. + [Masahiro Matsuya , Joe Orton] + + *) mod_socache_dc: Make module compile by fixing some typos. + PR 50735 [Mark Montague ] + + *) prefork: Update MPM state in children during a graceful stop or + restart. PR 41743. [Andrew Punch ] + + *) mod_mime: Ignore leading dots when looking for mime extensions. + PR 50434 [Stefan Fritsch] + + *) core: Add support to set variables with the 'Define' directive. The + variables that can then be used in the config using the ${VAR} syntax + known from envvar interpolation. [Stefan Fritsch] + + *) mod_proxy_http: make adding of X-Forwarded-* headers configurable. + ProxyAddHeaders defaults to On. [Vincent Deffontaines] + + *) mod_slotmem_shm: Increase memory alignment for slotmem data. + [Rainer Jung] + + *) mod_ssl: Add config options for OCSP: SSLOCSPResponderTimeout, + SSLOCSPResponseMaxAge, SSLOCSPResponseTimeSkew. + [Kaspar Brand ] + + *) mod_ssl: Revamp output buffering to reduce network overhead for + output fragmented into many buckets, such as chunked HTTP responses. + [Joe Orton] + + *) core: Apply sections to all requests, not only to file base requests. + Allow to use inside , , and sections. + The merging of sections now happens after the merging of + sections, even if an section is embedded inside a or + section. [Stefan Fritsch] + + *) mod_proxy: Refactor usage of shared data by dropping the scoreboard + and using slotmem. Create foundation for dynamic growth/changes of + members within a balancer. Remove BalancerNonce in favor of a + per-balancer 'nonce' parameter. [Jim Jagielski] + + *) mod_status: Don't show slots which are disabled by MaxClients as open. + PR 47022 [Jordi Prats , Stefan Fritsch] + + *) mpm_prefork: Fix ap_mpm_query results for AP_MPMQ_MAX_DAEMONS and + AP_MPMQ_MAX_THREADS. + + *) mod_authz_core: Fix bug in merging logic if user-based and non-user-based + authorization directives were mixed. [Stefan Fritsch] + + *) mod_authn_socache: change directive name from AuthnCacheProvider + to AuthnCacheProvideFor. The term "provider" is overloaded in + this module, and we should avoid confusion between the provider + of a backend (AuthnCacheSOCache) and the authn provider(s) for + which this module provides cacheing (AuthnCacheProvideFor). + [Nick Kew] + + *) mod_proxy_http: Allocate the fake backend request from a child pool + of the backend connection, instead of misusing the pool of the frontend + request. Fixes a thread safety issue where buckets set aside in the + backend connection leak into other threads, and then disappear when + the frontend request is cleaned up, in turn causing corrupted buckets + to make other threads spin. [Graham Leggett] + + *) mod_ssl: Change the format of the SSL_{CLIENT,SERVER}_{I,S}_DN variables + to be RFC 2253 compatible, convert non-ASCII characters to UTF8, and + escape other special characters with backslashes. The old format can + still be used with the LegacyDNStringFormat argument to SSLOptions. + + *) core, mod_rewrite: Make the REQUEST_SCHEME variable available to + scripts and mod_rewrite. [Stefan Fritsch] + + *) mod_rewrite: Allow to use arbitrary boolean expressions (ap_expr) in + RewriteCond. [Stefan Fritsch] + + *) mod_rewrite: Allow to unset environment variables using E=!VAR. + PR 49512. [Mark Drayton , Stefan Fritsch] + + *) mod_headers: Restore the 2.3.8 and earlier default for the first + argument of the Header directive ("onsuccess"). [Eric Covener] + + *) core: Disallow the mixing of relative and absolute Options PR 33708. + [Sönke Tesch ] + + *) core: When exporting request headers to HTTP_* environment variables, + drop variables whose names contain invalid characters. Describe in the + docs how to restore the old behaviour. [Malte S. Stretz ] + + *) core: When selecting an IP-based virtual host, favor an exact match for + the port over a wildcard (or omitted) port instead of favoring the one + that came first in the configuration file. [Eric Covener] + + *) core: Overlapping virtual host address/port combinations now implicitly + enable name-based virtual hosting for that address. The NameVirtualHost + directive has no effect, and _default_ is interpreted the same as "*". + [Eric Covener] + + *) core: In the absence of any Options directives, the default is now + "FollowSymlinks" instead of "All". [Igor Galić] + + *) rotatelogs: Add -e option to write logs through to stdout for optional + further processing. [Graham Leggett] + + *) mod_ssl: Correctly read full lines in input filter when the line is + incomplete during first read. PR 50481. [Ruediger Pluem] + + *) mod_authz_core: Add AuthzSendForbiddenOnFailure directive to allow + sending '403 FORBIDDEN' instead of '401 UNAUTHORIZED' if authorization + fails for an authenticated user. PR 40721. [Stefan Fritsch] + +Changes with Apache 2.3.10 + + *) mod_rewrite: Don't implicitly URL-escape the original query string + when no substitution has changed it. PR 50447. [Eric Covener] + + *) core: Honor 'AcceptPathInfo OFF' during internal redirects, + such as per-directory mod_rewrite substitutions. PR 50349. + [Eric Covener] + + *) mod_rewrite: Add 'RewriteOptions InheritBefore' to put the base + rules/conditions before the overridden rules/conditions. PR 39313. + [Jérôme Grandjanny ] + + *) mod_autoindex: add IndexIgnoreReset to reset the list of IndexIgnored + filenames in higher precedence configuration sections. PR 24243. + [Eric Covener] + + *) mod_cgid: RLimit* directive support for mod_cgid. PR 42135 + [Eric Covener] + + *) core: Fail startup when the argument to ServerName looks like a glob + or a regular expression instead of a hostname (*?[]). PR 39863 + [Rahul Nair ] + + *) mod_userdir: Add merging of enable, disable, and filename arguments + to UserDir directive, leaving enable/disable of userlists unmerged. + PR 44076 [Eric Covener] + + *) httpd: When no -k option is provided on the httpd command line, the server + was starting without checking for an existing pidfile. PR 50350 + [Eric Covener] + + *) mod_proxy: Put the worker in error state if the SSL handshake with the + backend fails. PR 50332. + [Daniel Ruggeri , Ruediger Pluem] + + *) mod_cache_disk: Fix Windows build which was broken after renaming + the module. [Gregg L. Smith] + +Changes with Apache 2.3.9 + + *) SECURITY: CVE-2010-1623 (cve.mitre.org) + Fix a denial of service attack against mod_reqtimeout. + [Stefan Fritsch] + + *) mod_headers: Change default first argument of Header directive + from "onsuccess" to "always". [Eric Covener] + + *) mod_include: Add the onerror attribute to the include element, + allowing an URL to be specified to include on error. [Graham + Leggett] + + *) mod_cache_disk: mod_disk_cache renamed to mod_cache_disk, to be + consistent with the naming of other modules. [Graham Leggett] + + *) mod_setenvif: Add SetEnvIfExpr directive to set env var depending on + expression. [Stefan Fritsch] + + *) mod_proxy: Fix ProxyPassInterpolateEnv directive. PR 50292. + [Stefan Fritsch] + + *) suEXEC: Add Suexec directive to disable suEXEC without renaming the + binary (Suexec Off), or force startup failure if suEXEC is required + but not supported (Suexec On). Change SuexecUserGroup to fail + startup instead of just printing a warning if suEXEC is disabled. + [Jeff Trawick] + + *) core: Add Error directive for aborting startup or htaccess processing + with a specified error message. [Jeff Trawick] + + *) mod_rewrite: Fix the RewriteEngine directive to work within a + location. Previously, once RewriteEngine was switched on globally, + it was impossible to switch off. [Graham Leggett] + + *) core, mod_include, mod_ssl: Move the expression parser derived from + mod_include back into mod_include. Replace ap_expr with a parser + derived from mod_ssl's parser. Make mod_ssl use the new parser. Rework + ap_expr's public interface and provide hooks for modules to add variables + and functions. [Stefan Fritsch] + + *) core: Do the hook sorting earlier so that the hooks are properly sorted + for the pre_config hook and during parsing the config. [Stefan Fritsch] + + *) core: In the absence of any AllowOverride directives, the default is now + "None" instead of "All". PR49823 [Eric Covener] + + *) mod_proxy: Don't allow ProxyPass or ProxyPassReverse in + or . PR47765 [Eric Covener] + + *) prefork/worker/event MPMS: default value (when no directive is present) + of MaxConnectionsPerChild/MaxRequestsPerChild is changed to 0 from 10000 + to match default configuration and manual. PR47782 [Eric Covener] + + *) proxy_connect: Don't give up in the middle of a CONNECT tunnel + when the child process is starting to exit. PR50220. [Eric Covener] + + *) mod_autoindex: Fix inheritance of mod_autoindex directives into + contexts that don't have any mod_autoindex directives. PR47766. + [Eric Covener] + + *) mod_rewrite: Add END flag for RewriteRule to prevent further rounds + of rewrite processing when a per-directory substitution occurs. + [Eric Covener] + + *) mod_ssl: Make sure to always log an error if loading of CA certificates + fails. PR 40312. [Paul Tiemann ] + + *) mod_dav: Send 501 error if unknown Content-* header is received for a PUT + request (RFC 2616 9.6). PR 42978. [Stefan Fritsch] + + *) mod_dav: Send 400 error if malformed Content-Range header is received for + a put request (RFC 2616 14.16). PR 49825. [Stefan Fritsch] + + *) mod_proxy: Release the backend connection as soon as EOS is detected, + so the backend isn't forced to wait for the client to eventually + acknowledge the data. [Graham Leggett] + + *) mod_proxy: Optimise ProxyPass within a Location so that it is stored + per-directory, and chosen during the location walk. Make ProxyPass + work correctly from within a LocationMatch. [Graham Leggett] + + *) core: Fix segfault if per-module LogLevel is on virtual host + scope. PR 50117. [Stefan Fritsch] + + *) mod_proxy: Move the ProxyErrorOverride directive to have per + directory scope. [Graham Leggett] + + *) mod_allowmethods: New module to deny certain HTTP methods without + interfering with authentication/authorization. [Paul Querna, + Igor Galić, Stefan Fritsch] + + *) mod_ssl: Log certificate information and improve error message if client + cert verification fails. PR 50093, PR 50094. [Lassi Tuura , + Stefan Fritsch] + + *) htcacheclean: Teach htcacheclean to limit cache size by number of + inodes in addition to size of files. Prevents a cache disk from + running out of space when many small files are cached. + [Graham Leggett] + + *) core: Rename MaxRequestsPerChild to MaxConnectionsPerChild, which + describes more accurately what the directive does. The old name + still works but logs a warning. [Stefan Fritsch] + + *) mod_cache: Optionally serve stale data when a revalidation returns a + 5xx response, controlled by the CacheStaleOnError directive. + [Graham Leggett] + + *) htcacheclean: Allow the listing of valid URLs within the cache, with + the option to list entry metadata such as sizes and times. [Graham + Leggett] + + *) mod_cache: correctly parse quoted strings in cache headers. + PR 50199 [Nick Kew] + + *) mod_cache: Allow control over the base URL of reverse proxied requests + using the CacheKeyBaseURL directive, so that the cache key can be + calculated from the endpoint URL instead of the server URL. [Graham + Leggett] + + *) mod_cache: CacheLastModifiedFactor, CacheStoreNoStore, CacheStorePrivate, + CacheStoreExpired, CacheIgnoreNoLastMod, CacheDefaultExpire, + CacheMinExpire and CacheMaxExpire can be set per directory/location. + [Graham Leggett] + + *) mod_disk_cache: CacheMaxFileSize, CacheMinFileSize, CacheReadSize and + CacheReadTime can be set per directory/location. [Graham Leggett] + + *) core: Speed up config parsing if using a very large number of config + files. PR 50002 [andrew cloudaccess net] + + *) mod_cache: Support the caching of HEAD requests. [Graham Leggett] + + *) htcacheclean: Allow the option to round up file sizes to a given + block size, improving the accuracy of disk usage. [Graham Leggett] + + *) mod_ssl: Add authz providers for use with mod_authz_core and its + RequireAny/RequireAll containers: 'ssl' (equivalent to SSLRequireSSL), + 'ssl-verify-client' (for use with 'SSLVerifyClient optional'), and + 'ssl-require' (expressions with same syntax as SSLRequire). + [Stefan Fritsch] + + *) mod_ssl: Make the ssl expression parser thread-safe. It now requires + bison instead of yacc. [Stefan Fritsch] + + *) mod_disk_cache: Change on-disk header file format to support the + link of the device/inode of the data file to the matching header + file, and to support the option of not writing a data file when + the data file is empty. [Graham Leggett] + + *) core/mod_unique_id: Add generate_log_id hook to allow to use + the ID generated by mod_unique_id as error log ID for requests. + [Stefan Fritsch] + + *) mod_cache: Make sure that we never allow a 304 Not Modified response + that we asked for to leak to the client should the 304 response be + uncacheable. PR45341 [Graham Leggett] + + *) mod_cache: Add the cache_status hook to register the final cache + decision hit/miss/revalidate. Add optional support for an X-Cache + and/or an X-Cache-Detail header to add the cache status to the + response. PR48241 [Graham Leggett] + + *) mod_authz_host: Add 'local' provider that matches connections originating + on the local host. PR 19938. [Stefan Fritsch] + + *) Event MPM: Fix crash accessing pollset on worker thread when child + process is exiting. [Jeff Trawick] + + *) core: For process invocation (cgi, fcgid, piped loggers and so forth) + pass the system library path (LD_LIBRARY_PATH or platform-specific + variables) along with the system PATH, by default. Both should be + overridden together as desired using PassEnv etc; see mod_env. + [William Rowe] + + *) mod_cache: Introduce CacheStoreExpired, to allow administrators to + capture a stale backend response, perform If-Modified-Since requests + against the backend, and serving from the cache all 304 responses. + This restores pre-2.2.4 cache behavior. [William Rowe] + + *) mod_rewrite: Introduce <=, >= string comparison operators, and integer + comparators -lt, -le, -eq, -ge, and -gt. To help bash users and drop + the ambiguity of the symlink test "-ltest", introduce -h or -L as + symlink test operators. [William Rowe] + + *) mod_cache: Give the cache provider the opportunity to choose to cache + or not cache based on the buckets present in the brigade, such as the + presence of a FILE bucket. + [Graham Leggett] + + *) mod_authz_core: Allow authz providers to check args while reading the + config and allow to cache parsed args. Move 'all' and 'env' authz + providers from mod_authz_host to mod_authz_core. Add 'method' authz + provider depending on the HTTP method. [Stefan Fritsch] + + *) mod_include: Move the request_rec within mod_include to be + exposed within include_ctx_t. [Graham Leggett] + + *) mod_include: Reinstate support for UTF-8 character sets by allowing a + variable being echoed or set to be decoded and then encoded as separate + steps. PR47686 [Graham Leggett] + + *) mod_cache: Add a discrete commit_entity() provider function within the + mod_cache provider interface which is called to indicate to the + provider that caching is complete, giving the provider the opportunity + to commit temporary files permanently to the cache in an atomic + fashion. Replace the inconsistent use of error cleanups with a formal + set of pool cleanups attached to a subpool, which is destroyed on error. + [Graham Leggett] + + *) mod_cache: Change the signature of the store_body() provider function + within the mod_cache provider interface to support an "in" brigade + and an "out" brigade instead of just a single input brigade. This + gives a cache provider the option to consume only part of the brigade + passed to it, rather than the whole brigade as was required before. + This fixes an out of memory and a request timeout condition that would + occur when the original document was a large file. Introduce + CacheReadSize and CacheReadTime directives to mod_disk_cache to control + the amount of data to attempt to cache at a time. [Graham Leggett] + + *) core: Add ErrorLogFormat to allow configuring error log format, including + additional information that is logged once per connection or request. Add + error log IDs for connections and request to allow correlating error log + lines and the corresponding access log entry. [Stefan Fritsch] + + *) core: Disable sendfile by default. [Stefan Fritsch] + + *) mod_cache: Check the request to determine whether we are allowed + to return cached content at all, and respect a "Cache-Control: + no-cache" header from a client. Previously, "no-cache" would + behave like "max-age=0". [Graham Leggett] + + *) mod_cache: Use a proper filter context to hold filter data instead + of misusing the per-request configuration. Fixes a segfault on trunk + when the normal handler is used. [Graham Leggett] + + *) mod_cgid: Log a warning if the ScriptSock path is truncated because + it is too long. PR 49388. [Stefan Fritsch] + + *) vhosts: Do not allow _default_ in NameVirtualHost, or mixing * + and non-* ports on NameVirtualHost, or multiple NameVirtualHost + directives for the same address:port, or NameVirtualHost + directives with no matching VirtualHosts, or multiple ip-based + VirtualHost sections for the same address:port. These were + previously accepted with a warning, but the behavior was + undefined. [Dan Poirier] + + *) mod_remoteip: Fix a segfault when using mod_remoteip in conjunction with + Allow/Deny. PR 49838. [Andrew Skalski ] + + *) core: DirectoryMatch can now match on the end of line character ($), + and sub-directories of matched directories are no longer implicitly + matched. PR49809 [Eric Covener] + + *) Regexps: introduce new higher-level regexp utility including parsing + and executing perl-style regexp ops (e.g s/foo/bar/i) and regexp memory + [Nick Kew] + + *) Proxy: support setting source address. PR 29404 + [Multiple contributors iterating through bugzilla, + Aron Ujvari , Aleksey Midenkov , + ] + + *) mod_dav_fs: Fix broken "creationdate" property. + Regression in version 2.3.7. [Rainer Jung] + +Changes with Apache 2.3.7 + + *) SECURITY: CVE-2010-1452 (cve.mitre.org) + mod_dav, mod_cache, mod_session: Fix Handling of requests without a path + segment. PR 49246 [Mark Drayton, Jeff Trawick] + + *) mod_ldap: Properly check the result returned by apr_ldap_init. PR 46076. + [Stefan Fritsch] + + *) mod_rewrite: Log errors if rewrite map files cannot be opened. PR 49639. + [Stefan Fritsch] + + *) mod_proxy_http: Support the 'ping' property for backend HTTP/1.1 servers + via leveraging 100-Continue as the initial "request". + [Jim Jagielski] + + *) core/mod_authz_core: Introduce new access_checker_ex hook that enables + mod_authz_core to bypass authentication if access should be allowed by + IP address/env var/... [Stefan Fritsch] + + *) core: Introduce note_auth_failure hook to allow modules to add support + for additional auth types. This makes ap_note_auth_failure() work with + mod_auth_digest again. PR 48807. [Stefan Fritsch] + + *) socache modules: return APR_NOTFOUND when a lookup is not found [Nick Kew] + + *) mod_authn_socache: new module [Nick Kew] + + *) configure: Add reallyall option for --enable-mods-shared. [Stefan Fritsch] + + *) Fix Windows build when using VC6. [Gregg L. Smith ] + + *) mod_rewrite: Allow to set environment variables without explicitly + giving a value. [Rainer Jung] + + *) mod_rewrite: Remove superfluous EOL from rewrite logging. [Rainer Jung] + + *) mod_include: recognise "text/html; parameters" as text/html + PR 49616 [Andrey Chernov ] + + *) CGI vars: allow PATH to be set by SetEnv, consistent with LD_LIBRARY_PATH + PR 43906 [Nick Kew] + + *) Core: Extra robustness: don't try authz and segfault if authn + fails to set r->user. Log bug and return 500 instead. + PR 42995 [Nick Kew] + + *) HTTP protocol filter: fix handling of longer chunk extensions + PR 49474 [] + + *) Update SSL cipher suite and add example for SSLHonorCipherOrder. + [Lars Eilebrecht, Rainer Jung] + + *) move AddOutputFilterByType from core to mod_filter. This should + fix nasty side-effects that happen when content_type is set + more than once in processing a request, and make it fully + compatible with dynamic and proxied contents. [Nick Kew] + + *) mod_log_config: Implement logging for sub second timestamps and + request end time. [Rainer Jung] + +Changes with Apache 2.3.6 + + *) SECURITY: CVE-2009-3555 (cve.mitre.org) + mod_ssl: Comprehensive fix of the TLS renegotiation prefix injection + attack when compiled against OpenSSL version 0.9.8m or later. Introduces + the 'SSLInsecureRenegotiation' directive to reopen this vulnerability + and offer unsafe legacy renegotiation with clients which do not yet + support the new secure renegotiation protocol, RFC 5746. + [Joe Orton, and with thanks to the OpenSSL Team] + + *) SECURITY: CVE-2009-3555 (cve.mitre.org) + mod_ssl: A partial fix for the TLS renegotiation prefix injection attack + by rejecting any client-initiated renegotiations. Forcibly disable + keepalive for the connection if there is any buffered data readable. Any + configuration which requires renegotiation for per-directory/location + access control is still vulnerable, unless using OpenSSL >= 0.9.8l. + [Joe Orton, Ruediger Pluem, Hartmut Keil ] + + *) SECURITY: CVE-2010-0408 (cve.mitre.org) + mod_proxy_ajp: Respond with HTTP_BAD_REQUEST when the body is not sent + when request headers indicate a request body is incoming; not a case of + HTTP_INTERNAL_SERVER_ERROR. [Niku Toivola ] + + *) SECURITY: CVE-2010-0425 (cve.mitre.org) + mod_isapi: Do not unload an isapi .dll module until the request + processing is completed, avoiding orphaned callback pointers. + [Brett Gervasoni , Jeff Trawick] + + *) core: Filter init functions are now run strictly once per request + before handler invocation. The init functions are no longer run + for connection filters. PR 49328. [Joe Orton] + + *) core: Adjust the output filter chain correctly in an internal + redirect from a subrequest, preserving filters from the main + request as necessary. PR 17629. [Joe Orton] + + *) mod_cache: Explicitly allow cache implementations to cache a 206 Partial + Response if they so choose to do so. Previously an attempt to cache a 206 + was arbitrarily allowed if the response contained an Expires or + Cache-Control header, and arbitrarily denied if both headers were missing. + [Graham Leggett] + + *) core: Add microsecond timestamp fractions, process id and thread id + to the error log. [Rainer Jung] + + *) configure: The "most" module set gets build by default. [Rainer Jung] + + *) configure: Building dynamic modules (DSO) by default. [Rainer Jung] + + *) configure: Fix broken VPATH build when using included APR. + [Rainer Jung] + + *) mod_session_crypto: Fix configure problem when building + with APR 2 and for VPATH builds with included APR. + [Rainer Jung] + + *) mod_session_crypto: API compatibility with APR 2 crypto and + APR Util 1.x crypto. [Rainer Jung] + + *) ab: Fix memory leak with -v2 and SSL. PR 49383. + [Pavel Kankovsky ] + + *) core: Add per-module and per-directory loglevel configuration. + Add some more trace logging. + mod_rewrite: Replace RewriteLog/RewriteLogLevel with trace log levels. + mod_ssl: Replace LogLevelDebugDump with trace log levels. + mod_ssl/mod_proxy*: Adjust loglevels to be less verbose at levels info + and debug. + mod_dumpio: Replace DumpIOLogLevel with trace log levels. + [Stefan Fritsch] + + *) mod_ldap: LDAP caching was suppressed (and ldap-status handler returns + title page only) when any mod_ldap directives were used in VirtualHost + context. [Eric Covener] + + *) mod_disk_cache: Decline the opportunity to cache if the response is + a 206 Partial Content. This stops a reverse proxied partial response + from becoming cached, and then being served in subsequent responses. + [Graham Leggett] + + *) mod_deflate: avoid the risk of forwarding data before headers are set. + PR 49369 [Matthew Steele ] + + *) mod_authnz_ldap: Ensure nested groups are checked when the + top-level group doesn't have any direct non-group members + of attributes in AuthLDAPGroupAttribute. [Eric Covener] + + *) mod_authnz_ldap: Search or Comparison during authorization phase + can use the credentials from the authentication phase + (AuthLDAPSearchAsUSer,AuthLDAPCompareAsUser). + PR 48340 [Domenico Rotiroti, Eric Covener] + + *) mod_authnz_ldap: Allow the initial DN search during authentication + to use the HTTP username/pass instead of an anonymous or hard-coded + LDAP id (AuthLDAPInitialBindAsUser, AuthLDAPInitialBindPattern). + [Eric Covener] + + *) mod_authnz_ldap: Publish requested LDAP data with an AUTHORIZE_ prefix + when this module is used for authorization. See AuthLDAPAuthorizePrefix. + PR 45584 [Eric Covener] + + *) apxs -q: Stop filtering out ':' characters from the reported values. + PR 45343. [Bill Cole] + + *) prefork MPM: Work around possible crashes on child exit in APR reslist + cleanup code. PR 43857. [Tom Donovan] + + *) ab: fix number of requests sent by ab when keepalive is enabled. PR 48497. + [Bryn Dole ] + + *) Log an error for failures to read a chunk-size, and return 408 instead of + 413 when this is due to a read timeout. This change also fixes some cases + of two error documents being sent in the response for the same scenario. + [Eric Covener] PR49167 + + *) mod_proxy_balancer: Add new directive BalancerNonce to allow admin + to control/set the nonce used in the balancer-manager application. + [Jim Jagielski] + + *) mod_proxy_connect: Support port ranges in AllowConnect. PR 23673. + [Stefan Fritsch] + + *) Proxy balancer: support setting error status according to HTTP response + code from a backend. PR 48939. [Daniel Ruggeri ] + + *) htcacheclean: Introduce the ability to clean specific URLs from the + cache, if provided as an optional parameter on the command line. + [Graham Leggett] + + *) core: Introduce the IncludeStrict directive, which explicitly fails + server startup if no files or directories match a wildcard path. + [Graham Leggett] + + *) htcacheclean: Report additional statistics about entries deleted. + PR 48944. [Mark Drayton mark markdrayton.info] + + *) Introduce SSLFIPS directive to support OpenSSL FIPS_mode; permits all + builds of mod_ssl to use 'SSLFIPS off' for portability, but the proper + build of openssl is required for 'SSLFIPS on'. PR 46270. + [Dr Stephen Henson , William Rowe] + + *) mod_proxy_http: Log the port of the remote server in various messages. + PR 48812. [Igor Galić ] + + *) mod_reqtimeout: Do not wrongly enforce timeouts for mod_proxy's backend + connections and other protocol handlers (like mod_ftp). [Stefan Fritsch] + + *) mod_proxy_ajp: Really regard the operation a success, when the client + aborted the connection. In addition adjust the log message if the client + aborted the connection. [Ruediger Pluem] + + *) mod_ssl: Add the 'SSLInsecureRenegotiation' directive, which + allows insecure renegotiation with clients which do not yet + support the secure renegotiation protocol. [Joe Orton] + + *) mod_ssl: Fix a potential I/O hang if a long list of trusted CAs + is configured for client cert auth. PR 46952. [Joe Orton] + + *) core: Only log a 408 if it is no keepalive timeout. PR 39785 + [Ruediger Pluem, Mark Montague ] + + *) support/rotatelogs: Add -L option to create a link to the current + log file. PR 48761 [, Dan Poirier] + + *) mod_ldap: Update LDAPTrustedClientCert to consistently be a per-directory + setting only, matching most of the documentation and examples. + PR 46541 [Paul Reder, Eric Covener] + + *) mod_ldap: LDAPTrustedClientCert now accepts CA_DER/CA_BASE64 argument + types previously allowed only in LDAPTrustedGlobalCert. [Eric Covener] + + *) mod_negotiation: Preserve query string over multiviews negotiation. + This buglet was fixed for type maps in 2.2.6, but the same issue + affected multiviews and was overlooked. + PR 33112 [Joergen Thomsen ] + + *) mod_ldap: Eliminate a potential crash with multiple LDAPTrustedClientCert + when some are not password-protected. [Eric Covener] + + *) Fix startup segfault when the Mutex directive is used but no loaded + modules use httpd mutexes. PR 48787. [Jeff Trawick] + + *) Proxy: get the headers right in a HEAD request with + ProxyErrorOverride, by checking for an overridden error + before not after going into a catch-all code path. + PR 41646. [Nick Kew, Stuart Children] + + *) support/rotatelogs: Support the simplest log rotation case, log + truncation. Useful when the log is being processed in real time + using a command like tail. [Graham Leggett] + + *) support/htcacheclean: Teach it how to write a pid file (modelled on + httpd's writing of a pid file) so that it becomes possible to run + more than one instance of htcacheclean on the same machine. + [Graham Leggett] + + *) Log command line on startup, so there's a record of command line + arguments like -f. PR 48752. [Dan Poirier] + + *) Introduce mod_reflector, a handler capable of reflecting POSTed + request bodies back within the response through the output filter + stack. Can be used to turn an output filter into a web service. + [Graham Leggett] + + *) mod_proxy_http: Make sure that when an ErrorDocument is served + from a reverse proxied URL, that the subrequest respects the status + of the original request. This brings the behaviour of proxy_handler + in line with default_handler. PR 47106. [Graham Leggett] + + *) Support wildcards in both the directory and file components of + the path specified by the Include directive. [Graham Leggett] + + *) mod_proxy, mod_proxy_http: Support remote https proxies + by using HTTP CONNECT. PR 19188. + [Philippe Dutrueux , Rainer Jung] + + *) apxs: Fix -A and -a options to ignore whitespace in httpd.conf + [Philip M. Gollucci] + + *) worker: Don't report server has reached MaxClients until it has. + Add message when server gets within MinSpareThreads of MaxClients. + PR 46996. [Dan Poirier] + + *) mod_session: Session expiry was being initialised, but not updated + on each session save, resulting in timed out sessions when there + should not have been. Fixed. [Graham Leggett] + + *) mod_log_config: Add the R option to log the handler used within the + request. [Christian Folini ] + + *) mod_include: Allow fine control over the removal of Last-Modified and + ETag headers within the INCLUDES filter, making it possible to cache + responses if desired. Fix the default value of the SSIAccessEnable + directive. [Graham Leggett] + + *) Add new UnDefine directive to undefine a variable. PR 35350. + [Stefan Fritsch] + + *) Make ap_pregsub(), used by AliasMatch and friends, use the same syntax + for regex backreferences as mod_rewrite and mod_include: Remove the use + of '&' as an alias for '$0' and allow to escape any character with a + backslash. PR 48351. [Stefan Fritsch] + + *) mod_authnz_ldap: If AuthLDAPCharsetConfig is set, also convert the + password to UTF-8. PR 45318. + [Johannes Müller , Stefan Fritsch] + + *) ab: Fix calculation of requests per second in HTML output. PR 48594. + [Stefan Fritsch] + + *) mod_authnz_ldap: Failures to map a username to a DN, or to check a user + password now result in an informational level log entry instead of + warning level. [Eric Covener] + +Changes with Apache 2.3.5 + + *) SECURITY: CVE-2010-0434 (cve.mitre.org) + Ensure each subrequest has a shallow copy of headers_in so that the + parent request headers are not corrupted. Eliminates a problematic + optimization in the case of no request body. PR 48359 + [Jake Scott, William Rowe, Ruediger Pluem] + + *) Turn static function get_server_name_for_url() into public + ap_get_server_name_for_url() and use it where appropriate. This + fixes mod_rewrite generating invalid URLs for redirects to IPv6 + literal addresses. [Stefan Fritsch] + + *) mod_ldap: Introduce new config option LDAPTimeout to set the timeout + for LDAP operations like bind and search. [Stefan Fritsch] + + *) mod_proxy, mod_proxy_ftp: Move ProxyFtpDirCharset from mod_proxy to + mod_proxy_ftp. [Takashi Sato] + + *) mod_proxy, mod_proxy_connect: Move AllowCONNECT from mod_proxy to + mod_proxy_connect. [Takashi Sato] + + *) mod_cache: Do an exact match of the keys defined by + CacheIgnoreURLSessionIdentifiers against the querystring instead of + a partial match. PR 48401. + [Dodou Wang , Ruediger Pluem] + + *) mod_proxy_balancer: Fix crash in balancer-manager. [Rainer Jung] + + *) Core HTTP: disable keepalive when the Client has sent + Expect: 100-continue + but we respond directly with a non-100 response. + Keepalive here led to data from clients continuing being treated as + a new request. + PR 47087 [Nick Kew] + + *) Core: reject NULLs in request line or request headers. + PR 43039 [Nick Kew] + + *) Core: (re)-introduce -T commandline option to suppress documentroot + check at startup. + PR 41887 [Jan van den Berg ] + + *) mod_autoindex: support XHTML as equivalent to HTML in IndexOptions, + ScanHTMLTitles, ReadmeName, HeaderName + PR 48416 [Dmitry Bakshaev , Nick Kew] + + *) Proxy: Fix ProxyPassReverse with relative URL + Derived (slightly erroneously) from PR 38864 [Nick Kew] + + *) mod_headers: align Header Edit with Header Set when used on Content-Type + PR 48422 [Cyril Bonté , Nick Kew>] + + *) mod_headers: Enable multi-match-and-replace edit option + PR 46594 [Nick Kew] + + *) mod_filter: enable it to act on non-200 responses. + PR 48377 [Nick Kew] + +Changes with Apache 2.3.4 + + *) Replace AcceptMutex, LockFile, RewriteLock, SSLMutex, SSLStaplingMutex, + and WatchdogMutexPath with a single Mutex directive. Add APIs to + simplify setup and user customization of APR proc and global mutexes. + (See util_mutex.h.) Build-time setting DEFAULT_LOCKFILE is no longer + respected; set DEFAULT_REL_RUNTIMEDIR instead. [Jeff Trawick] + + *) http_core: KeepAlive no longer accepts other than On|Off. + [Takashi Sato] + + *) mod_dav: Remove errno from dav_error interface. Calls to dav_new_error() + and dav_new_error_tag() must be adjusted to add an apr_status_t parameter. + [Jeff Trawick] + + *) mod_authnz_ldap: Add AuthLDAPBindAuthoritative to allow Authentication to + try other providers in the case of an LDAP bind failure. + PR 46608 [Justin Erenkrantz, Joe Schaefer, Tony Stevenson] + + *) Build: fix --with-module to work as documented + PR 43881 [Gez Saunders ] + +Changes with Apache 2.3.3 + + *) SECURITY: CVE-2009-3095 (cve.mitre.org) + mod_proxy_ftp: sanity check authn credentials. + [Stefan Fritsch , Joe Orton] + + *) SECURITY: CVE-2009-3094 (cve.mitre.org) + mod_proxy_ftp: NULL pointer dereference on error paths. + [Stefan Fritsch , Joe Orton] + + *) mod_ssl: enable support for ECC keys and ECDH ciphers. Tested against + OpenSSL 1.0.0b3. [Vipul Gupta , Sander Temme] + + *) mod_dav: Include uri when logging a PUT error due to connection abort. + PR 38149. [Stefan Fritsch] + + *) mod_dav: Return 409 instead of 500 for a LOCK request if the parent + resource does not exist or is not a collection. PR 43465. [Stefan Fritsch] + + *) mod_dav_fs: Return 409 instead of 500 for Litmus test case copy_nodestcoll + (a COPY request where the parent of the destination resource does not + exist). PR 39299. [Stefan Fritsch] + + *) mod_dav_fs: Don't delete the whole file if a PUT with content-range failed. + PR 42896. [Stefan Fritsch] + + *) mod_dav_fs: Make PUT create files atomically and no longer destroy the + old file if the transfer aborted. PR 39815. [Paul Querna, Stefan Fritsch] + + *) mod_dav_fs: Remove inode keyed locking as this conflicts with atomically + creating files. On systems with inode numbers, this is a format change of + the DavLockDB. The old DavLockDB must be deleted on upgrade. + [Stefan Fritsch] + + *) mod_log_config: Make ${cookie}C correctly match whole cookie names + instead of substrings. PR 28037. [Dan Franklin , + Stefan Fritsch] + + *) vhost: A purely-numeric Host: header should not be treated as a port. + PR 44979 [Nick Kew] + + *) mod_ldap: Avoid 500 errors with "Unable to set LDAP_OPT_REFHOPLIMIT option to 5" + when built against openldap by using SDK LDAP_OPT_REFHOPLIMIT defaults unless + LDAPReferralHopLimit is explicitly configured. + [Eric Covener] + + *) mod_charset_lite: Honor 'CharsetOptions NoImplicitAdd'. + [Eric Covener] + + *) mod_ssl: Add support for OCSP Stapling. PR 43822. + [Dr Stephen Henson ] + + *) mod_socache_shmcb: Allow parens in file name if cache size is given. + Fixes SSLSessionCache directive mis-parsing parens in pathname. + PR 47945. [Stefan Fritsch] + + *) htpasswd: Improve out of disk space handling. PR 30877. [Stefan Fritsch] + + *) htpasswd: Use MD5 hash by default on all platforms. [Stefan Fritsch] + + *) mod_sed: Reduce memory consumption when processing very long lines. + PR 48024 [Basant Kumar Kukreja ] + + *) ab: Fix segfault in case the argument for -n is a very large number. + PR 47178. [Philipp Hagemeister ] + + *) Allow ProxyPreserveHost to work in sections. PR 34901. + [Stefan Fritsch] + + *) configure: Fix THREADED_MPMS so that mod_cgid is enabled again + for worker MPM. [Takashi Sato] + + *) mod_dav: Provide a mechanism to obtain the request_rec and pathname + from the dav_resource. [Jari Urpalainen , + Brian France ] + + *) Build: Use install instead of cp if available on installing + modules to avoid segmentation fault. PR 47951. [hirose31 gmail.com] + + *) mod_cache: correctly consider s-maxage in cacheability + decisions. [Dan Poirier] + + *) mod_logio/core: Report more accurate byte counts in mod_status if + mod_logio is loaded. PR 25656. [Stefan Fritsch] + + *) mod_ldap: If LDAPSharedCacheSize is too small, try harder to purge + some cache entries and log a warning. Also increase the default + LDAPSharedCacheSize to 500000. This is a more realistic size suitable + for the default values of 1024 for LdapCacheEntries/LdapOpCacheEntries. + PR 46749. [Stefan Fritsch] + + *) mod_rewrite: Make sure that a hostname:port isn't fully qualified if + the request is a CONNECT request. [Bill Zajac ] + + *) mod_cache: Teach CacheEnable and CacheDisable to work from within a + Location section, in line with how ProxyPass works. [Graham Leggett] + + *) mod_reqtimeout: New module to set timeouts and minimum data rates for + receiving requests from the client. [Stefan Fritsch] + + *) core: Fix potential memory leaks by making sure to not destroy + bucket brigades that have been created by earlier filters. + [Stefan Fritsch] + + *) core, mod_deflate, mod_sed: Reduce memory usage by reusing bucket + brigades in several places. [Stefan Fritsch] + + *) mod_cache: Fix uri_meets_conditions() so that CacheEnable will + match by scheme, or by a wildcarded hostname. PR 40169 + [Peter Grandi , Graham Leggett] + + *) suxec: Allow to log an error if exec fails by setting FD_CLOEXEC + on the log file instead of closing it. PR 10744. [Nicolas Rachinsky] + + *) mod_mime: Make RemoveType override the info from TypesConfig. + PR 38330. [Stefan Fritsch] + + *) mod_cache: Introduce the option to run the cache from within the + normal request handler, and to allow fine grained control over + where in the filter chain content is cached. Adds CacheQuickHandler + directive. [Graham Leggett] + + *) core: Treat timeout reading request as 408 error, not 400. + Log 408 errors in access log as was done in Apache 1.3.x. + PR 39785 [Nobutaka Mantani , + Stefan Fritsch , Dan Poirier] + + *) mod_ssl: Reintroduce SSL_CLIENT_S_DN, SSL_CLIENT_I_DN, SSL_SERVER_S_DN, + SSL_SERVER_I_DN back to the environment variables to be set by mod_ssl. + [Peter Sylvester ] + + *) mod_disk_cache: don't cache incomplete responses, per RFC 2616, 13.8. + PR15866. [Dan Poirier] + + *) ab: ab segfaults in verbose mode on https sites + PR46393. [Ryan Niebur] + + *) mod_dav: Allow other modules to become providers and add resource types + to the DAV response. [Jari Urpalainen , + Brian France ] + + *) mod_dav: Allow other modules to add things to the DAV or Allow headers + of an OPTIONS request. [Jari Urpalainen , + Brian France ] + + *) core: Lower memory usage of core output filter. + [Stefan Fritsch ] + + *) mod_mime: Detect invalid use of MultiviewsMatch inside Location and + LocationMatch sections. PR47754. [Dan Poirier] + + *) mod_request: Make sure the KeptBodySize directive rejects values + that aren't valid numbers. [Graham Leggett] + + *) mod_session_crypto: Sanity check should the potentially encrypted + session cookie be too short. [Graham Leggett] + + *) mod_session.c: Prevent a segfault when session is added but not + configured. [Graham Leggett] + + *) htcacheclean: 19 ways to fail, 1 error message. Fixed. [Graham Leggett] + + *) mod_auth_digest: Fail server start when nonce count checking + is configured without shared memory, or md5-sess algorithm is + configured. [Dan Poirier] + + *) mod_proxy_connect: The connect method doesn't work if the client is + connecting to the apache proxy through an ssl socket. Fixed. + PR29744. [Brad Boyer, Mark Cave-Ayland, Julian Gilbey, Fabrice Durand, + David Gence, Tim Dodge, Per Gunnar Hans, Emmanuel Elango, + Kevin Croft, Rudolf Cardinal] + + *) mod_ssl: The error message when SSLCertificateFile is missing should + at least give the name or position of the problematic virtual host + definition. [Stefan Fritsch sf sfritsch.de] + + *) mod_auth_digest: Fix null pointer when qop=none. [Dan Poirier] + + *) Add support for HTTP PUT to ab. [Jeff Barnes ] + + *) mod_headers: generalise the envclause to support expression + evaluation with ap_expr parser [Nick Kew] + + *) mod_cache: Introduce the thundering herd lock, a mechanism to keep + the flood of requests at bay that strike a backend webserver as + a cached entity goes stale. [Graham Leggett] + + *) mod_auth_digest: Fix usage of shared memory and re-enable it. + PR 16057 [Dan Poirier] + + *) Preserve Port information over internal redirects + PR 35999 [Jonas Ringh ] + + *) Proxy: unable to connect to a backend is SERVICE_UNAVAILABLE, + rather than BAD_GATEWAY or (especially) NOT_FOUND. + PR 46971 [evanc nortel.com] + + *) Various modules: Do better checking of pollset operations in order to + avoid segmentation faults if they fail. PR 46467 + [Stefan Fritsch ] + + *) mod_autoindex: Correctly create an empty cell if the description + for a file is missing. PR 47682 [Peter Poeml ] + + *) ab: Fix broken error messages after resolver or connect() failures. + [Jeff Trawick] + + *) SECURITY: CVE-2009-1890 (cve.mitre.org) + Fix a potential Denial-of-Service attack against mod_proxy in a + reverse proxy configuration, where a remote attacker can force a + proxy process to consume CPU time indefinitely. [Nick Kew, Joe Orton] + + *) SECURITY: CVE-2009-1191 (cve.mitre.org) + mod_proxy_ajp: Avoid delivering content from a previous request which + failed to send a request body. PR 46949 [Ruediger Pluem] + + *) htdbm: Fix possible buffer overflow if dbm database has very + long values. PR 30586 [Dan Poirier] + + *) core: Return APR_EOF if request body is shorter than the length announced + by the client. PR 33098 [ Stefan Fritsch ] + + *) mod_suexec: correctly set suexec_enabled when httpd is run by a + non-root user and may have insufficient permissions. + PR 42175 [Jim Radford ] + + *) mod_ssl: Fix SSL_*_DN_UID variables to use the 'userID' attribute + type. PR 45107. [Michael Ströder , + Peter Sylvester ] + + *) mod_proxy_http: fix case sensitivity checking transfer encoding + PR 47383 [Ryuzo Yamamoto ] + + *) mod_alias: ensure Redirect issues a valid URL. + PR 44020 [Håkon Stordahl ] + + *) mod_dir: add FallbackResource directive, to enable admin to specify + an action to happen when a URL maps to no file, without resorting + to ErrorDocument or mod_rewrite. PR 47184 [Nick Kew] + + *) mod_cgid: Do not leak the listening Unix socket file descriptor to the + CGI process. PR 47335 [Kornél Pál ] + + *) mod_rewrite: Remove locking for writing to the rewritelog. + PR 46942 [Dan Poirier ] + + *) mod_alias: check sanity in Redirect arguments. + PR 44729 [Sönke Tesch , Jim Jagielski] + + *) mod_proxy_http: fix Host: header for literal IPv6 addresses. + PR 47177 [Carlos Garcia Braschi ] + + *) mod_cache: Add CacheIgnoreURLSessionIdentifiers directive to ignore + defined session identifiers encoded in the URL when caching. + [Ruediger Pluem] + + *) mod_rewrite: Fix the error string returned by RewriteRule. + RewriteRule returned "RewriteCond: bad flag delimiters" when the 3rd + argument of RewriteRule was not started with "[" or not ended with "]". + PR 45082 [Vitaly Polonetsky ] + + *) Windows: Fix usage message. + [Rainer Jung] + + *) apachectl: When passing through arguments to httpd in + non-SysV mode, use the "$@" syntax to preserve arguments. + [Eric Covener] + + *) mod_dbd: add DBDInitSQL directive to enable SQL statements to + be run when a connection is opened. PR 46827 + [Marko Kevac ] + + *) mod_cgid: Improve handling of long AF_UNIX socket names (ScriptSock). + PR 47037. [Jeff Trawick] + + *) mod_proxy_ajp: Check more strictly that the backend follows the AJP + protocol. [Mladen Turk] + + *) mod_proxy_ajp: Forward remote port information by default. + [Rainer Jung] + + *) Allow MPMs to be loaded dynamically, as with most other modules. Use + --enable-mpms-shared={list|"all"} to enable. This required changes to + the MPM interfaces. Removed: mpm.h, mpm_default.h (as an installed + header), APACHE_MPM_DIR, MPM_NAME, ap_threads_per_child, + ap_max_daemons_limit, ap_my_generation, etc. ap_mpm_query() can't be + called until after the register-hooks phase. [Jeff Trawick] + + *) mod_ssl: Add SSLProxyCheckPeerExpire and SSLProxyCheckPeerCN directives + to enable stricter checking of remote server certificates. + [Ruediger Pluem] + + *) ab: Fix a 100% CPU loop on platforms where a failed non-blocking connect + returns EINPROGRESS and a subsequent poll() returns only POLLERR. + Observed on HP-UX. [Eric Covener] + + *) Remove broken support for BeOS, TPF, and even older platforms such + as A/UX, Next, and Tandem. [Jeff Trawick] + + *) mod_proxy_ftp: Add ProxyFtpListOnWildcard directive to allow files with + globbing characters to be retrieved instead of converted into a + directory listing. PR 46789 [Dan Poirier ] + + *) Provide ap_retained_data_create()/ap_retained_data_get() for preservation + of module state across unload/load. [Jeff Trawick] + + *) mod_substitute: Fix a memory leak. PR 44948 + [Dan Poirier ] + +Changes with Apache 2.3.2 + + *) mod_mime_magic: Fix detection of compressed content. [Rainer Jung] + + *) mod_negotiation: Escape paths of filenames in 406 responses to avoid + HTML injections and HTTP response splitting. PR 46837. + [Geoff Keating ] + + *) mod_ssl: add support for type-safe STACK constructs in OpenSSL + development HEAD. PR 45521. [Kaspar Brand, Sander Temme] + + *) ab: Fix maintenance of the pollset to resolve EALREADY errors + with kqueue (BSD/OS X) and excessive CPU with event ports (Solaris). + PR 44584. Use APR_POLLSET_NOCOPY for better performance with some + pollset implementations. [Jeff Trawick] + + *) mod_disk_cache: The module now turns off sendfile support if + 'EnableSendfile off' is defined globally. [Lars Eilebrecht] + + *) mod_deflate: Adjust content metadata before bailing out on 304 + responses so that the metadata does not differ from 200 response. + [Roy T. Fielding] + + *) mod_deflate: Fix creation of invalid Etag headers. We now make sure + that the Etag value is properly quoted when adding the gzip marker. + PR 39727, 45023. [Lars Eilebrecht, Roy T. Fielding] + + *) Added 20x22 icons for ODF, SVG, and XML documents. PR 37185. + [Peter Harlow] + + *) Disabled DefaultType directive and removed ap_default_type() + from core. We now exclude Content-Type from responses for which + a media type has not been configured via mime.types, AddType, + ForceType, or some other mechanism. PR 13986. [Roy T. Fielding] + + *) mod_rewrite: Add IPV6 variable to RewriteCond + [Ryan Phillips ] + + *) core: Enhance KeepAliveTimeout to support a value in milliseconds. + PR 46275. [Takashi Sato] + + *) rotatelogs: Allow size units B, K, M, G and combination of + time and size based rotation. [Rainer Jung] + + *) rotatelogs: Add flag for verbose (debug) output. [Rainer Jung] + + *) mod_ssl: Fix merging of SSLRenegBufferSize directive. PR 46508 + [] + + *) core: Translate the the status line to ASCII on EBCDIC platforms in + ap_send_interim_response() and for locally generated "100 Continue" + responses. [Eric Covener] + + *) prefork: Fix child process hang during graceful restart/stop in + configurations with multiple listening sockets. PR 42829. [Joe Orton, + Jeff Trawick] + + *) mod_session_crypto: Ensure that SessionCryptoDriver can only be + set in the global scope. [Graham Leggett] + + *) mod_ext_filter: We need to detect failure to startup the filter + program (a mangled response is not acceptable). Fix to detect + failure, and offer configuration option either to abort or + to remove the filter and continue. + PR 41120 [Nick Kew] + + *) mod_session_crypto: Rewrite the session_crypto module against the + apr_crypto API. [Graham Leggett] + + *) mod_auth_form: Fix a pool lifetime issue, don't remove the subrequest + until the main request is cleaned up. [Graham Leggett] + +Changes with Apache 2.3.1 + + *) ap_slotmem: Add in new slot-based memory access API impl., including + 2 providers (mod_sharedmem and mod_plainmem) [Jim Jagielski, + Jean-Frederic Clere, Brian Akins ] + + *) mod_include: support generating non-ASCII characters as entities in SSI + PR 25202 [Nick Kew] + + *) core/utils: Enhance ap_escape_html API to support escaping non-ASCII chars + PR 25202 [Nick Kew] + + *) mod_rewrite: fix "B" flag breakage by reverting r5589343 + PR 45529 [Bob Ionescu ] + + *) CGI: return 504 (Gateway timeout) rather than 500 when a script + times out before returning status line/headers. + PR 42190 [Nick Kew] + + *) mod_cgid: fix segfault problem on solaris. + PR 39332 [Masaoki Kobayashi ] + + *) mod_proxy_scgi: Added. [André Malo] + + *) mod_cache: Introduce 'no-cache' per-request environment variable + to prevent the saving of an otherwise cacheable response. + [Eric Covener] + + *) mod_rewrite: Introduce DiscardPathInfo|DPI flag to stop the troublesome + way that per-directory rewrites append the previous notion of PATH_INFO + to each substitution before evaluating subsequent rules. + PR 38642 [Eric Covener] + + *) mod_cgid: Do not add an empty argument when calling the CGI script. + PR 46380 [Ruediger Pluem] + + *) scoreboard: Remove unused sb_type from process_score. + [Torsten Foertsch , Chris Darroch] + + *) mod_ssl: Add SSLRenegBufferSize directive to allow changing the + size of the buffer used for the request-body where necessary + during a per-dir renegotiation. PR 39243. [Joe Orton] + + *) mod_proxy_fdpass: New module to pass a client connection over to a separate + process that is reading from a unix daemon socket. + + *) mod_ssl: Improve environment variable extraction to be more + efficient and to correctly handle DNs with duplicate tags. + PR 45975. [Joe Orton] + + *) Remove the obsolete serial attribute from the RPM spec file. Compile + against the external pcre. Add missing binaries fcgistarter, and + mod_socache* and mod_session*. [Graham Leggett] + +Changes with Apache 2.3.0 + + *) mod_ratelimit: New module to do bandwidth rate limiting. [Paul Querna] + + *) Remove X-Pad header which was added as a work around to a bug in + Netscape 2.x to 4.0b2. [Takashi Sato ] + + *) Add DTrace Statically Defined Tracing (SDT) probes. + [Theo Schlossnagle , Paul Querna] + + *) mod_proxy_balancer: Move all load balancing implementations + as individual, self-contained mod_proxy submodules under + modules/proxy/balancers [Jim Jagielski] + + *) Rename APIs to include ap_ prefix: + find_child_by_pid -> ap_find_child_by_pid + suck_in_APR -> ap_suck_in_APR + sys_privileges_handlers -> ap_sys_privileges_handlers + unixd_accept -> ap_unixd_accept + unixd_config -> ap_unixd_config + unixd_killpg -> ap_unixd_killpg + unixd_set_global_mutex_perms -> ap_unixd_set_global_mutex_perms + unixd_set_proc_mutex_perms -> ap_unixd_set_proc_mutex_perms + unixd_set_rlimit -> ap_unixd_set_rlimit + [Paul Querna] + + *) mod_lbmethod_heartbeat: New module to load balance mod_proxy workers + based on heartbeats. [Paul Querna] + + *) mod_heartmonitor: New module to collect heartbeats, and write out a file + so that other modules can load balance traffic as needed. [Paul Querna] + + *) mod_heartbeat: New module to generate multicast heartbeats to know if a + server is online. [Paul Querna] + + *) mod_buffer: Honour the flush bucket and flush the buffer in the + input filter. Make sure that metadata buckets are written to + the buffer, not to the final brigade. [Graham Leggett] + + *) mod_buffer: Optimise the buffering of heap buckets when the heap + buckets stay exactly APR_BUCKET_BUFF_SIZE long. [Graham Leggett, + Ruediger Pluem] + + *) mod_buffer: Optional support for buffering of the input and output + filter stacks. Can collapse many small buckets into fewer larger + buckets, and prevents excessively small chunks being sent over + the wire. [Graham Leggett] + + *) mod_privileges: new module to make httpd on Solaris privileges-aware + and to enable different virtualhosts to run with different + privileges and Unix user/group IDs [Nick Kew] + + *) mod_mem_cache: this module has been removed. [William Rowe] + + *) authn/z: Remove mod_authn_default and mod_authz_default. + [Chris Darroch] + + *) authz: Fix handling of authz configurations, make default authz + logic replicate 2.2.x authz logic, and replace , Reject, + and AuthzMergeRules directives with Match, , and AuthzMerge + directives. [Chris Darroch] + + *) mod_authn_core: Prevent crash when provider alias created to + provider which is not yet registered. [Chris Darroch] + + *) mod_authn_core: Add AuthType of None to support disabling + authentication. [Chris Darroch] + + *) core: Allow and directives to nest, and + constrain their use to conform with that of other access control + and authorization directives. [Chris Darroch] + + *) unixd: turn existing code into a module, and turn the set user/group + and chroot into a child_init function. [Nick Kew] + + *) mod_dir: Support "DirectoryIndex disabled" + Suggested By André Warnier [Eric Covener] + + *) mod_ssl: Send Content-Type application/ocsp-request for POST requests to + OSCP responders. PR 46014 [Dr Stephen Henson ] + + *) mod_authnz_ldap: don't return NULL-valued environment variables to + other modules. PR 39045 [Francois Pesce ] + + *) Don't adjust case in pathname components that are not of interest + to mod_mime. Fixes mod_negotiation's use of such components. + PR 43250 [Basant Kumar Kukreja ] + + *) Be tolerant in what you accept - accept slightly broken + status lines from a backend provided they include a valid status code. + PR 44995 [Rainer Jung ] + + *) New module mod_sed: filter Request/Response bodies through sed + [Basant Kumar Kukreja ] + + *) mod_auth_form: Make sure that basic authentication is correctly + faked directly after login. [Graham Leggett] + + *) mod_session_cookie, mod_session_dbd: Make sure cookies are set both + within the output headers and error output headers, so that the + session is maintained across redirects. [Graham Leggett] + + *) mod_auth_form: Make sure the logged in user is populated correctly + after a form login. Fixes a missing REMOTE_USER variable directly + following a login. [Graham Leggett] + + *) mod_session_cookie: Make sure that cookie attributes are correctly + included in the blank cookie when cookies are removed. This fixes an + inability to log out when using mod_auth_form. [Graham Leggett] + + *) mod_session: Prevent a segfault when a CGI script sets a cookie with a + null value. [David Shane Holden ] + + *) core, authn/z: Determine registered authn/z providers directly in + ap_setup_auth_internal(), which allows optional functions that just + wrapped ap_list_provider_names() to be removed from authn/z modules. + [Chris Darroch] + + *) authn/z: Convert common provider version strings to macros. + [Chris Darroch] + + *) core: When testing for slash-terminated configuration paths in + ap_location_walk(), don't look past the start of an empty string + such as that created by a directive. + [Chris Darroch] + + *) core, mod_proxy: If a kept_body is present, it becomes safe for + subrequests to support message bodies. Make sure that safety + checks within the core and within the proxy are not triggered + when kept_body is present. This makes it possible to embed + proxied POST requests within mod_include. [Graham Leggett] + + *) mod_auth_form: Make sure the input filter stack is properly set + up before reading the login form. Make sure the kept body filter + is correctly inserted to ensure the body can be read a second + time safely should the authn be successful. [Graham Leggett, + Ruediger Pluem] + + *) mod_request: Insert the KEPT_BODY filter via the insert_filter + hook instead of during fixups. Add a safety check to ensure the + filters cannot be inserted more than once. [Graham Leggett, + Ruediger Pluem] + + *) ap_cache_cacheable_headers_out() will (now) always + merge an error headers _before_ clearing them and _before_ + merging in the actual entity headers and doing normal + hop-by-hop cleansing. [Dirk-Willem van Gulik]. + + *) cache: retire ap_cache_cacheable_hdrs_out() which was used + for both in- and out-put headers; and replace it by a single + ap_cache_cacheable_headers() wrapped in a in- and out-put + specific ap_cache_cacheable_headers_in()/out(). The latter + which will also merge error and ensure content-type. To keep + cache modules consistent with ease. This API change bumps + up the minor MM by one [Dirk-Willem van Gulik]. + + *) Move the KeptBodySize directive, kept_body filters and the + ap_parse_request_body function out of the http module and into a + new module called mod_request, reducing the size of the core. + [Graham Leggett] + + *) mod_dbd: Handle integer configuration directive parameters with a + dedicated function. + + *) Change the directives within the mod_session* modules to be valid + both inside and outside the location/directory sections, as + suggested by wrowe. [Graham Leggett] + + *) mod_auth_form: Add a module capable of allowing end users to log + in using an HTML form, storing the credentials within mod_session. + [Graham Leggett] + + *) Add a function to the http filters that is able to parse an HTML + form request with the type of application/x-www-form-urlencoded. + [Graham Leggett] + + *) mod_session_crypto: Initialise SSL in the post config hook. + [Ruediger Pluem, Graham Leggett] + + *) mod_session_dbd: Add a session implementation capable of storing + session information in a SQL database via the dbd interface. Useful + for sites where session privacy is important. [Graham Leggett] + + *) mod_session_crypto: Add a session encoding implementation capable + of encrypting and decrypting sessions wherever they may be stored. + Introduces a level of privacy when sessions are stored on the + browser. [Graham Leggett] + + *) mod_session_cookie: Add a session implementation capable of storing + session information within cookies on the browser. Useful for high + volume sites where server bound sessions are too resource intensive. + [Graham Leggett] + + *) mod_session: Add a generic session interface to unify the different + attempts at saving persistent sessions across requests. + [Graham Leggett] + + *) core, authn/z: Avoid calling access control hooks for internal requests + with configurations which match those of initial request. Revert to + original behaviour (call access control hooks for internal requests + with URIs different from initial request) if any access control hooks or + providers are not registered as permitting this optimization. + Introduce wrappers for access control hook and provider registration + which can accept additional mode and flag data. [Chris Darroch] + + *) Introduced ap_expr API for expression evaluation. + This is adapted from mod_include, which is the first module + to use the new API. + [Nick Kew] + + *) mod_authz_dbd: When redirecting after successful login/logout per + AuthzDBDRedirectQuery, do not report authorization failure, and use + first row returned by database query instead of last row. + [Chris Darroch] + + *) mod_ldap: Correctly return all requested attribute values + when some attributes have a null value. + PR 44560 [Anders Kaseorg ] + + *) core: check symlink ownership if both FollowSymlinks and + SymlinksIfOwnerMatch are set [Nick Kew] + + *) core: fix origin checking in SymlinksIfOwnerMatch + PR 36783 [Robert L Mathews ] + + *) Activate mod_cache, mod_file_cache and mod_disk_cache as part of the + 'most' set for '--enable-modules' and '--enable-shared-mods'. Include + mod_mem_cache in 'all' as well. [Dirk-Willem van Gulik] + + *) Also install mod_so.h, mod_rewrite.h and mod_cache.h; as these + contain public function declarations which are useful for + third party module authors. PR 42431 [Dirk-Willem van Gulik]. + + *) mod_dir, mod_negotiation: pass the output filter information + to newly created sub requests; as these are later on used + as true requests with an internal redirect. This allows for + mod_cache et.al. to trap the results of the redirect. + [Dirk-Willem van Gulik, Ruediger Pluem] + + *) mod_ldap: Add support (taking advantage of the new APR capability) + for ldap rebind callback while chasing referrals. This allows direct + searches on LDAP servers (in particular MS Active Directory 2003+) + using referrals without the use of the global catalog. + PRs 26538, 40268, and 42557 [Paul J. Reder] + + *) ApacheMonitor.exe: Introduce --kill argument for use by the + installer. This will permit the installation tool to remove + all running instances before attempting to remove the .exe. + [William Rowe] + + *) mod_ssl: Add support for OCSP validation of client certificates. + PR 41123. [Marc Stern , Joe Orton] + + *) mod_serf: New module for Reverse Proxying. [Paul Querna] + + *) core: Add the option to keep aside a request body up to a certain + size that would otherwise be discarded, to be consumed by filters + such as mod_include. When enabled for a directory, POST requests + to shtml files can be passed through to embedded scripts as POST + requests, rather being downgraded to GET requests. [Graham Leggett] + + *) mod_ssl: Fix TLS upgrade (RFC 2817) support. PR 41231. [Joe Orton] + + *) scoreboard: Correctly declare ap_time_process_request. + PR 43789 [Tom Donovan ] + + *) core; scoreboard: ap_get_scoreboard_worker(sbh) now takes the sbh member + from the connection rec, ap_get_scoreboard_worker(proc, thread) will now + provide the unusual legacy lookup. [William Rowe] + + *) mpm winnt: fix null pointer dereference + PR 42572 [Davi Arnaut] + + *) mod_authnz_ldap, mod_authn_dbd: Tidy up the code to expose authn + parameters to the environment. Improve portability to + EBCDIC machines by using apr_toupper(). [Martin Kraemer] + + *) mod_ldap, mod_authnz_ldap: Add support for nested groups (i.e. the ability + to authorize an authenticated user via a "require ldap-group X" directive + where the user is not in group X, but is in a subgroup contained in X. + PR 42891 [Paul J. Reder] + + *) mod_ssl: Add support for caching SSL Sessions in memcached. [Paul Querna] + + *) apxs: Enhance -q flag to print all known variables and their values + when invoked without variable name(s). + [William Rowe, Sander Temme] + + *) apxs: Eliminate run-time check for mod_so. PR 40653. + [David M. Lee ] + + *) beos MPM: Create pmain pool and run modules' child_init hooks when + entering ap_mpm_run(), then destroy pmain when exiting ap_mpm_run(). + [Chris Darroch] + + *) netware MPM: Destroy pmain pool when exiting ap_mpm_run() so that + cleanups registered in modules' child_init hooks are performed. + [Chris Darroch] + + *) Fix issue which could cause error messages to be written to access logs + on Win32. PR 40476. [Tom Donovan ] + + *) The LockFile directive, which specifies the location of + the accept() mutex lockfile, is deprecated. Instead, the + AcceptMutex directive now takes an optional lockfile + location parameter, ala SSLMutex. [Jim Jagielski] + + *) mod_authn_dbd: Export any additional columns queried in the SQL select + into the environment with the name AUTHENTICATE_. This brings + mod_authn_dbd behaviour in line with mod_authnz_ldap. [Graham Leggett] + + *) mod_dbd: Key the storage of prepared statements on the hex string + value of server_rec, rather than the server name, as the server name + may change (eg when the server name is set) at any time, causing + weird behaviour in modules dependent on mod_dbd. [Graham Leggett] + + *) mod_proxy_fcgi: Added win32 build. [Mladen Turk] + + *) sendfile_nonblocking() takes the _brigade_ as an argument, gets + the first bucket from the brigade, finds it not to be a FILE + bucket and barfs. The fix is to pass a bucket rather than a brigade. + [Niklas Edmundsson ] + + *) mod_rewrite: support rewritemap by SQL query [Nick Kew] + + *) ap_get_server_version() has been removed. Third-party modules must + now use ap_get_server_banner() or ap_get_server_description(). + [Jeff Trawick] + + *) All MPMs: Introduce a check_config phase between pre_config and + open_logs, to allow modules to review interdependent configuration + directive values and adjust them while messages can still be logged + to the console. Handle relevant MPM directives during this phase + and format messages for both the console and the error log, as + appropriate. [Chris Darroch] + + *) core: Do not allow internal redirects like the DirectoryIndex of mod_dir + to circumvent the symbolic link checks imposed by FollowSymLinks and + SymLinksIfOwnerMatch. [Nick Kew, Ruediger Pluem, William Rowe] + + *) New SSLLogLevelDebugDump [ None (default) | IO (not bytes) | Bytes ] + configures the I/O Dump of SSL traffic, when LogLevel is set to Debug. + The default is none as this is far greater debugging resolution than + the typical administrator is prepared to untangle. [William Rowe] + + *) mod_disk_cache: If possible, check if the size of an object to cache is + within the configured boundaries before actually saving data. + [Niklas Edmundsson ] + + *) Worker and event MPMs: Remove improper scoreboard updates which were + performed in the event of a fork() failure. [Chris Darroch] + + *) Add support for fcgi:// proxies to mod_rewrite. + [Markus Schiegl ] + + *) Remove incorrect comments from scoreboard.h regarding conditional + loading of worker_score structure with mod_status, and remove unused + definitions relating to old life_status field. + [Chris Darroch ] + + *) Remove allocation of memory for unused array of lb_score pointers + in ap_init_scoreboard(). [Chris Darroch ] + + *) Add mod_proxy_fcgi, a FastCGI back end for mod_proxy. + [Garrett Rooney, Jim Jagielski, Paul Querna] + + *) Event MPM: Fill in the scoreboard's tid field. PR 38736. + [Chris Darroch ] + + *) mod_charset_lite: Remove Content-Length when output filter can + invalidate it. Warn when input filter can invalidate it. + [Jeff Trawick] + + *) Authz: Add the new module mod_authn_core that will provide common + authn directives such as 'AuthType', 'AuthName'. Move the directives + 'AuthType' and 'AuthName' out of the core module and merge mod_authz_alias + into mod_authn_core. [Brad Nicholes] + + *) Authz: Move the directives 'Order', 'Allow', 'Deny' and 'Satisfy' + into the new module mod_access_compat which can be loaded to provide + support for these directives. + [Brad Nicholes] + + *) Authz: Move the 'Require' directive from the core module as well as + add the directives '', '', '' + and 'Reject' to mod_authz_core. The new directives introduce 'AND/OR' + logic into the authorization processing. [Brad Nicholes] + + *) Authz: Add the new module mod_authz_core which acts as the + authorization provider vector and contains common authz + directives. [Brad Nicholes] + + *) Authz: Renamed mod_authz_dbm authz providers from 'group' and + 'file-group' to 'dbm-group' and 'dbm-file-group'. [Brad Nicholes] + + *) Authz: Added the new authz providers 'env', 'ip', 'host', 'all' to handle + host-based access control provided by mod_authz_host and invoked + through the 'Require' directive. [Brad Nicholes] + + *) Authz: Convert all of the authz modules from hook based to + provider based. [Brad Nicholes] + + *) mod_cache: Add CacheMinExpire directive to set the minimum time in + seconds to cache a document. + [Brian Akins , Ruediger Pluem] + + *) mod_authz_dbd: SQL authz with Login/Session support [Nick Kew] + + *) Fix typo in ProxyStatus syntax error message. + [Christophe Jaillet ] + + *) Asynchronous write completion for the Event MPM. [Brian Pane] + + *) Added an End-Of-Request bucket type. The logging of a request and + the freeing of its pool are now done when the EOR bucket is destroyed. + This has the effect of delaying the logging until right after the last + of the response is sent; ap_core_output_filter() calls the access logger + indirectly when it destroys the EOR bucket. [Brian Pane] + + *) Rewrite of logresolve support utility: IPv6 addresses are now supported + and the format of statistical output has changed. [Colm MacCarthaigh] + + *) Rewrite of ap_coreoutput_filter to do nonblocking writes [Brian Pane] + + *) Added new connection states for handler and write completion + [Brian Pane] + + *) mod_cgid: Refuse to work on Solaris 10 due to OS bugs. PR 34264. + [Justin Erenkrantz] + + *) Teach mod_ssl to use arbitrary OIDs in an SSLRequire directive, + allowing string-valued client certificate attributes to be used for + access control, as in: SSLRequire "value" in OID("1.3.6.1.4.1.18060.1") + [Martin Kraemer, David Reid] + + [Apache 2.3.0-dev includes those bug fixes and changes with the + Apache 2.2.xx tree as documented, and except as noted, below.] + +Changes with Apache 2.2.x and later: + + *) http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/CHANGES?view=markup + +Changes with Apache 2.0.x and later: + + *) http://svn.apache.org/viewvc/httpd/httpd/branches/2.0.x/CHANGES?view=markup diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..9b38f69 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,1047 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Read README.cmake before using this. + +PROJECT(HTTPD C) + +CMAKE_MINIMUM_REQUIRED(VERSION 2.8) + +INCLUDE(CheckSymbolExists) +INCLUDE(CheckCSourceCompiles) + +FIND_PACKAGE(LibXml2) +FIND_PACKAGE(Lua51) +FIND_PACKAGE(OpenSSL) +FIND_PACKAGE(ZLIB) +FIND_PACKAGE(CURL) +FIND_PACKAGE(PCRE2 COMPONENTS 8BIT) + +# Options for support libraries not supported by cmake-bundled FindFOO + +# Default to using APR trunk (libapr-2.lib) if it exists in PREFIX/lib; +# otherwise, default to APR 1.x + APR-util 1.x +IF(EXISTS "${CMAKE_INSTALL_PREFIX}/lib/libapr-2.lib") + SET(default_apr_libraries "${CMAKE_INSTALL_PREFIX}/lib/libapr-2.lib") +ELSEIF(EXISTS "${CMAKE_INSTALL_PREFIX}/lib/libapr-1.lib") + SET(ldaplib "${CMAKE_INSTALL_PREFIX}/lib/apr_ldap-1.lib") + IF(NOT EXISTS ${ldaplib}) + SET(ldaplib) + ENDIF() + SET(default_apr_libraries ${CMAKE_INSTALL_PREFIX}/lib/libapr-1.lib ${CMAKE_INSTALL_PREFIX}/lib/libaprutil-1.lib ${ldaplib}) +ELSE() + SET(default_apr_libraries) +ENDIF() + +# PCRE names its libraries differently for debug vs. release builds. +# We can't query our own CMAKE_BUILD_TYPE at configure time. +# If the debug version exists in PREFIX/lib, default to that one. +IF(PCRE2_FOUND) + SET(default_pcre_libraries "PCRE2::8BIT") + SET(default_pcre_cflags "-DHAVE_PCRE2") +ELSEIF(EXISTS "${CMAKE_INSTALL_PREFIX}/lib/pcre2-8d.lib") + SET(default_pcre_libraries ${CMAKE_INSTALL_PREFIX}/lib/pcre2-8d.lib) + SET(default_pcre_cflags "-DHAVE_PCRE2") +ELSEIF(EXISTS "${CMAKE_INSTALL_PREFIX}/lib/pcre2-8.lib") + SET(default_pcre_libraries ${CMAKE_INSTALL_PREFIX}/lib/pcre2-8.lib) + SET(default_pcre_cflags "-DHAVE_PCRE2") +ELSEIF(EXISTS "${CMAKE_INSTALL_PREFIX}/lib/pcred.lib") + SET(default_pcre_libraries ${CMAKE_INSTALL_PREFIX}/lib/pcred.lib) +ELSE() + SET(default_pcre_libraries ${CMAKE_INSTALL_PREFIX}/lib/pcre.lib) +ENDIF() + +IF(EXISTS "${CMAKE_INSTALL_PREFIX}/lib/nghttp2d.lib") + SET(default_nghttp2_libraries "${CMAKE_INSTALL_PREFIX}/lib/nghttp2d.lib") +ELSE() + SET(default_nghttp2_libraries "${CMAKE_INSTALL_PREFIX}/lib/nghttp2.lib") +ENDIF() + +IF(EXISTS "${CMAKE_INSTALL_PREFIX}/lib/brotlienc.lib") + SET(default_brotli_libraries "${CMAKE_INSTALL_PREFIX}/lib/brotlienc.lib" "${CMAKE_INSTALL_PREFIX}/lib/brotlicommon.lib") +ELSE() + SET(default_brotli_libraries) +ENDIF() + +IF(EXISTS "${CMAKE_INSTALL_PREFIX}/lib/libcurl_imp.lib") + SET(default_curl_libraries "${CMAKE_INSTALL_PREFIX}/lib/libcurl_imp.lib") +ELSEIF(EXISTS "${CMAKE_INSTALL_PREFIX}/lib/libcurl.lib") + SET(default_curl_libraries "${CMAKE_INSTALL_PREFIX}/lib/libcurl.lib") +ELSE() + SET(default_curl_libraries) +ENDIF() + +IF(EXISTS "${CMAKE_INSTALL_PREFIX}/lib/jansson.lib") + SET(default_jansson_libraries "${CMAKE_INSTALL_PREFIX}/lib/jansson.lib") +ELSE() + SET(default_jansson_libraries) +ENDIF() + +SET(APR_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE STRING "Directory with APR[-Util] include files") +SET(APR_LIBRARIES ${default_apr_libraries} CACHE STRING "APR libraries to link with") +SET(NGHTTP2_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE STRING "Directory with NGHTTP2 include files within nghttp2 subdirectory") +SET(NGHTTP2_LIBRARIES ${default_nghttp2_libraries} CACHE STRING "NGHTTP2 libraries to link with") +SET(PCRE_CFLAGS "${default_pcre_cflags}" CACHE STRING "PCRE flags for util_pcre.c compilation") +SET(PCRE_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE STRING "Directory with PCRE include files") +SET(PCRE_LIBRARIES ${default_pcre_libraries} CACHE STRING "PCRE libraries to link with") +SET(LIBXML2_ICONV_INCLUDE_DIR "" CACHE STRING "Directory with iconv include files for libxml2") +SET(LIBXML2_ICONV_LIBRARIES "" CACHE STRING "iconv libraries to link with for libxml2") +SET(BROTLI_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE STRING "Directory with include files for Brotli") +SET(BROTLI_LIBRARIES ${default_brotli_libraries} CACHE STRING "Brotli libraries to link with") +SET(CURL_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE STRING "Directory with include files for cURL") +SET(CURL_LIBRARIES ${default_curl_libraries} CACHE STRING "cURL libraries to link with") +SET(JANSSON_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE STRING "Directory with include files for jansson") +SET(JANSSON_LIBRARIES "${default_jansson_libraries}" CACHE STRING "Jansson libraries to link with") +# end support library configuration + +# Misc. options +OPTION(INSTALL_PDB "Install .pdb files (if generated)" ON) +OPTION(INSTALL_MANUAL "Install manual" ON) + +SET(ENABLE_MODULES "O" CACHE STRING "Minimum module enablement (e.g., \"i\" to build all but those without prerequisites)") +SET(WITH_MODULES "" CACHE STRING "comma-separated paths to single-file modules to statically link into the server") +SET(EXTRA_INCLUDES "" CACHE STRING "Extra include directories") +SET(EXTRA_LIBS "" CACHE STRING "Extra libraries") +SET(EXTRA_COMPILE_FLAGS "" CACHE STRING "Extra compile flags") + +IF(NOT EXISTS "${APR_INCLUDE_DIR}/apr.h") + MESSAGE(FATAL_ERROR "APR include directory ${APR_INCLUDE_DIR} is not correct.") +ENDIF() +FOREACH(onelib ${APR_LIBRARIES}) + IF(NOT EXISTS ${onelib}) + MESSAGE(FATAL_ERROR "APR library ${onelib} was not found.") + ENDIF() +ENDFOREACH() + +MACRO(DEFINE_WITH_BLANKS output_definition input_symbol input_value) + IF(MSVC_IDE OR ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} VERSION_GREATER 2.8.11) + SET(${output_definition} "-D${input_symbol}=\"${input_value}\"") + ELSE() + # command-line tool + older cmake, where extra quotes must be added and + # escaped to survive + SET(${output_definition} "-D${input_symbol}=\"\\\"${input_value}\\\"\"") + ENDIF() +ENDMACRO() + +MACRO(GET_MOD_ENABLE_RANK macro_modname macro_mod_enable_val macro_output_rank) + IF(${macro_mod_enable_val} STREQUAL "O") + SET(${macro_output_rank} 0) + ELSEIF(${macro_mod_enable_val} STREQUAL "i") + SET(${macro_output_rank} 1) + ELSEIF(${macro_mod_enable_val} STREQUAL "I") + SET(${macro_output_rank} 2) + ELSEIF(${macro_mod_enable_val} STREQUAL "a") + SET(${macro_output_rank} 3) + ELSEIF(${macro_mod_enable_val} STREQUAL "A") + SET(${macro_output_rank} 4) + ELSE() + MESSAGE(FATAL_ERROR "Unexpected enablement value \"${macro_mod_enable_val}\" for ${macro_modname}") + ENDIF() +ENDMACRO() + +GET_MOD_ENABLE_RANK("ENABLE_MODULES setting" ${ENABLE_MODULES} enable_modules_rank) + +# Figure out what APR/APU features are available +# +# CHECK_APR_FEATURE checks for features defined to 1 or 0 in apr.h or apu.h +# The symbol representing the feature will be set to TRUE or FALSE for +# compatibility with the feature tests set by FindFooPackage. +# +# (unclear why CHECK_SYMBOL_EXISTS is needed, but I was getting "found" for anything +# not defined to either 1 or 0) + +MACRO(CHECK_APR_FEATURE which_define) + SET(CMAKE_REQUIRED_INCLUDES "${APR_INCLUDE_DIR}") + CHECK_SYMBOL_EXISTS(${which_define} "apr.h;apu.h" tmp_${which_define}) + IF(${tmp_${which_define}}) + CHECK_C_SOURCE_COMPILES("#include \"${APR_INCLUDE_DIR}/apr.h\" + #include \"${APR_INCLUDE_DIR}/apu.h\" + int main() { + #ifndef ${which_define} + #error gobble + #endif + #if !${which_define} + #error gobble + #endif + return 1;}" ${which_define}) + ELSE() + SET(${which_define}) + ENDIF() + IF(${${which_define}}) + SET(${which_define} TRUE) + ELSE() + SET(${which_define} FALSE) + ENDIF() +ENDMACRO() + +CHECK_APR_FEATURE(APR_HAS_XLATE) +CHECK_APR_FEATURE(APU_HAVE_CRYPTO) + +# APR_HAS_LDAP is defined in apr_ldap.h, which exists only in apr 1.x, so use +# special code instead of CHECK_APR_FEATURE() +# As with CHECK_APR_FEATURE(), convert to a TRUE/FALSE result. +CHECK_C_SOURCE_COMPILES("#include \"${APR_INCLUDE_DIR}/apr.h\" +#include \"${APR_INCLUDE_DIR}/apr_ldap.h\" +int main() { +#if !APR_HAS_LDAP +#error gobble +#endif +return 1;}" APR_HAS_LDAP) +IF(${APR_HAS_LDAP}) + SET(APR_HAS_LDAP TRUE) +ELSE() + SET(APR_HAS_LDAP FALSE) +ENDIF() + +# See if nghttp2 exists in a configured or defaulted location +SET(NGHTTP2_FOUND TRUE) +IF(EXISTS "${NGHTTP2_INCLUDE_DIR}/nghttp2/nghttp2.h") + FOREACH(onelib ${NGHTTP2_LIBRARIES}) + IF(NOT EXISTS ${onelib}) + SET(NGHTTP2_FOUND FALSE) + ENDIF() + ENDFOREACH() +ELSE() + SET(NGHTTP2_FOUND FALSE) +ENDIF() + +# See if we have Brotli +SET(BROTLI_FOUND TRUE) +IF(EXISTS "${BROTLI_INCLUDE_DIR}/brotli/encode.h") + FOREACH(onelib ${BROTLI_LIBRARIES}) + IF(NOT EXISTS ${onelib}) + SET(BROTLI_FOUND FALSE) + ENDIF() + ENDFOREACH() +ELSE() + SET(BROTLI_FOUND FALSE) +ENDIF() + +# See if we have Jansson +SET(JANSSON_FOUND TRUE) +IF(EXISTS "${JANSSON_INCLUDE_DIR}/jansson.h") + FOREACH(onelib ${JANSSON_LIBRARIES}) + IF(NOT EXISTS ${onelib}) + SET(JANSSON_FOUND FALSE) + ENDIF() + ENDFOREACH() +ELSE() + SET(JANSSON_FOUND FALSE) +ENDIF() + + +MESSAGE(STATUS "") +MESSAGE(STATUS "Summary of feature detection:") +MESSAGE(STATUS "") +MESSAGE(STATUS "LIBXML2_FOUND ............ : ${LIBXML2_FOUND}") +MESSAGE(STATUS "LUA51_FOUND .............. : ${LUA51_FOUND}") +MESSAGE(STATUS "NGHTTP2_FOUND ............ : ${NGHTTP2_FOUND}") +MESSAGE(STATUS "OPENSSL_FOUND ............ : ${OPENSSL_FOUND}") +MESSAGE(STATUS "ZLIB_FOUND ............... : ${ZLIB_FOUND}") +MESSAGE(STATUS "BROTLI_FOUND ............. : ${BROTLI_FOUND}") +MESSAGE(STATUS "CURL_FOUND ............... : ${CURL_FOUND}") +MESSAGE(STATUS "JANSSON_FOUND ............ : ${JANSSON_FOUND}") +MESSAGE(STATUS "APR_HAS_LDAP ............. : ${APR_HAS_LDAP}") +MESSAGE(STATUS "APR_HAS_XLATE ............ : ${APR_HAS_XLATE}") +MESSAGE(STATUS "APU_HAVE_CRYPTO .......... : ${APU_HAVE_CRYPTO}") +MESSAGE(STATUS "") + +# Options for each available module +# "A" ("A"ctive) means installed and active in default .conf, fail if can't be built +# "I" ("I"nactive) means installed and inactive (LoadModule commented out) in default .conf, fail if can't be built +# "O" ("O"mit) means not installed, no LoadModule +# "a" - like "A", but ignore with a warning if any prereqs aren't available +# "i" - like "I", but ignore with a warning if any prereqs aren't available + +# Current heuristic for default enablement: +# +# Module requires a prereq and -> O +# finding/usingprereq isn't implemented +# yet +# +# Module is included by default in -> a if it has prereqs, A otherwise +# autoconf-based build +# +# Module is included in -> i if it has prereqs, I otherwise +# --enable-modules=most +# +# Otherwise -> O +# +SET(MODULE_LIST + "modules/aaa/mod_access_compat+A+mod_access compatibility" + "modules/aaa/mod_allowmethods+I+restrict allowed HTTP methods" + "modules/aaa/mod_auth_basic+A+basic authentication" + "modules/aaa/mod_auth_digest+I+RFC2617 Digest authentication" + "modules/aaa/mod_auth_form+I+form authentication" + "modules/aaa/mod_authn_anon+I+anonymous user authentication control" + "modules/aaa/mod_authn_core+A+core authentication module" + "modules/aaa/mod_authn_dbd+I+SQL-based authentication control" + "modules/aaa/mod_authn_dbm+I+DBM-based authentication control" + "modules/aaa/mod_authn_file+A+file-based authentication control" + "modules/aaa/mod_authn_socache+I+Cached authentication control" + "modules/aaa/mod_authnz_fcgi+I+FastCGI authorizer-based authentication and authorization" + "modules/aaa/mod_authnz_ldap+i+LDAP based authentication" + "modules/aaa/mod_authz_core+A+core authorization provider vector module" + "modules/aaa/mod_authz_dbd+I+SQL based authorization and Login/Session support" + "modules/aaa/mod_authz_dbm+I+DBM-based authorization control" + "modules/aaa/mod_authz_groupfile+A+'require group' authorization control" + "modules/aaa/mod_authz_host+A+host-based authorization control" + "modules/aaa/mod_authz_owner+I+'require file-owner' authorization control" + "modules/aaa/mod_authz_user+A+'require user' authorization control" + "modules/arch/win32/mod_isapi+I+isapi extension support" + "modules/cache/mod_cache+I+dynamic file caching. At least one storage management module (e.g. mod_cache_disk) is also necessary." + "modules/cache/mod_cache_disk+I+disk caching module" + "modules/cache/mod_cache_socache+I+shared object caching module" + "modules/cache/mod_file_cache+I+File cache" + "modules/cache/mod_socache_dbm+I+dbm small object cache provider" + "modules/cache/mod_socache_dc+O+distcache small object cache provider" + "modules/cache/mod_socache_memcache+I+memcache small object cache provider" + "modules/cache/mod_socache_shmcb+I+ shmcb small object cache provider" + "modules/cache/mod_socache_redis+I+redis small object cache provider" + "modules/cluster/mod_heartbeat+I+Generates Heartbeats" + "modules/cluster/mod_heartmonitor+I+Collects Heartbeats" + "modules/core/mod_macro+I+Define and use macros in configuration files" + "modules/core/mod_watchdog+I+Watchdog module" + "modules/database/mod_dbd+I+Apache DBD Framework" + "modules/dav/fs/mod_dav_fs+I+DAV provider for the filesystem." + "modules/dav/lock/mod_dav_lock+I+DAV provider for generic locking" + "modules/dav/main/mod_dav+I+WebDAV protocol handling." + "modules/debugging/mod_bucketeer+O+buckets manipulation filter. Useful only for developers and testing purposes." + "modules/debugging/mod_dumpio+I+I/O dump filter" + "modules/echo/mod_echo+O+ECHO server" + "modules/examples/mod_case_filter+O+Example uppercase conversion filter" + "modules/examples/mod_case_filter_in+O+Example uppercase conversion input filter" + "modules/examples/mod_example_hooks+O+Example hook callback handler module" + "modules/examples/mod_example_ipc+O+Example of shared memory and mutex usage" + "modules/filters/mod_brotli+i+Brotli compression support" + "modules/filters/mod_buffer+I+Filter Buffering" + "modules/filters/mod_charset_lite+i+character set translation" + "modules/filters/mod_data+O+RFC2397 data encoder" + "modules/filters/mod_deflate+i+Deflate transfer encoding support" + "modules/filters/mod_ext_filter+I+external filter module" + "modules/filters/mod_filter+A+Smart Filtering" + "modules/filters/mod_include+I+Server Side Includes" + "modules/filters/mod_proxy_html+i+Fix HTML Links in a Reverse Proxy" + "modules/filters/mod_ratelimit+I+Output Bandwidth Limiting" + "modules/filters/mod_reflector+O+Reflect request through the output filter stack" + "modules/filters/mod_reqtimeout+A+Limit time waiting for request from client" + "modules/filters/mod_request+I+Request Body Filtering" + "modules/filters/mod_sed+I+filter request and/or response bodies through sed" + "modules/filters/mod_substitute+I+response content rewrite-like filtering" + "modules/filters/mod_xml2enc+i+i18n support for markup filters" + "modules/generators/mod_asis+I+as-is filetypes" + "modules/generators/mod_autoindex+A+directory listing" + "modules/generators/mod_cgi+I+CGI scripts" + "modules/generators/mod_info+I+server information" + "modules/generators/mod_status+I+process/thread monitoring" + "modules/http/mod_mime+A+mapping of file-extension to MIME. Disabling this module is normally not recommended." + "modules/http2/mod_http2+i+HTTP/2 protocol support" + "modules/ldap/mod_ldap+i+LDAP caching and connection pooling services" + "modules/loggers/mod_log_config+A+logging configuration. You won't be able to log requests to the server without this module." + "modules/loggers/mod_log_debug+I+configurable debug logging" + "modules/loggers/mod_log_forensic+I+forensic logging" + "modules/loggers/mod_logio+I+input and output logging" + "modules/lua/mod_lua+i+Apache Lua Framework" + "modules/md/mod_md+i+Apache Managed Domains (Certificates)" + "modules/mappers/mod_actions+I+Action triggering on requests" + "modules/mappers/mod_alias+A+mapping of requests to different filesystem parts" + "modules/mappers/mod_dir+A+directory request handling" + "modules/mappers/mod_imagemap+I+server-side imagemaps" + "modules/mappers/mod_negotiation+I+content negotiation" + "modules/mappers/mod_rewrite+I+rule based URL manipulation" + "modules/mappers/mod_speling+I+correct common URL misspellings" + "modules/mappers/mod_userdir+I+mapping of requests to user-specific directories" + "modules/mappers/mod_vhost_alias+I+mass virtual hosting module" + "modules/metadata/mod_cern_meta+O+CERN-type meta files" + "modules/metadata/mod_env+A+clearing/setting of ENV vars" + "modules/metadata/mod_expires+I+Expires header control" + "modules/metadata/mod_headers+A+HTTP header control" + "modules/metadata/mod_ident+O+RFC 1413 identity check" + "modules/metadata/mod_mime_magic+O+automagically determining MIME type" + "modules/metadata/mod_remoteip+I+translate header contents to an apparent client remote_ip" + "modules/metadata/mod_setenvif+A+basing ENV vars on headers" + "modules/metadata/mod_unique_id+I+per-request unique ids" + "modules/metadata/mod_usertrack+I+user-session tracking" + "modules/metadata/mod_version+A+determining httpd version in config files" + "modules/proxy/balancers/mod_lbmethod_bybusyness+I+Apache proxy Load balancing by busyness" + "modules/proxy/balancers/mod_lbmethod_byrequests+I+Apache proxy Load balancing by request counting" + "modules/proxy/balancers/mod_lbmethod_bytraffic+I+Apache proxy Load balancing by traffic counting" + "modules/proxy/balancers/mod_lbmethod_heartbeat+I+Apache proxy Load balancing from Heartbeats" + "modules/proxy/mod_proxy_ajp+I+Apache proxy AJP module. Requires and is enabled by --enable-proxy." + "modules/proxy/mod_proxy_balancer+I+Apache proxy BALANCER module. Requires and is enabled by --enable-proxy." + "modules/proxy/mod_proxy+I+Apache proxy module" + "modules/proxy/mod_proxy_connect+I+Apache proxy CONNECT module. Requires and is enabled by --enable-proxy." + "modules/proxy/mod_proxy_express+I+mass reverse-proxy module. Requires --enable-proxy." + "modules/proxy/mod_proxy_fcgi+I+Apache proxy FastCGI module. Requires and is enabled by --enable-proxy." + "modules/proxy/mod_proxy_ftp+I+Apache proxy FTP module. Requires and is enabled by --enable-proxy." + "modules/proxy/mod_proxy_http+I+Apache proxy HTTP module. Requires and is enabled by --enable-proxy." + "modules/proxy/mod_proxy_hcheck+I+Apache proxy health check module. Requires and is enabled by --enable-proxy." + "modules/proxy/mod_proxy_scgi+I+Apache proxy SCGI module. Requires and is enabled by --enable-proxy." + "modules/proxy/mod_proxy_wstunnel+I+Apache proxy Websocket Tunnel module. Requires and is enabled by --enable-proxy." + "modules/http2/mod_proxy_http2+i+Apache proxy HTTP/2 module. Requires --enable-proxy." + "modules/session/mod_session+I+session module" + "modules/session/mod_session_cookie+I+session cookie module" + "modules/session/mod_session_crypto+i+session crypto module" + "modules/session/mod_session_dbd+I+session dbd module" + "modules/slotmem/mod_slotmem_plain+I+slotmem provider that uses plain memory" + "modules/slotmem/mod_slotmem_shm+I+slotmem provider that uses shared memory" + "modules/ssl/mod_ssl+i+SSL/TLS support" + "modules/test/mod_dialup+O+rate limits static files to dialup modem speeds" + "modules/test/mod_optional_fn_export+O+example optional function exporter" + "modules/test/mod_optional_fn_import+O+example optional function importer" + "modules/test/mod_optional_hook_export+O+example optional hook exporter" + "modules/test/mod_optional_hook_import+O+example optional hook importer" +) + +# Track which modules actually built have APIs to link against. +SET(installed_mod_libs_exps) + +# Define extra definitions, sources, headers, etc. required by some modules. +# This could be included in the master list of modules above, though it +# certainly would get a lot more unreadable. +SET(mod_apreq_extra_defines APREQ_DECLARE_EXPORT) +SET(mod_apreq_extra_sources modules/apreq/handle.c) +SET(mod_apreq_main_source modules/apreq/filter.c) +SET(mod_authz_dbd_extra_defines AUTHZ_DBD_DECLARE_EXPORT) +SET(mod_authnz_ldap_requires APR_HAS_LDAP) +SET(mod_authnz_ldap_extra_libs mod_ldap) +SET(mod_cache_extra_defines CACHE_DECLARE_EXPORT) +SET(mod_cache_extra_sources + modules/cache/cache_storage.c modules/cache/cache_util.c +) +SET(mod_cache_install_lib 1) +SET(mod_cache_disk_extra_libs mod_cache) +SET(mod_cache_socache_extra_libs mod_cache) +SET(mod_charset_lite_requires APR_HAS_XLATE) +SET(mod_dav_extra_defines DAV_DECLARE_EXPORT) +SET(mod_dav_extra_sources + modules/dav/main/liveprop.c modules/dav/main/props.c + modules/dav/main/std_liveprop.c modules/dav/main/providers.c + modules/dav/main/util.c modules/dav/main/util_lock.c +) +SET(mod_dav_install_lib 1) +SET(mod_dav_fs_extra_sources + modules/dav/fs/dbm.c modules/dav/fs/lock.c + modules/dav/fs/repos.c +) +SET(mod_dav_fs_extra_libs mod_dav) +SET(mod_dav_lock_extra_sources modules/dav/lock/locks.c) +SET(mod_dav_lock_extra_libs mod_dav) +SET(mod_dbd_extra_defines DBD_DECLARE_EXPORT) +SET(mod_deflate_requires ZLIB_FOUND) +IF(ZLIB_FOUND) + SET(mod_deflate_extra_includes ${ZLIB_INCLUDE_DIR}) + SET(mod_deflate_extra_libs ${ZLIB_LIBRARIES}) +ENDIF() +SET(mod_brotli_requires BROTLI_FOUND) +IF(BROTLI_FOUND) + SET(mod_brotli_extra_includes ${BROTLI_INCLUDE_DIR}) + SET(mod_brotli_extra_libs ${BROTLI_LIBRARIES}) +ENDIF() +SET(mod_firehose_requires SOMEONE_TO_MAKE_IT_COMPILE_ON_WINDOWS) +SET(mod_heartbeat_extra_libs mod_watchdog) +SET(mod_http2_requires NGHTTP2_FOUND) +SET(mod_http2_extra_defines ssize_t=long) +SET(mod_http2_extra_includes ${NGHTTP2_INCLUDE_DIR}) +SET(mod_http2_extra_libs ${NGHTTP2_LIBRARIES}) +SET(mod_http2_extra_sources + modules/http2/h2_bucket_beam.c modules/http2/h2_bucket_eos.c + modules/http2/h2_c1.c modules/http2/h2_c1_io.c + modules/http2/h2_c2.c modules/http2/h2_c2_filter.c + modules/http2/h2_config.c modules/http2/h2_conn_ctx.c + modules/http2/h2_mplx.c modules/http2/h2_headers.c + modules/http2/h2_protocol.c modules/http2/h2_push.c + modules/http2/h2_request.c modules/http2/h2_session.c + modules/http2/h2_stream.c modules/http2/h2_switch.c + modules/http2/h2_util.c modules/http2/h2_workers.c + modules/http2/h2_ws.c +) +SET(mod_ldap_extra_defines LDAP_DECLARE_EXPORT) +SET(mod_ldap_extra_libs wldap32) +SET(mod_ldap_extra_sources + modules/ldap/util_ldap_cache.c modules/ldap/util_ldap_cache_mgr.c +) +SET(mod_ldap_main_source modules/ldap/util_ldap.c) +SET(mod_ldap_requires APR_HAS_LDAP) +SET(mod_lua_extra_defines AP_LUA_DECLARE_EXPORT) +SET(mod_lua_extra_includes ${LUA_INCLUDE_DIR}) +SET(mod_lua_extra_libs ${LUA_LIBRARIES}) +SET(mod_lua_extra_sources + modules/lua/lua_apr.c modules/lua/lua_config.c + modules/lua/lua_passwd.c modules/lua/lua_request.c + modules/lua/lua_vmprep.c modules/lua/lua_dbd.c +) +SET(mod_lua_requires LUA51_FOUND) +SET(mod_md_requires OPENSSL_FOUND CURL_FOUND JANSSON_FOUND) +SET(mod_md_extra_includes ${OPENSSL_INCLUDE_DIR} ${CURL_INCLUDE_DIR} ${JANSSON_INCLUDE_DIR}) +SET(mod_md_extra_libs ${OPENSSL_LIBRARIES} ${CURL_LIBRARIES} ${JANSSON_LIBRARIES} mod_watchdog) +SET(mod_md_extra_sources + modules/md/md_acme.c modules/md/md_acme_acct.c + modules/md/md_acme_authz.c modules/md/md_acme_drive.c + modules/md/md_acmev2_drive.c modules/md/md_event.c + modules/md/md_acme_order.c modules/md/md_core.c + modules/md/md_curl.c modules/md/md_crypt.c + modules/md/md_http.c modules/md/md_json.c + modules/md/md_jws.c modules/md/md_log.c + modules/md/md_result.c modules/md/md_reg.c + modules/md/md_status.c modules/md/md_store.c + modules/md/md_store_fs.c modules/md/md_time.c + modules/md/md_ocsp.c modules/md/md_util.c + modules/md/mod_md_config.c modules/md/mod_md_drive.c + modules/md/mod_md_os.c modules/md/mod_md_status.c + modules/md/mod_md_ocsp.c modules/md/md_tailscale.c +) +SET(mod_optional_hook_export_extra_defines AP_DECLARE_EXPORT) # bogus reuse of core API prefix +SET(mod_proxy_extra_defines PROXY_DECLARE_EXPORT) +SET(mod_proxy_extra_sources modules/proxy/proxy_util.c) +SET(mod_proxy_install_lib 1) +SET(mod_proxy_ajp_extra_sources + modules/proxy/ajp_header.c modules/proxy/ajp_link.c + modules/proxy/ajp_msg.c modules/proxy/ajp_utils.c +) +SET(mod_proxy_ajp_extra_libs mod_proxy) +SET(mod_proxy_balancer_extra_libs mod_proxy) +SET(mod_proxy_connect_extra_libs mod_proxy) +SET(mod_proxy_express_extra_libs mod_proxy) +SET(mod_proxy_fcgi_extra_libs mod_proxy) +SET(mod_proxy_ftp_extra_libs mod_proxy) +SET(mod_proxy_hcheck_extra_libs mod_proxy) +SET(mod_proxy_http_extra_libs mod_proxy) +SET(mod_proxy_html_requires LIBXML2_FOUND) +IF(LIBXML2_FOUND) + SET(mod_proxy_html_extra_includes "${LIBXML2_INCLUDE_DIR};${LIBXML2_ICONV_INCLUDE_DIR}") + SET(mod_proxy_html_extra_libs "${LIBXML2_LIBRARIES};${LIBXML2_ICONV_LIBRARIES}") +ENDIF() +SET(mod_proxy_scgi_extra_libs mod_proxy) +SET(mod_proxy_wstunnel_extra_libs mod_proxy) +SET(mod_proxy_http2_requires NGHTTP2_FOUND) +SET(mod_proxy_http2_extra_defines ssize_t=long) +SET(mod_proxy_http2_extra_includes ${NGHTTP2_INCLUDE_DIR}) +SET(mod_proxy_http2_extra_libs ${NGHTTP2_LIBRARIES} mod_proxy) +SET(mod_proxy_http2_extra_sources + modules/http2/h2_proxy_session.c modules/http2/h2_proxy_util.c +) +SET(mod_ratelimit_extra_defines AP_RL_DECLARE_EXPORT) +SET(mod_sed_extra_sources + modules/filters/regexp.c modules/filters/sed0.c + modules/filters/sed1.c +) +SET(mod_serf_requires AN_UNIMPLEMENTED_SUPPORT_LIBRARY_REQUIREMENT) +SET(mod_session_extra_defines SESSION_DECLARE_EXPORT) +SET(mod_session_install_lib 1) +SET(mod_session_cookie_extra_libs mod_session) +SET(mod_session_crypto_requires APU_HAVE_CRYPTO) +SET(mod_session_crypto_extra_libs mod_session) +SET(mod_session_dbd_extra_libs mod_session) +SET(mod_socache_dc_requires AN_UNIMPLEMENTED_SUPPORT_LIBRARY_REQUIREMENT) +SET(mod_ssl_extra_defines SSL_DECLARE_EXPORT) +SET(mod_ssl_requires OPENSSL_FOUND) +IF(OPENSSL_FOUND) + SET(mod_ssl_extra_includes ${OPENSSL_INCLUDE_DIR}) + SET(mod_ssl_extra_libs ${OPENSSL_LIBRARIES}) +ENDIF() +SET(mod_ssl_extra_sources + modules/ssl/ssl_engine_config.c + modules/ssl/ssl_engine_init.c modules/ssl/ssl_engine_io.c + modules/ssl/ssl_engine_kernel.c modules/ssl/ssl_engine_log.c + modules/ssl/ssl_engine_mutex.c modules/ssl/ssl_engine_ocsp.c + modules/ssl/ssl_engine_pphrase.c modules/ssl/ssl_engine_rand.c + modules/ssl/ssl_engine_vars.c modules/ssl/ssl_scache.c + modules/ssl/ssl_util.c modules/ssl/ssl_util_ocsp.c + modules/ssl/ssl_util_ssl.c modules/ssl/ssl_util_stapling.c +) +SET(mod_status_extra_defines STATUS_DECLARE_EXPORT) +SET(mod_watchdog_install_lib 1) +SET(mod_xml2enc_requires LIBXML2_FOUND) +IF(LIBXML2_FOUND) + SET(mod_xml2enc_extra_includes "${LIBXML2_INCLUDE_DIR};${LIBXML2_ICONV_INCLUDE_DIR}") + SET(mod_xml2enc_extra_libs "${LIBXML2_LIBRARIES};${LIBXML2_ICONV_LIBRARIES}") +ENDIF() +SET(mod_watchdog_extra_defines AP_WD_DECLARE_EXPORT) + +SET(MODULE_PATHS) +FOREACH (modinfo ${MODULE_LIST}) + STRING(REGEX REPLACE "([^+]*)\\+([^+]*)\\+([^+]*)" "\\1;\\2;\\3" modinfolist ${modinfo}) + SET(path_to_module) + SET(defaultenable) + SET(helptext) + FOREACH(i ${modinfolist}) + IF("${path_to_module}" STREQUAL "") + SET(path_to_module ${i}) + ELSEIF("${defaultenable}" STREQUAL "") + SET(defaultenable ${i}) + ELSEIF("${helptext}" STREQUAL "") + SET(helptext ${i}) + ELSE() + MESSAGE(FATAL_ERROR "Unexpected field or plus sign in >${modinfo}<") + ENDIF() + ENDFOREACH() + + # MESSAGE(" path to module: ${path_to_module}") + # MESSAGE("enablement by default: ${defaultenable}") + # MESSAGE(" help text: ${helptext}") + + STRING(REGEX REPLACE ".*/(mod_[^\\+]+)" "\\1" mod_name ${path_to_module}) + STRING(REGEX REPLACE "mod_(.*)" "\\1" mod_shortname ${mod_name}) + + STRING(TOUPPER "ENABLE_${mod_shortname}" mod_option_name) + + SET(${mod_option_name} ${defaultenable} CACHE STRING ${helptext}) + SET(MODULE_PATHS "${MODULE_PATHS};${path_to_module}") + +ENDFOREACH() + +SET(install_targets) +SET(install_bin_pdb) +SET(install_modules) # special handling vs. other installed targets +SET(install_modules_pdb) +SET(builtin_module_shortnames "win32 mpm_winnt http so") # core added automatically +SET(extra_builtin_modules) # the ones specified with -DWITH_MODULES= + +IF(WITH_MODULES) # modules statically linked with the server + STRING(REPLACE "," ";" WITH_MODULE_LIST ${WITH_MODULES}) + FOREACH(static_mod ${WITH_MODULE_LIST}) + STRING(REGEX MATCH "[^/]+\\.c" mod_basename ${static_mod}) + STRING(REGEX REPLACE "^mod_(.*)\\.c" "\\1" mod_module_name ${mod_basename}) + SET(builtin_module_shortnames "${builtin_module_shortnames} ${mod_module_name}") + CONFIGURE_FILE(${static_mod} ${PROJECT_BINARY_DIR}/ COPYONLY) + SET(extra_builtin_modules ${extra_builtin_modules} ${PROJECT_BINARY_DIR}/${mod_basename}) + ENDFOREACH() + EXECUTE_PROCESS(COMMAND cmd /c "echo ${builtin_module_shortnames}| awk -f ${CMAKE_CURRENT_SOURCE_DIR}/build/build-modules-c.awk > ${PROJECT_BINARY_DIR}/modules.c" RESULT_VARIABLE rv) + IF(rv) + MESSAGE(FATAL_ERROR "build-modules-c.awk failed (${rv})") + ENDIF() +ELSE() + # no extra built-in modules; use the default modules.c to avoid the awk prereq + CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/os/win32/modules.c ${PROJECT_BINARY_DIR}/ COPYONLY) +ENDIF() + +# for easy reference from .dll/.so builds +CONFIGURE_FILE(os/win32/BaseAddr.ref ${PROJECT_BINARY_DIR}/ COPYONLY) + +ADD_EXECUTABLE(gen_test_char server/gen_test_char.c) +ADD_CUSTOM_COMMAND( + COMMENT "Generating character tables, test_char.h, for current locale" + DEPENDS gen_test_char + COMMAND $ > ${PROJECT_BINARY_DIR}/test_char.h + OUTPUT ${PROJECT_BINARY_DIR}/test_char.h +) +ADD_CUSTOM_TARGET( + test_char_header ALL + DEPENDS ${PROJECT_BINARY_DIR}/test_char.h +) + +SET(HTTPD_MAIN_SOURCES + server/main.c +) + +SET(LIBHTTPD_SOURCES + ${extra_builtin_modules} + ${PROJECT_BINARY_DIR}/modules.c + modules/arch/win32/mod_win32.c + modules/core/mod_so.c + modules/http/byterange_filter.c + modules/http/chunk_filter.c + modules/http/http_core.c + modules/http/http_etag.c + modules/http/http_filters.c + modules/http/http_protocol.c + modules/http/http_request.c + os/win32/ap_regkey.c + os/win32/util_win32.c + server/buildmark.c + server/config.c + server/connection.c + server/core.c + server/core_filters.c + server/eoc_bucket.c + server/eor_bucket.c + server/error_bucket.c + server/listen.c + server/log.c + server/mpm/winnt/child.c + server/mpm/winnt/mpm_winnt.c + server/mpm/winnt/nt_eventlog.c + server/mpm/winnt/service.c + server/mpm_common.c + server/protocol.c + server/provider.c + server/request.c + server/ssl.c + server/scoreboard.c + server/util.c + server/util_cfgtree.c + server/util_cookies.c + server/util_debug.c + server/util_expr_eval.c + server/util_expr_parse.c + server/util_fcgi.c + server/util_expr_scan.c + server/util_filter.c + server/util_md5.c + server/util_mutex.c + server/util_pcre.c + server/util_regex.c + server/util_script.c + server/util_time.c + server/util_xml.c + server/vhost.c +) + +CONFIGURE_FILE(os/win32/win32_config_layout.h + ${PROJECT_BINARY_DIR}/ap_config_layout.h) + +SET(HTTPD_INCLUDE_DIRECTORIES + ${PROJECT_BINARY_DIR} + ${EXTRA_INCLUDES} + # see discussion in cmake bug 13188 regarding oddities with relative paths + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/os/win32 + ${CMAKE_CURRENT_SOURCE_DIR}/modules/core + ${CMAKE_CURRENT_SOURCE_DIR}/modules/database + ${CMAKE_CURRENT_SOURCE_DIR}/modules/dav/main + ${CMAKE_CURRENT_SOURCE_DIR}/modules/filters + ${CMAKE_CURRENT_SOURCE_DIR}/modules/generators + ${CMAKE_CURRENT_SOURCE_DIR}/modules/http2 + ${CMAKE_CURRENT_SOURCE_DIR}/modules/md + ${CMAKE_CURRENT_SOURCE_DIR}/modules/proxy + ${CMAKE_CURRENT_SOURCE_DIR}/modules/session + ${CMAKE_CURRENT_SOURCE_DIR}/modules/ssl + ${CMAKE_CURRENT_SOURCE_DIR}/server + ${CMAKE_CURRENT_SOURCE_DIR}/server/mpm/winnt + ${APR_INCLUDE_DIR} + ${PCRE_INCLUDE_DIR} +) + +# The .h files we install from outside the main include directory +# largely parallel the include directories above. +SET(other_installed_h + ${PROJECT_BINARY_DIR}/ap_config_layout.h + ${CMAKE_CURRENT_SOURCE_DIR}/os/win32/os.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/cache/mod_cache.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/cache/cache_common.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/core/mod_so.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/core/mod_watchdog.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/database/mod_dbd.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/dav/main/mod_dav.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/filters/mod_include.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/filters/mod_xml2enc.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/generators/mod_cgi.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/generators/mod_status.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/http2/mod_http2.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/loggers/mod_log_config.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/mappers/mod_rewrite.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/proxy/mod_proxy.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/session/mod_session.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/ssl/mod_ssl.h + ${CMAKE_CURRENT_SOURCE_DIR}/modules/ssl/mod_ssl_openssl.h +) +# When mod_serf is buildable, don't forget to copy modules/proxy/mod_serf.h + +INCLUDE_DIRECTORIES(${HTTPD_INCLUDE_DIRECTORIES}) + +SET(HTTPD_SYSTEM_LIBS + ws2_32 + mswsock +) + +########### HTTPD MODULES ############ +SET(LoadModules) +SET(mods_built_and_loaded) +SET(mods_built_but_not_loaded) +SET(mods_omitted) +FOREACH (mod ${MODULE_PATHS}) + # Build different forms of the module name; e.g., + # mod_name->mod_cgi, mod_module_name->cgi_module, mod_shortname->cgi + STRING(REGEX REPLACE ".*/(mod_[^\\+]+)" "\\1" mod_name ${mod}) + STRING(REGEX REPLACE "mod_(.*)" "\\1_module" mod_module_name ${mod_name}) + STRING(REGEX REPLACE "mod_(.*)" "\\1" mod_shortname ${mod_name}) + + # Is it enabled? + STRING(TOUPPER "ENABLE_${mod_shortname}" enable_mod) + SET(enable_mod_val ${${enable_mod}}) + + # Is ENABLE_MODULES set to a higher value? + GET_MOD_ENABLE_RANK(${mod_name} ${enable_mod_val} this_mod_rank) + IF(this_mod_rank LESS enable_modules_rank) + # Use the value from ENABLE_MODULES + SET(enable_mod_val ${ENABLE_MODULES}) + ENDIF() + + IF(NOT ${enable_mod_val} STREQUAL "O") # build of module is desired + SET(mod_requires "${mod_name}_requires") + STRING(TOUPPER ${enable_mod_val} enable_mod_val_upper) + IF(NOT "${${mod_requires}}" STREQUAL "") # module has some prerequisite + FOREACH (required ${${mod_requires}}) + IF(NOT ${required}) # prerequisite doesn't exist + IF(NOT ${enable_mod_val} STREQUAL ${enable_mod_val_upper}) # lower case, so optional based on prereq + MESSAGE(STATUS "${mod_name} was requested but couldn't be built due to a missing prerequisite (${required})") + SET(enable_mod_val_upper "O") # skip due to missing prerequisite + ELSE() # must be upper case "A" or "I" (or coding error above) + MESSAGE(FATAL_ERROR "${mod_name} was requested but couldn't be built due to a missing prerequisite (${required})") + ENDIF() + ENDIF() + ENDFOREACH() + ENDIF() + # map a->A, i->I, O->O for remaining logic since prereq checking is over + SET(enable_mod_val ${enable_mod_val_upper}) + ENDIF() + + IF(${enable_mod_val} STREQUAL "O") + # ignore + SET(mods_omitted ${mods_omitted} ${mod_name}) + ELSE() + # Handle whether or not the LoadModule is commented out. + IF(${enable_mod_val} STREQUAL "A") + SET(LoadModules "${LoadModules}LoadModule ${mod_module_name} modules/${mod_name}.so\n") + SET(mods_built_and_loaded ${mods_built_and_loaded} ${mod_name}) + ELSEIF(${enable_mod_val} STREQUAL "I") + SET(LoadModules "${LoadModules}# LoadModule ${mod_module_name} modules/${mod_name}.so\n") + SET(mods_built_but_not_loaded ${mods_built_but_not_loaded} ${mod_name}) + ELSE() + MESSAGE(FATAL_ERROR "${enable_mod} must be set to \"A\", \"I\", or \"O\" instead of \"${enable_mod_val}\"") + ENDIF() + + # Handle building it. + SET(mod_main_source "${mod_name}_main_source") + SET(mod_extra_sources "${mod_name}_extra_sources") + + IF("${${mod_main_source}}" STREQUAL "") + SET(tmp_mod_main_source "${mod}.c") + ELSE() + SET(tmp_mod_main_source ${${mod_main_source}}) + ENDIF() + SET(all_mod_sources ${tmp_mod_main_source} ${${mod_extra_sources}}) + ADD_LIBRARY(${mod_name} SHARED ${all_mod_sources} build/win32/httpd.rc) + SET(install_modules ${install_modules} ${mod_name}) + SET(install_modules_pdb ${install_modules_pdb} "$") + IF("${${mod_name}_install_lib}") + SET(installed_mod_libs_exps + ${installed_mod_libs_exps} + "$" + "$/${mod_name}.exp" + ) + ENDIF() + SET(mod_extra_libs "${mod_name}_extra_libs") + SET_TARGET_PROPERTIES(${mod_name} PROPERTIES + SUFFIX .so + LINK_FLAGS /base:@${PROJECT_BINARY_DIR}/BaseAddr.ref,${mod_name}.so + ) + TARGET_LINK_LIBRARIES(${mod_name} ${${mod_extra_libs}} libhttpd ${EXTRA_LIBS} ${APR_LIBRARIES} ${HTTPD_SYSTEM_LIBS}) + DEFINE_WITH_BLANKS(define_long_name "LONG_NAME" "${mod_name} for Apache HTTP Server") + SET_TARGET_PROPERTIES(${mod_name} PROPERTIES COMPILE_FLAGS "${define_long_name} -DBIN_NAME=${mod_name}.so ${EXTRA_COMPILE_FLAGS}") + + # Extra defines? + SET(mod_extra_defines "${mod_name}_extra_defines") + IF(NOT ${${mod_extra_defines}} STREQUAL "") + SET_TARGET_PROPERTIES(${mod_name} PROPERTIES COMPILE_DEFINITIONS ${${mod_extra_defines}}) + ENDIF() + + # Extra includes? + SET(mod_extra_includes "${mod_name}_extra_includes") + IF(NOT "${${mod_extra_includes}}" STREQUAL "") + SET(tmp_includes ${HTTPD_INCLUDE_DIRECTORIES} ${${mod_extra_includes}}) + SET_TARGET_PROPERTIES(${mod_name} PROPERTIES INCLUDE_DIRECTORIES "${tmp_includes}") + GET_PROPERTY(tmp_includes TARGET ${mod_name} PROPERTY INCLUDE_DIRECTORIES) + ENDIF() + + ENDIF() +ENDFOREACH() + +########### HTTPD LIBRARIES ############ +ADD_LIBRARY(libhttpd SHARED ${LIBHTTPD_SOURCES} build/win32/httpd.rc) +SET_TARGET_PROPERTIES(libhttpd PROPERTIES + LINK_FLAGS /base:@${PROJECT_BINARY_DIR}/BaseAddr.ref,libhttpd.dll +) +SET(install_targets ${install_targets} libhttpd) +SET(install_bin_pdb ${install_bin_pdb} $) +TARGET_LINK_LIBRARIES(libhttpd ${EXTRA_LIBS} ${APR_LIBRARIES} ${PCRE_LIBRARIES} ${HTTPD_SYSTEM_LIBS}) +DEFINE_WITH_BLANKS(define_long_name "LONG_NAME" "Apache HTTP Server Core") +SET_TARGET_PROPERTIES(libhttpd PROPERTIES COMPILE_FLAGS "-DAP_DECLARE_EXPORT ${define_long_name} ${PCRE_CFLAGS} -DBIN_NAME=libhttpd.dll ${EXTRA_COMPILE_FLAGS}") +ADD_DEPENDENCIES(libhttpd test_char_header) + +########### HTTPD EXECUTABLES ########## +ADD_EXECUTABLE(httpd server/main.c build/win32/httpd.rc) +SET(install_targets ${install_targets} httpd) +SET(install_bin_pdb ${install_bin_pdb} $) +DEFINE_WITH_BLANKS(define_long_name "LONG_NAME" "Apache HTTP Server") +SET_TARGET_PROPERTIES(httpd PROPERTIES COMPILE_FLAGS "-DAPP_FILE ${define_long_name} -DBIN_NAME=httpd.exe -DICON_FILE=${CMAKE_SOURCE_DIR}/build/win32/apache.ico ${EXTRA_COMPILE_FLAGS}") +TARGET_LINK_LIBRARIES(httpd libhttpd ${EXTRA_LIBS}) + +SET(standard_support + ab + htcacheclean + htdbm + htdigest + htpasswd + httxt2dbm + logresolve + rotatelogs +) + +SET(htdbm_extra_sources support/passwd_common.c) +SET(htpasswd_extra_sources support/passwd_common.c) + +FOREACH(pgm ${standard_support}) + SET(extra_sources ${pgm}_extra_sources) + ADD_EXECUTABLE(${pgm} support/${pgm}.c ${${extra_sources}} build/win32/httpd.rc) + SET(install_targets ${install_targets} ${pgm}) + SET(install_bin_pdb ${install_bin_pdb} $) + DEFINE_WITH_BLANKS(define_long_name "LONG_NAME" "Apache HTTP Server ${pgm} program") + SET_TARGET_PROPERTIES(${pgm} PROPERTIES COMPILE_FLAGS "-DAPP_FILE ${define_long_name} -DBIN_NAME=${pgm}.exe ${EXTRA_COMPILE_FLAGS}") + TARGET_LINK_LIBRARIES(${pgm} ${EXTRA_LIBS} ${APR_LIBRARIES}) +ENDFOREACH() + +IF(OPENSSL_FOUND) + ADD_EXECUTABLE(abs support/ab.c build/win32/httpd.rc) + SET(install_targets ${install_targets} abs) + SET(install_bin_pdb ${install_bin_pdb} $) + SET_TARGET_PROPERTIES(abs PROPERTIES COMPILE_DEFINITIONS HAVE_OPENSSL) + SET(tmp_includes ${HTTPD_INCLUDE_DIRECTORIES} ${OPENSSL_INCLUDE_DIR}) + SET_TARGET_PROPERTIES(abs PROPERTIES INCLUDE_DIRECTORIES "${tmp_includes}") + DEFINE_WITH_BLANKS(define_long_name "LONG_NAME" "Apache HTTP Server ab/SSL program") + SET_TARGET_PROPERTIES(abs PROPERTIES COMPILE_FLAGS "-DAPP_FILE ${define_long_name} -DBIN_NAME=abs.exe ${EXTRA_COMPILE_FLAGS}") + TARGET_LINK_LIBRARIES(abs ${EXTRA_LIBS} ${APR_LIBRARIES} ${OPENSSL_LIBRARIES}) +ENDIF() +GET_PROPERTY(tmp_includes TARGET ab PROPERTY INCLUDE_DIRECTORIES) + +# getting duplicate manifest error with ApacheMonitor +# ADD_EXECUTABLE(ApacheMonitor support/win32/ApacheMonitor.c support/win32/ApacheMonitor.rc) +# SET(install_targets ${install_targets} ApacheMonitor) +# SET(install_bin_pdb ${install_bin_pdb} $) +# SET_TARGET_PROPERTIES(ApacheMonitor PROPERTIES WIN32_EXECUTABLE TRUE) +# SET_TARGET_PROPERTIES(ApacheMonitor PROPERTIES COMPILE_FLAGS "-DAPP_FILE -DLONG_NAME=ApacheMonitor -DBIN_NAME=ApacheMonitor.exe ${EXTRA_COMPILE_FLAGS}") +# TARGET_LINK_LIBRARIES(ApacheMonitor ${EXTRA_LIBS} ${HTTPD_SYSTEM_LIBS} comctl32 wtsapi32) + +########### CONFIGURATION FILES ########### +# Set up variables used in the .conf file templates +SET(LoadModule "${LoadModules}") +SET(Port "80" CACHE STRING "http port to listen on") +SET(SSLPort "443" CACHE STRING "https port to listen on") +SET(ServerRoot "${CMAKE_INSTALL_PREFIX}") +SET(exp_cgidir "${CMAKE_INSTALL_PREFIX}/cgi-bin") +SET(exp_htdocsdir "${CMAKE_INSTALL_PREFIX}/htdocs") +SET(exp_iconsdir "${CMAKE_INSTALL_PREFIX}/icons") +SET(exp_errordir "${CMAKE_INSTALL_PREFIX}/error") +SET(exp_manualdir "${CMAKE_INSTALL_PREFIX}/manual") +SET(rel_logfiledir "logs") +SET(rel_runtimedir "logs") +SET(rel_sysconfdir "conf") +FILE(GLOB_RECURSE conffiles RELATIVE ${CMAKE_SOURCE_DIR}/docs/conf "docs/conf/*") +FOREACH(template ${conffiles}) + STRING(REPLACE ".conf.in" ".conf" conf ${template}) + FILE(READ "docs/conf/${template}" template_text) + IF(template MATCHES ".conf.in$") + # substitute @var@/@@var@@ in .conf.in + STRING(REPLACE "@@" "@" template_text ${template_text}) + STRING(CONFIGURE "${template_text}" template_text @ONLY) + ENDIF() + FILE(WRITE ${CMAKE_BINARY_DIR}/conf/original/${conf} "${template_text}") + FILE(WRITE ${CMAKE_BINARY_DIR}/conf/${conf} "${template_text}") +ENDFOREACH() + +########### INSTALLATION ########### +INSTALL(TARGETS ${install_targets} + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + ) +INSTALL(TARGETS ${install_modules} + RUNTIME DESTINATION modules + ) + +IF(INSTALL_PDB) + INSTALL(FILES ${install_bin_pdb} + DESTINATION bin + CONFIGURATIONS RelWithDebInfo Debug) + + INSTALL(FILES ${install_modules_pdb} + DESTINATION modules + CONFIGURATIONS RelWithDebInfo Debug) +ENDIF() + +INSTALL(DIRECTORY include/ DESTINATION include + FILES_MATCHING PATTERN "*.h" +) +INSTALL(FILES ${other_installed_h} DESTINATION include) +INSTALL(FILES ${installed_mod_libs_exps} DESTINATION lib) +INSTALL(FILES "$/libhttpd.exp" DESTINATION LIB) + +IF(INSTALL_MANUAL) # Silly? This takes a while, and a dev doesn't need it. + INSTALL(DIRECTORY docs/manual/ DESTINATION manual) +ENDIF() + +INSTALL(DIRECTORY DESTINATION logs) +INSTALL(DIRECTORY DESTINATION cgi-bin) + +INSTALL(CODE "EXECUTE_PROCESS(COMMAND perl \"${CMAKE_CURRENT_SOURCE_DIR}/build/cpR_noreplace.pl\" \"${CMAKE_CURRENT_SOURCE_DIR}/docs/error\" \"${CMAKE_INSTALL_PREFIX}/error\" ifdestmissing)") + +INSTALL(CODE "EXECUTE_PROCESS(COMMAND perl \"${CMAKE_CURRENT_SOURCE_DIR}/build/cpR_noreplace.pl\" \"${CMAKE_CURRENT_SOURCE_DIR}/docs/docroot\" \"${CMAKE_INSTALL_PREFIX}/htdocs\" ifdestmissing)") + +INSTALL(CODE "EXECUTE_PROCESS(COMMAND perl \"${CMAKE_CURRENT_SOURCE_DIR}/build/cpR_noreplace.pl\" \"${CMAKE_CURRENT_SOURCE_DIR}/docs/icons\" \"${CMAKE_INSTALL_PREFIX}/icons\" ifdestmissing)") + +# Copy generated .conf files from the build directory to the install, +# without overwriting stuff already there. +INSTALL(CODE "EXECUTE_PROCESS(COMMAND perl \"${CMAKE_CURRENT_SOURCE_DIR}/build/cpR_noreplace.pl\" \"${CMAKE_BINARY_DIR}/conf\" \"${CMAKE_INSTALL_PREFIX}/conf\")") +# But conf/original is supposed to be overwritten. +# Note: FILE(TO_NATIVE_PATH ...) leaves the backslashes unescaped, which +# generates warnings. Just do it manually since this build only supports +# Windows anyway. +STRING(REPLACE "/" "\\\\" native_src ${CMAKE_BINARY_DIR}/conf/original) +STRING(REPLACE "/" "\\\\" native_dest ${CMAKE_INSTALL_PREFIX}/conf/original) +INSTALL(CODE "EXECUTE_PROCESS(COMMAND xcopy \"${native_src}\" \"${native_dest}\" /Q /S /Y)") + +STRING(TOUPPER "${CMAKE_BUILD_TYPE}" buildtype) +MESSAGE(STATUS "") +MESSAGE(STATUS "") +MESSAGE(STATUS "Apache httpd configuration summary:") +MESSAGE(STATUS "") +MESSAGE(STATUS " Build type ...................... : ${CMAKE_BUILD_TYPE}") +MESSAGE(STATUS " Install .pdb (if available)...... : ${INSTALL_PDB}") +MESSAGE(STATUS " Install manual .................. : ${INSTALL_MANUAL}") +MESSAGE(STATUS " Install prefix .................. : ${CMAKE_INSTALL_PREFIX}") +MESSAGE(STATUS " C compiler ...................... : ${CMAKE_C_COMPILER}") +MESSAGE(STATUS " APR include directory ........... : ${APR_INCLUDE_DIR}") +MESSAGE(STATUS " APR libraries ................... : ${APR_LIBRARIES}") +MESSAGE(STATUS " OpenSSL include directory ....... : ${OPENSSL_INCLUDE_DIR}") +MESSAGE(STATUS " OpenSSL libraries ............... : ${OPENSSL_LIBRARIES}") +MESSAGE(STATUS " PCRE include directory .......... : ${PCRE_INCLUDE_DIR}") +MESSAGE(STATUS " PCRE libraries .................. : ${PCRE_LIBRARIES}") +MESSAGE(STATUS " libxml2 iconv prereq include dir. : ${LIBXML2_ICONV_INCLUDE_DIR}") +MESSAGE(STATUS " libxml2 iconv prereq libraries .. : ${LIBXML2_ICONV_LIBRARIES}") +MESSAGE(STATUS " Brotli include directory......... : ${BROTLI_INCLUDE_DIR}") +MESSAGE(STATUS " Brotli libraries ................ : ${BROTLI_LIBRARIES}") +MESSAGE(STATUS " Curl include directory........... : ${CURL_INCLUDE_DIR}") +MESSAGE(STATUS " Curl libraries .................. : ${CURL_LIBRARIES}") +MESSAGE(STATUS " Jansson include directory ....... : ${JANSSON_INCLUDE_DIR}") +MESSAGE(STATUS " Jansson libraries ............... : ${JANSSON_LIBRARIES}") +MESSAGE(STATUS " Extra include directories ....... : ${EXTRA_INCLUDES}") +MESSAGE(STATUS " Extra compile flags ............. : ${EXTRA_COMPILE_FLAGS}") +MESSAGE(STATUS " Extra libraries ................. : ${EXTRA_LIBS}") + +MESSAGE(STATUS " Modules built and loaded:") +FOREACH(mod ${mods_built_and_loaded}) + MESSAGE(STATUS " ${mod}") +ENDFOREACH() + +MESSAGE(STATUS " Modules built but not loaded:") +FOREACH(mod ${mods_built_but_not_loaded}) + MESSAGE(STATUS " ${mod}") +ENDFOREACH() + +MESSAGE(STATUS " Modules not built:") +FOREACH(mod ${mods_omitted}) + MESSAGE(STATUS " ${mod}") +ENDFOREACH() diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..538fc56 --- /dev/null +++ b/INSTALL @@ -0,0 +1,87 @@ + + APACHE INSTALLATION OVERVIEW + + Quick Start - Unix + ------------------ + + For complete installation documentation, see [ht]docs/manual/install.html or + http://httpd.apache.org/docs/2.4/install.html + + $ ./configure --prefix=PREFIX + $ make + $ make install + $ PREFIX/bin/apachectl start + + NOTES: * Replace PREFIX with the filesystem path under which + Apache should be installed. A typical installation + might use "/usr/local/apache2" for PREFIX (without the + quotes). + + * Consider if you want to use a previously installed APR and + APR-Util (such as those provided with many OSes) or if you + need to use the APR and APR-Util from the apr.apache.org + project. If the latter, download the latest versions and + unpack them to ./srclib/apr and ./srclib/apr-util (no + version numbers in the directory names) and use + ./configure's --with-included-apr option. This is required + if you don't have the compiler which the system APR was + built with. It can also be advantageous if you are a + developer who will be linking your code with Apache or using + a debugger to step through server code, as it removes the + possibility of version or compile-option mismatches with APR + and APR-Util code. As a convenience, prepackaged source-code + bundles of APR and APR-Util are occasionally also provided + as a httpd-2.X.X-deps.tar.gz download. + + * If you are a developer building Apache directly from + Subversion, you will need to run ./buildconf before running + configure. This script bootstraps the build environment and + requires Python as well as GNU autoconf and libtool. If you + build Apache from a release tarball, you don't have to run + buildconf. + + * If you want to build a threaded MPM (for instance worker) + on FreeBSD, be aware that threads do not work well with + Apache on FreeBSD versions before 5.4-RELEASE. If you wish + to try a threaded Apache on an earlier version of FreeBSD, + use the --enable-threads parameter to ./configure in + addition to the --with-mpm parameter. + + * If you are building directly from Subversion on Mac OS X + (Darwin), make sure to use GNU Libtool 1.4.2 or newer. All + recent versions of the developer tools on this platform + include a sufficiently recent version of GNU Libtool (named + glibtool, but buildconf knows where to find it). + + For a short impression of what possibilities you have, here is a + typical example which configures Apache for the installation tree + /sw/pkg/apache with a particular compiler and flags plus the two + additional modules mod_rewrite and mod_speling for later loading + through the DSO mechanism: + + $ CC="pgcc" CFLAGS="-O2" \ + ./configure --prefix=/sw/pkg/apache \ + --enable-rewrite=shared \ + --enable-speling=shared + + The easiest way to find all of the configuration flags for Apache 2.4 + is to run ./configure --help. + + + Quick Start - Windows + --------------------- + + For complete documentation, see manual/platform/windows.html.en or + + + + Postscript + ---------- + + To obtain help with installation problems, please see the resources at + + + Thanks for using the Apache HTTP Server, version 2.4. + + The Apache Software Foundation + http://www.apache.org/ diff --git a/InstallBin.dsp b/InstallBin.dsp new file mode 100644 index 0000000..e2a7aa9 --- /dev/null +++ b/InstallBin.dsp @@ -0,0 +1,109 @@ +# Microsoft Developer Studio Project File - Name="InstallBin" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) External Target" 0x0106 + +CFG=InstallBin - Win32 Debug +!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 "InstallBin.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 "InstallBin.mak" CFG="InstallBin - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "InstallBin - Win32 Release" (based on "Win32 (x86) External Target") +!MESSAGE "InstallBin - Win32 Debug" (based on "Win32 (x86) External Target") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" + +!IF "$(CFG)" == "InstallBin - Win32 Release" + +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Cmd_Line "NMAKE /f InstallBin.mak" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "\Apache24\bin\httpd.exe" +# PROP BASE Bsc_Name "InstallBin.bsc" +# PROP BASE Target_Dir "" +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Cmd_Line "NMAKE /f makefile.win INSTDIR="\Apache24" SHORT=R LONG=Release _install" +# PROP Rebuild_Opt "" +# PROP Target_File "\Apache24\bin\httpd.exe" +# PROP Bsc_Name "Browse\httpd.bsc" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "InstallBin - Win32 Debug" + +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Cmd_Line "NMAKE /f InstallBin.mak" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "\Apache24\bin\httpd.exe" +# PROP BASE Bsc_Name "InstallBin.bsc" +# PROP BASE Target_Dir "" +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Cmd_Line "NMAKE /f makefile.win INSTDIR="\Apache24" SHORT=D LONG=Debug _install" +# PROP Rebuild_Opt "" +# PROP Target_File "\Apache24\bin\httpd.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ENDIF + +# Begin Target + +# Name "InstallBin - Win32 Release" +# Name "InstallBin - Win32 Debug" + +!IF "$(CFG)" == "InstallBin - Win32 Release" + +!ELSEIF "$(CFG)" == "InstallBin - Win32 Debug" + +!ENDIF + +# Begin Source File + +SOURCE=..\logs\access.log +# End Source File +# Begin Source File + +SOURCE=.\os\win32\BaseAddr.ref +# End Source File +# Begin Source File + +SOURCE=.\CHANGES +# End Source File +# Begin Source File + +SOURCE=..\logs\error.log +# End Source File +# Begin Source File + +SOURCE=..\conf\httpd.conf +# End Source File +# Begin Source File + +SOURCE=.\Makefile.win +# End Source File +# Begin Source File + +SOURCE=..\STATUS +# End Source File +# End Target +# End Project diff --git a/LAYOUT b/LAYOUT new file mode 100644 index 0000000..b5faadb --- /dev/null +++ b/LAYOUT @@ -0,0 +1,173 @@ +The httpd-2.1 Source Tree LAYOUT +-------------------------------- + +./ .................... Top-Level httpd-2.1 Root Directory + + ABOUT_APACHE .......... Overview of the Apache HTTP Server + LAYOUT ................ This file describing the source tree + README ................ Overview of this distribution + STATUS ................ Current project activity and commentary + +build/ ................ Supporting tools for buildconf/configure + + win32/ ................ Supporting tools for Win32 MSVC builds + +docs/ ................. Documentation and Examples + + cgi-examples/ ......... + + conf/ ................. + + docroot/ .............. + + error/ ................ + + include/ .............. + + icons/ ................ + + small/ ................ + + man/ .................. + + manual/ ............... + + developer/ ............ + + faq/ .................. + + howto/ ................ + + images/ ............... + + misc/ ................. + + mod/ .................. + + platform/ ............. + + programs/ ............. + + search/ ............... + + ssl/ .................. + + style/ ................ + + vhosts/ ............... + +include/ ................ + +modules/ ................ Manditory and Add-In Apache stock modules + + aaa/ .................... + + arch/ ................... + + netware/ ................ + + win32/ .................. + + cache/ .................. + + dav/ .................... + + fs/ ..................... + + main/ ................... + + echo/ ................... + + experimental/ ........... + + filters/ ................ + + generators/ ............. + + http/ ................... HTTP: protocol module + + loggers/ ................ + + mappers/ ................ + + metadata/ ............... + + pop3/ ................... + + private/ ................ + + proxy/ .................. + + ssl/ .................... HTTPS: SSL v2/v3 and TLS v1 protocol module + + README .................. Overview of mod_ssl + README.dsov.fig ......... Overview diagram of mod_ssl design + README.dsov.ps .......... Overview diagram of mod_ssl design + Makefile.in ............. Makefile template for Unix platform + config.m4 ............... Autoconf stub for the Apache config mechanism + mod_ssl.c ............... main source file containing API structures + mod_ssl.h ............... common header file of mod_ssl + ssl_engine_config.c ..... module configuration handling + ssl_engine_init.c ....... module initialization + ssl_engine_io.c ......... I/O support + ssl_engine_kernel.c ..... SSL engine kernel + ssl_engine_log.c ........ logfile support + ssl_engine_mutex.c ...... mutual exclusion support + ssl_engine_pphrase.c .... pass-phrase handling + ssl_engine_rand.c ....... PRNG support + ssl_engine_vars.c ....... Variable Expansion support + ssl_scache.c ............ session cache abstraction layer + ssl_util.c .............. utility functions + ssl_util_ssl.c .......... the OpenSSL companion source + ssl_util_ssl.h .......... the OpenSSL companion header + + test/ ................... not distributed with released source tarballs + +os/ ..................... + + bs2000/ ................. + + netware/ ................ + + os2/ .................... + + unix/ ................... + + win32/ .................. + +server/ ................. + + mpm/ .................... + + event/ .................. + + mpmt_os2/ ............... + + netware/ ................ + + prefork/ ................ + + winnt/ .................. + + worker/ ................. + +srclib/ ................... Additional Libraries + + apr/ ...................... SEE srclib/apr/LAYOUT + + apr-util/ ................. SEE srclib/apr/LAYOUT + + pcre/ ..................... + + doc/ ...................... + + testdata/ ................. + +support/ ................ Sources for Support Binaries + + SHA1/ .................. Ancient SHA1 password conversion utilities + + win32/ ................. Win32-only Support Applications + +test/ ................... not distributed with released source tarballs + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9c59479 --- /dev/null +++ b/LICENSE @@ -0,0 +1,537 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +APACHE HTTP SERVER SUBCOMPONENTS: + +The Apache HTTP Server includes a number of subcomponents with +separate copyright notices and license terms. Your use of the source +code for the these subcomponents is subject to the terms and +conditions of the following licenses. + +For the mod_mime_magic component: + +/* + * mod_mime_magic: MIME type lookup via file magic numbers + * Copyright (c) 1996-1997 Cisco Systems, Inc. + * + * This software was submitted by Cisco Systems to the Apache Group in July + * 1997. Future revisions and derivatives of this source code must + * acknowledge Cisco Systems as the original contributor of this module. + * All other licensing and usage conditions are those of the Apache Group. + * + * Some of this code is derived from the free version of the file command + * originally posted to comp.sources.unix. Copyright info for that program + * is included below as required. + * --------------------------------------------------------------------------- + * - Copyright (c) Ian F. Darwin, 1987. Written by Ian F. Darwin. + * + * This software is not subject to any license of the American Telephone and + * Telegraph Company or of the Regents of the University of California. + * + * Permission is granted to anyone to use this software for any purpose on any + * computer system, and to alter it and redistribute it freely, subject to + * the following restrictions: + * + * 1. The author is not responsible for the consequences of use of this + * software, no matter how awful, even if they arise from flaws in it. + * + * 2. The origin of this software must not be misrepresented, either by + * explicit claim or by omission. Since few users ever read sources, credits + * must appear in the documentation. + * + * 3. Altered versions must be plainly marked as such, and must not be + * misrepresented as being the original software. Since few users ever read + * sources, credits must appear in the documentation. + * + * 4. This notice may not be removed or altered. + * ------------------------------------------------------------------------- + * + */ + + +For the modules\mappers\mod_imagemap.c component: + + "macmartinized" polygon code copyright 1992 by Eric Haines, erich@eye.com + +For the server\util_md5.c component: + +/************************************************************************ + * NCSA HTTPd Server + * Software Development Group + * National Center for Supercomputing Applications + * University of Illinois at Urbana-Champaign + * 605 E. Springfield, Champaign, IL 61820 + * httpd@ncsa.uiuc.edu + * + * Copyright (C) 1995, Board of Trustees of the University of Illinois + * + ************************************************************************ + * + * md5.c: NCSA HTTPd code which uses the md5c.c RSA Code + * + * Original Code Copyright (C) 1994, Jeff Hostetler, Spyglass, Inc. + * Portions of Content-MD5 code Copyright (C) 1993, 1994 by Carnegie Mellon + * University (see Copyright below). + * Portions of Content-MD5 code Copyright (C) 1991 Bell Communications + * Research, Inc. (Bellcore) (see Copyright below). + * Portions extracted from mpack, John G. Myers - jgm+@cmu.edu + * Content-MD5 Code contributed by Martin Hamilton (martin@net.lut.ac.uk) + * + */ + + +/* these portions extracted from mpack, John G. Myers - jgm+@cmu.edu */ +/* (C) Copyright 1993,1994 by Carnegie Mellon University + * All Rights Reserved. + * + * 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 Carnegie + * Mellon University not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. Carnegie Mellon University makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE + * FOR ANY SPECIAL, 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. + */ + +/* + * Copyright (c) 1991 Bell Communications Research, Inc. (Bellcore) + * + * Permission to use, copy, modify, and distribute this material + * for any purpose and without fee is hereby granted, provided + * that the above copyright notice and this permission notice + * appear in all copies, and that the name of Bellcore not be + * used in advertising or publicity pertaining to this + * material without the specific, prior written permission + * of an authorized representative of Bellcore. BELLCORE + * MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY + * OF THIS MATERIAL FOR ANY PURPOSE. IT IS PROVIDED "AS IS", + * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. + */ + + +For the util_pcre.c and ap_regex.h components: + + Copyright (c) 1997-2004 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- + + +For the srclib\apr\include\apr_md5.h component: +/* + * This is work is derived from material Copyright RSA Data Security, Inc. + * + * The RSA copyright statement and Licence for that original material is + * included below. This is followed by the Apache copyright statement and + * licence for the modifications made to that material. + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. + */ + +For the srclib\apr\passwd\apr_md5.c component: + +/* + * This is work is derived from material Copyright RSA Data Security, Inc. + * + * The RSA copyright statement and Licence for that original material is + * included below. This is followed by the Apache copyright statement and + * licence for the modifications made to that material. + */ + +/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. + */ +/* + * The apr_md5_encode() routine uses much code obtained from the FreeBSD 3.0 + * MD5 crypt() function, which is licenced as follows: + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp + * ---------------------------------------------------------------------------- + */ + +For the srclib\apr-util\crypto\apr_md4.c component: + + * This is derived from material copyright RSA Data Security, Inc. + * Their notice is reproduced below in its entirety. + * + * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + * rights reserved. + * + * License to copy and use this software is granted provided that it + * is identified as the "RSA Data Security, Inc. MD4 Message-Digest + * Algorithm" in all material mentioning or referencing this software + * or this function. + * + * License is also granted to make and use derivative works provided + * that such works are identified as "derived from the RSA Data + * Security, Inc. MD4 Message-Digest Algorithm" in all material + * mentioning or referencing the derived work. + * + * RSA Data Security, Inc. makes no representations concerning either + * the merchantability of this software or the suitability of this + * software for any particular purpose. It is provided "as is" + * without express or implied warranty of any kind. + * + * These notices must be retained in any copies of any part of this + * documentation and/or software. + */ + +For the srclib\apr-util\include\apr_md4.h component: + + * + * This is derived from material copyright RSA Data Security, Inc. + * Their notice is reproduced below in its entirety. + * + * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + * rights reserved. + * + * License to copy and use this software is granted provided that it + * is identified as the "RSA Data Security, Inc. MD4 Message-Digest + * Algorithm" in all material mentioning or referencing this software + * or this function. + * + * License is also granted to make and use derivative works provided + * that such works are identified as "derived from the RSA Data + * Security, Inc. MD4 Message-Digest Algorithm" in all material + * mentioning or referencing the derived work. + * + * RSA Data Security, Inc. makes no representations concerning either + * the merchantability of this software or the suitability of this + * software for any particular purpose. It is provided "as is" + * without express or implied warranty of any kind. + * + * These notices must be retained in any copies of any part of this + * documentation and/or software. + */ + + +For the srclib\apr-util\test\testmd4.c component: + + * + * This is derived from material copyright RSA Data Security, Inc. + * Their notice is reproduced below in its entirety. + * + * Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All + * rights reserved. + * + * RSA Data Security, Inc. makes no representations concerning either + * the merchantability of this software or the suitability of this + * software for any particular purpose. It is provided "as is" + * without express or implied warranty of any kind. + * + * These notices must be retained in any copies of any part of this + * documentation and/or software. + */ + +For the test\zb.c component: + +/* ZeusBench V1.01 + =============== + +This program is Copyright (C) Zeus Technology Limited 1996. + +This program may be used and copied freely providing this copyright notice +is not removed. + +This software is provided "as is" and any express or implied warranties, +including but not limited to, the implied warranties of merchantability and +fitness for a particular purpose are disclaimed. In no event shall +Zeus Technology Ltd. be liable for any direct, indirect, incidental, special, +exemplary, or consequential damaged (including, but not limited to, +procurement of substitute good or services; loss of use, data, or profits; +or business interruption) however caused and on theory of liability. Whether +in contract, strict liability or tort (including negligence or otherwise) +arising in any way out of the use of this software, even if advised of the +possibility of such damage. + + Written by Adam Twiss (adam@zeus.co.uk). March 1996 + +Thanks to the following people for their input: + Mike Belshe (mbelshe@netscape.com) + Michael Campanella (campanella@stevms.enet.dec.com) + +*/ + diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..ebf7a16 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,318 @@ + +SUBDIRS = srclib os server modules support +CLEAN_SUBDIRS = test + +PROGRAM_NAME = $(progname) +PROGRAM_SOURCES = modules.c +PROGRAM_LDADD = buildmark.o $(HTTPD_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(PCRE_LIBS) $(EXTRA_LIBS) $(AP_LIBS) $(LIBS) +PROGRAM_PRELINK = $(COMPILE) -c $(top_srcdir)/server/buildmark.c +PROGRAM_DEPENDENCIES = \ + server/libmain.la \ + $(BUILTIN_LIBS) \ + $(MPM_LIB) \ + os/$(OS_DIR)/libos.la + +sbin_PROGRAMS = $(PROGRAM_NAME) +TARGETS = $(sbin_PROGRAMS) $(shared_build) $(other_targets) +INSTALL_TARGETS = install-conf install-htdocs install-error install-icons \ + install-other install-cgi install-include install-suexec install-build \ + install-man + +DISTCLEAN_TARGETS = include/ap_config_auto.h include/ap_config_layout.h \ + include/apache_probes.h \ + modules.c config.cache config.log config.status build/config_vars.mk \ + build/rules.mk docs/conf/httpd.conf docs/conf/extra/*.conf shlibtool \ + build/pkg/pkginfo build/config_vars.sh +EXTRACLEAN_TARGETS = configure include/ap_config_auto.h.in generated_lists \ + httpd.spec + +include $(top_builddir)/build/rules.mk +include $(top_srcdir)/build/program.mk + +install-conf: + @echo Installing configuration files + @$(MKINSTALLDIRS) $(DESTDIR)$(sysconfdir) $(DESTDIR)$(sysconfdir)/extra + @$(MKINSTALLDIRS) $(DESTDIR)$(sysconfdir)/original/extra + @cd $(top_srcdir)/docs/conf; \ + for i in mime.types magic; do \ + if test ! -f $(DESTDIR)$(sysconfdir)/$$i; then \ + $(INSTALL_DATA) $$i $(DESTDIR)$(sysconfdir); \ + fi; \ + done; \ + for j in $(top_srcdir)/docs/conf $(top_builddir)/docs/conf ; do \ + cd $$j ; \ + for i in httpd.conf extra/*.conf; do \ + if [ -f $$i ] ; then \ + ( \ + n_lm=`awk 'BEGIN {n=0} /@@LoadModule@@/ {n+=1} END {print n}' < $$i`; \ + if test $$n_lm -eq 0 -o "x$(MPM_MODULES)$(DSO_MODULES)" = "x"; then \ + sed -e 's#@@ServerRoot@@#$(prefix)#g' \ + -e 's#@@Port@@#$(PORT)#g' \ + -e 's#@@SSLPort@@#$(SSLPORT)#g' \ + -e '/@@LoadModule@@/d' \ + < $$i; \ + else \ + sed -n -e '/@@LoadModule@@/q' \ + -e 's#@@ServerRoot@@#$(prefix)#g' \ + -e 's#@@Port@@#$(PORT)#g' \ + -e 's#@@SSLPort@@#$(SSLPORT)#g' \ + -e 'p' \ + < $$i; \ + if echo " $(DSO_MODULES) "|$(EGREP) " cgi " > /dev/null ; then \ + have_cgi="1"; \ + else \ + have_cgi="0"; \ + fi; \ + if echo " $(DSO_MODULES) "|$(EGREP) " cgid " > /dev/null ; then \ + have_cgid="1"; \ + else \ + have_cgid="0"; \ + fi; \ + for j in $(MPM_MODULES) "^EOL^"; do \ + if test $$j != "^EOL^"; then \ + if echo ",$(ENABLED_MPM_MODULE),"|$(EGREP) ",$$j," > /dev/null ; then \ + loading_disabled=""; \ + else \ + loading_disabled="#"; \ + fi; \ + echo "$${loading_disabled}LoadModule $${j}_module $(rel_libexecdir)/mod_$${j}.so"; \ + fi; \ + done; \ + for j in $(DSO_MODULES) "^EOL^"; do \ + if test $$j != "^EOL^"; then \ + if echo ",$(ENABLED_DSO_MODULES),"|$(EGREP) ",$$j," > /dev/null ; then \ + loading_disabled=""; \ + else \ + loading_disabled="#"; \ + if test "$(LOAD_ALL_MODULES)" = "yes"; then \ + loading_disabled=""; \ + fi; \ + fi; \ + if test $$j = "cgid" -a "$$have_cgi" = "1"; then \ + echo ""; \ + echo " $${loading_disabled}LoadModule $${j}_module $(rel_libexecdir)/mod_$${j}.so"; \ + echo ""; \ + elif test $$j = "cgi" -a "$$have_cgid" = "1"; then \ + echo ""; \ + echo " $${loading_disabled}LoadModule $${j}_module $(rel_libexecdir)/mod_$${j}.so"; \ + echo ""; \ + else \ + echo "$${loading_disabled}LoadModule $${j}_module $(rel_libexecdir)/mod_$${j}.so"; \ + fi; \ + fi; \ + done; \ + sed -e '1,/@@LoadModule@@/d' \ + -e '/@@LoadModule@@/d' \ + -e 's#@@ServerRoot@@#$(prefix)#g' \ + -e 's#@@Port@@#$(PORT)#g' \ + -e 's#@@SSLPort@@#$(SSLPORT)#g' \ + < $$i; \ + fi \ + ) > $(DESTDIR)$(sysconfdir)/original/$$i; \ + chmod 0644 $(DESTDIR)$(sysconfdir)/original/$$i; \ + file=$$i; \ + if [ "$$i" = "httpd.conf" ]; then \ + file=`echo $$i|sed s/.*.conf/$(PROGRAM_NAME).conf/`; \ + fi; \ + if test ! -f $(DESTDIR)$(sysconfdir)/$$file; then \ + $(INSTALL_DATA) $(DESTDIR)$(sysconfdir)/original/$$i $(DESTDIR)$(sysconfdir)/$$file; \ + fi; \ + fi; \ + done ; \ + done ; \ + if test -f "$(builddir)/envvars-std"; then \ + cp -p envvars-std $(DESTDIR)$(sbindir); \ + if test ! -f $(DESTDIR)$(sbindir)/envvars; then \ + cp -p envvars-std $(DESTDIR)$(sbindir)/envvars ; \ + fi ; \ + fi + +# Create a sanitized config_vars.mk +build/config_vars.out: build/config_vars.mk build/config_vars.sh + @$(SHELL) build/config_vars.sh < build/config_vars.mk > build/config_vars.out + +install-build: build/config_vars.out + @echo Installing build system files + @$(MKINSTALLDIRS) $(DESTDIR)$(installbuilddir) + @for f in $(top_srcdir)/build/*.mk build/*.mk; do \ + $(INSTALL_DATA) $$f $(DESTDIR)$(installbuilddir); \ + done + @for f in $(top_builddir)/config.nice \ + $(top_srcdir)/build/mkdir.sh \ + $(top_srcdir)/build/instdso.sh; do \ + $(INSTALL_PROGRAM) $$f $(DESTDIR)$(installbuilddir); \ + done + @$(INSTALL_DATA) build/config_vars.out $(DESTDIR)$(installbuilddir)/config_vars.mk + @rm build/config_vars.out + +htdocs-srcdir = $(top_srcdir)/docs/docroot + +docs: + @if test -d $(top_srcdir)/docs/manual/build; then \ + cd $(top_srcdir)/docs/manual/build && ./build.sh all; \ + else \ + echo 'For details on generating the docs, please read:'; \ + echo ' http://httpd.apache.org/docs-project/docsformat.html'; \ + fi + +update-changes: + @for i in `find changes-entries -type f`; do \ + cp CHANGES CHANGES.tmp ; \ + awk -v fname=$$i 'BEGIN{done = 0; active = 0} \ + done == 0 && active == 0 && /^Changes with Apache /{ active = 1; print; next}; \ + /^( *\*|Changes with Apache )/ && active == 1 && done == 0{rec=$$0; while(getline CHANGES ; \ + rm CHANGES.tmp ; \ + if [ -n "$(SVN)" ] ; then \ + if ! $(SVN) rm $$i 2>/dev/null ; then \ + $(RM) $$i ; \ + fi ; \ + else \ + $(RM) $$i ; \ + fi ; \ + done ; \ + if [ -n "$(SVN)" ] ; then \ + $(SVN) diff CHANGES ; \ + fi + +validate-xml: + @if test -d $(top_srcdir)/docs/manual/build; then \ + cd $(top_srcdir)/docs/manual/build && ./build.sh validate-xml; \ + else \ + echo 'For details on generating the docs, please read:'; \ + echo ' http://httpd.apache.org/docs-project/docsformat.html'; \ + fi + +dox: + doxygen $(top_srcdir)/docs/doxygen.conf + +install-htdocs: + -@if [ -d $(DESTDIR)$(htdocsdir) ]; then \ + echo "[PRESERVING EXISTING HTDOCS SUBDIR: $(DESTDIR)$(htdocsdir)]"; \ + else \ + echo Installing HTML documents ; \ + $(MKINSTALLDIRS) $(DESTDIR)$(htdocsdir) ; \ + if test -d $(htdocs-srcdir) && test "x$(RSYNC)" != "x" && test -x $(RSYNC) ; then \ + $(RSYNC) --exclude .svn -rlpt --numeric-ids $(htdocs-srcdir)/ $(DESTDIR)$(htdocsdir)/; \ + else \ + test -d $(htdocs-srcdir) && (cd $(htdocs-srcdir) && cp -rp * $(DESTDIR)$(htdocsdir)) ; \ + cd $(DESTDIR)$(htdocsdir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null || true; \ + fi; \ + fi + +install-error: + -@if [ -d $(DESTDIR)$(errordir) ]; then \ + echo "[PRESERVING EXISTING ERROR SUBDIR: $(DESTDIR)$(errordir)]"; \ + else \ + echo Installing error documents ; \ + $(MKINSTALLDIRS) $(DESTDIR)$(errordir) ; \ + cd $(top_srcdir)/docs/error && cp -rp * $(DESTDIR)$(errordir) ; \ + test "x$(errordir)" != "x" && cd $(DESTDIR)$(errordir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null || true; \ + fi + +install-icons: + -@if [ -d $(DESTDIR)$(iconsdir) ]; then \ + echo "[PRESERVING EXISTING ICONS SUBDIR: $(DESTDIR)$(iconsdir)]"; \ + else \ + echo Installing icons ; \ + $(MKINSTALLDIRS) $(DESTDIR)$(iconsdir) ; \ + cd $(top_srcdir)/docs/icons && cp -rp * $(DESTDIR)$(iconsdir) ; \ + test "x$(iconsdir)" != "x" && cd $(DESTDIR)$(iconsdir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null || true; \ + fi + +install-cgi: + -@if [ -d $(DESTDIR)$(cgidir) ];then \ + echo "[PRESERVING EXISTING CGI SUBDIR: $(DESTDIR)$(cgidir)]"; \ + else \ + echo Installing CGIs ; \ + $(MKINSTALLDIRS) $(DESTDIR)$(cgidir) ; \ + cd $(top_srcdir)/docs/cgi-examples && cp -rp * $(DESTDIR)$(cgidir) ; \ + test "x$(cgidir)" != "x" && cd $(DESTDIR)$(cgidir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null || true; \ + fi + +install-other: + @test -d $(DESTDIR)$(logfiledir) || $(MKINSTALLDIRS) $(DESTDIR)$(logfiledir) + @test -d $(DESTDIR)$(runtimedir) || $(MKINSTALLDIRS) $(DESTDIR)$(runtimedir) + @for ext in dll x; do \ + file=apachecore.$$ext; \ + if test -f $$file; then \ + cp -p $$file $(DESTDIR)$(libdir); \ + fi; \ + done; \ + file=httpd.dll; \ + if test -f $$file; then \ + cp -p $$file $(DESTDIR)$(bindir); \ + fi; + +INSTALL_HEADERS = \ + include/*.h \ + $(srcdir)/include/*.h \ + $(srcdir)/os/$(OS_DIR)/os.h \ + $(srcdir)/modules/arch/unix/mod_unixd.h \ + $(srcdir)/modules/core/mod_so.h \ + $(srcdir)/modules/core/mod_watchdog.h \ + $(srcdir)/modules/cache/mod_cache.h \ + $(srcdir)/modules/cache/cache_common.h \ + $(srcdir)/modules/database/mod_dbd.h \ + $(srcdir)/modules/dav/main/mod_dav.h \ + $(srcdir)/modules/http2/mod_http2.h \ + $(srcdir)/modules/filters/mod_include.h \ + $(srcdir)/modules/filters/mod_xml2enc.h \ + $(srcdir)/modules/generators/mod_cgi.h \ + $(srcdir)/modules/generators/mod_status.h \ + $(srcdir)/modules/loggers/mod_log_config.h \ + $(srcdir)/modules/mappers/mod_rewrite.h \ + $(srcdir)/modules/proxy/mod_proxy.h \ + $(srcdir)/modules/session/mod_session.h \ + $(srcdir)/modules/ssl/mod_ssl.h \ + $(srcdir)/modules/ssl/mod_ssl_openssl.h \ + $(srcdir)/os/$(OS_DIR)/*.h + +install-include: + @echo Installing header files + @$(MKINSTALLDIRS) $(DESTDIR)$(includedir) + @for hdr in $(INSTALL_HEADERS); do \ + $(INSTALL_DATA) $$hdr $(DESTDIR)$(includedir); \ + done + +install-man: + @echo Installing man pages and online manual + @test -d $(DESTDIR)$(mandir) || $(MKINSTALLDIRS) $(DESTDIR)$(mandir) + @test -d $(DESTDIR)$(mandir)/man1 || $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man1 + @test -d $(DESTDIR)$(mandir)/man8 || $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man8 + @test -d $(DESTDIR)$(manualdir) || $(MKINSTALLDIRS) $(DESTDIR)$(manualdir) + @cp -p $(top_srcdir)/docs/man/*.1 $(DESTDIR)$(mandir)/man1 + @cp -p $(top_srcdir)/docs/man/*.8 $(DESTDIR)$(mandir)/man8 + @if test "x$(RSYNC)" != "x" && test -x $(RSYNC) ; then \ + $(RSYNC) --exclude .svn -rlpt --numeric-ids $(top_srcdir)/docs/manual/ $(DESTDIR)$(manualdir)/; \ + else \ + cd $(top_srcdir)/docs/manual && cp -rp * $(DESTDIR)$(manualdir); \ + cd $(DESTDIR)$(manualdir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null || true; \ + fi + +install-suexec: install-suexec-$(INSTALL_SUEXEC) + +install-suexec-binary: + @if test -f $(builddir)/support/suexec; then \ + test -d $(DESTDIR)$(sbindir) || $(MKINSTALLDIRS) $(DESTDIR)$(sbindir); \ + $(INSTALL_PROGRAM) $(top_builddir)/support/suexec $(DESTDIR)$(sbindir); \ + fi + +install-suexec-setuid: install-suexec-binary + @if test -f $(builddir)/support/suexec; then \ + chmod 4755 $(DESTDIR)$(sbindir)/suexec; \ + fi + +install-suexec-caps: install-suexec-binary + @if test -f $(builddir)/support/suexec; then \ + setcap 'cap_setuid,cap_setgid+pe' $(DESTDIR)$(sbindir)/suexec; \ + fi + +suexec: + cd support && $(MAKE) suexec + +x-local-distclean: + @rm -rf autom4te.cache + +# XXX: This looks awfully platform-specific [read: bad form and style] +include $(top_srcdir)/os/os2/core.mk diff --git a/Makefile.win b/Makefile.win new file mode 100644 index 0000000..701ea06 --- /dev/null +++ b/Makefile.win @@ -0,0 +1,1297 @@ +# Makefile for Windows NT and Windows 95/98/2000 + +# Targets are: +# _buildr - build Apache in Release mode +# _buildd - build Apache in Debug mode +# installr - build and install a Release build +# installd - build and install a Debug build +# clean - remove (most) generated files +# _cleanr - remove (most) files generated by a Release build +# _cleand - remove (most) files generated by a Debug build +# _browse - build the browse info file +# +# The following install defaults may be customized; +# +# Option Default +# INSTDIR /Apache24 +# PORT 80 +# SSLPORT 443 +# DOMAINNAME example.com +# SERVERNAME www.example.com +# SERVERNAME admin@example.com +# +# ALL (unset) Includes additional modules for build testing +# +# Provide a DBD_LIST argument after configuring LIB and INCLUDE with +# the SDK paths of the corresponding client support libraries. +# The ODBC driver is always built on Windows +# +# DBD_LIST="sqlite3 pgsql oracle mysql freetds" +# +# Provide a DBM_LIST argument after configuring LIB and INCLUDE with +# the SDK paths of the corresponding client support libraries. +# The sdbm driver is always built in. +# +# DBM_LIST="db gdbm" +# +# For example; +# +# nmake -f Makefile.win PORT=80 INSTDIR="d:\Program Files\Apache" installr +# +# Be aware that certain awk's will not accept backslashed names, +# so the server root should be given in forward slashes (quoted), +# preferably with the drive designation! + +!IF EXIST("Apache.sln") && ([devenv /help > NUL 2>&1] == 0) \ + && !defined(USEMAK) && !defined(USEDSW) +USESLN=1 +USEMAK=0 +USEDSW=0 +!ELSEIF EXIST("httpd.mak") && !defined(USEDSW) +USESLN=0 +USEMAK=1 +USEDSW=0 +!ELSE +USESLN=0 +USEMAK=0 +USEDSW=1 +!ENDIF + +# APU 1.6 (and up?) +!IF EXIST("srclib\apr-util\xml\xml.mak") +EXPAT=xml +EXPBCK = .. +!ELSE +EXPAT=xml\expat\lib +EXPBCK = ..\..\.. +!ENDIF + +default: _buildr + +!IF ("$(CTARGET)" == "") && ($(USESLN) == 1) +CTARGET=/build +!ENDIF + +!IF EXIST("srclib\apr\include\apu.h") +TLP=Apache-apr2 +UTILDIR=apr +!ELSEIF !EXIST("srclib\apr") || !EXIST("srclib\apr-util") || !EXIST("srclib\apr-iconv") +!MESSAGE Please check out or download and unpack the Apache Portability Runtime +!MESSAGE sources (apr, apr-iconv and apr-util) into your srclib dir. +!MESSAGE Apache cannot build without these libraries! +!MESSAGE +!ERROR Need srclib\ apr, apr-iconv and apr-util +!ELSE +TLP=Apache +UTILDIR=apr-util +!ENDIF + +!IF !EXIST("srclib\expat") && !EXIST("srclib\apr-util\xml\expat") +!MESSAGE Please check out or download and unpack the current expat library source +!MESSAGE under your srclib dir for apr 2.x, or srclib\apr-util\xml\expat for apr 1.x +!MESSAGE Apache cannot build without this library! +!MESSAGE +!ERROR Need srclib\expat or srclib\apr-util\xml\expat +!ENDIF + +!IF !EXIST("srclib\pcre") +!MESSAGE Please check out or download and unpack the current PCRE library source +!MESSAGE under your srclib dir, and compile the pcre.dll with CMake options +!MESSAGE BUILD_SHARED_LIBS and CMAKE_BUILD_TYPE RelWithDebInfo. +!MESSAGE Apache cannot build without this library! +!MESSAGE +!ERROR Need srclib\pcre +!ENDIF + + +# Note; _tryfoo: blocks are used only by the msvc developer studio environment +# to 'fix up' the build, since conditional dependencies aren't supported. +# + +!IF EXIST("srclib\openssl") +!IF "$(LONG)" == "Debug" && EXIST("srclib\openssl\out32dll.dbg\openssl.exe") +SSLBIN=out32dll.dbg +SSLAPP=out32dll.dbg +SSLCRP=libeay32 +SSLLIB=ssleay32 +!ELSEIF EXIST("srclib\openssl\libcrypto.lib") +!MESSAGE Building with OpenSSL 1.1.0 +!MESSAGE +SSLBIN=. +SSLAPP=apps +SSLCRP=libcrypto +SSLLIB=libssl +SSLOPT=_HAVE_OSSL110=1 +!ELSE +SSLBIN=out32dll +SSLAPP=out32dll +SSLCRP=libeay32 +SSLLIB=ssleay32 +!ENDIF + + +_tryssl: +!IF $(USEMAK) == 1 + cd modules\ssl + $(MAKE) $(MAKEOPT) $(SSLOPT) -f mod_ssl.mak CFG="mod_ssl - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd support + $(MAKE) $(MAKEOPT) $(SSLOPT) -f abs.mak CFG="abs - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd .. +!ELSEIF $(USESLN) == 1 + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project mod_ssl + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project abs +!ELSE + @msdev $(TLP).dsw /USEENV /MAKE \ + "mod_ssl - Win32 $(LONG)" \ + "abs - Win32 $(LONG)" /NORECURSE $(CTARGET) +!ENDIF + +!ELSE +# NOT EXIST("srclib\openssl") + +_tryssl: + @echo ----- + @echo mod_ssl and ab/ssl will not build unless openssl is installed + @echo in srclib\openssl. They must be precompiled using the + @echo ms/ntdll.mak file, see srclib\openssl\INSTALL.W32. The most + @echo recent version confirmed to build with mod_ssl and ab is 0.9.8d. + @echo Available from http://www.openssl.org/ +!ENDIF +# NOT EXIST("srclib\openssl") + +!IF EXIST("srclib\zlib") + +_tryzlib: +!IF $(USEMAK) == 1 + cd modules\filters + $(MAKE) $(MAKEOPT) -f mod_deflate.mak CFG="mod_deflate - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!ELSEIF $(USESLN) == 1 + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project mod_deflate +!ELSE + @msdev $(TLP).dsw /USEENV /MAKE \ + "mod_deflate - Win32 $(LONG)" /NORECURSE $(CTARGET) +!ENDIF + +!ELSE +# NOT EXIST("srclib\zlib") + +_tryzlib: + @echo ----- + @echo mod_deflate will not build unless zlib is built in srclib\zlib. + @echo Version 1.2.1 and later available from http://www.gzip.org/zlib/ + @echo built w/ nmake -f win32/Makefile.msc will satisfy this requirement. + +!ENDIF + +!IF EXIST("srclib\libxml2") + +_tryxml: +!IF $(USEMAK) == 1 + cd modules\filters + $(MAKE) $(MAKEOPT) -f mod_proxy_html.mak CFG="mod_proxy_html - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_xml2enc.mak CFG="mod_xml2enc - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!ELSEIF $(USESLN) == 1 + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project mod_proxy_html + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project mod_xml2enc +!ELSE + @msdev $(TLP).dsw /USEENV /MAKE \ + "mod_proxy_html - Win32 $(LONG)" /NORECURSE $(CTARGET) + @msdev $(TLP).dsw /USEENV /MAKE \ + "mod_xml2enc - Win32 $(LONG)" /NORECURSE $(CTARGET) +!ENDIF + +!ELSE +# NOT EXIST("srclib\libxml2") + +_tryxml: + @echo ----- + @echo mod_proxy_html and mod_xml2enc will not build unless libxml2 is + @echo built in srclib\libxml2. Version 2.7.7 and later available from + @echo http://xmlsoft.org/ will satisfy this requirement. + +!ENDIF + + +!IF EXIST("srclib\lua") + +_trylua: +!IF $(USEMAK) == 1 + cd modules\lua + $(MAKE) $(MAKEOPT) -f mod_lua.mak CFG="mod_lua - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!ELSEIF $(USESLN) == 1 + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project mod_lua +!ELSE + @msdev $(TLP).dsw /USEENV /MAKE \ + "mod_lua - Win32 $(LONG)" /NORECURSE $(CTARGET) +!ENDIF + +!ELSE +# NOT EXIST("srclib\lua") + +_trylua: + @echo ----- + @echo mod_lua will not build unless lua is installed in srclib\lua. + @echo Version 5.1 includes an etc\luavs.bat that will satisfy this requirement. + +!ENDIF + +!IF EXIST("srclib\nghttp2") + +_trynghttp2: +!IF $(USEMAK) == 1 + cd modules\http2 + $(MAKE) $(MAKEOPT) -f mod_http2.mak CFG="mod_http2 - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_proxy_http2.mak CFG="mod_proxy_http2 - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!ELSEIF $(USESLN) == 1 + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project mod_http2 + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project mod_proxy_http2 +!ELSE + @msdev $(TLP).dsw /USEENV /MAKE \ + "mod_http2 - Win32 $(LONG)" /NORECURSE $(CTARGET) + @msdev $(TLP).dsw /USEENV /MAKE \ + "mod_proxy_http2 - Win32 $(LONG)" /NORECURSE $(CTARGET) +!ENDIF + +!ELSE +# NOT EXIST("srclib\nghttp2") + +_trynghttp2: + @echo ----- + @echo mod_http2 will not build unless nghttp2 is installed in srclib\nghttp2. + @echo Version 1.0 includes an lib\makefile.msvc that will satisfy this + @echo requirement. + +!ENDIF + +!IF EXIST("srclib\brotli") + +_trybrotli: +!IF $(USEMAK) == 1 + cd modules\filters + $(MAKE) $(MAKEOPT) -f mod_brotli.mak CFG="mod_brotli - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!ELSEIF $(USESLN) == 1 + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project mod_brotli +!ELSE + @msdev $(TLP).dsw /USEENV /MAKE \ + "mod_brotli - Win32 $(LONG)" /NORECURSE $(CTARGET) +!ENDIF + +!ELSE +# NOT EXIST("srclib\brotli") + +_trybrotli: + @echo ----- + @echo mod_brotli will not build unless brotli is built in srclib\brotli. + @echo Version 1.0.0 and later available from https://github.com/google/brotli/releases + @echo build with: + @echo cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF + @echo nmake + +!ENDIF + +!IF EXIST("srclib\openssl") && EXIST("srclib\jansson") && EXIST("srclib\curl") + +_trymd: +!IF $(USEMAK) == 1 + cd modules\md + $(MAKE) $(MAKEOPT) $(SSLOPT) -f mod_md.mak CFG="mod_md - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!ELSEIF $(USESLN) == 1 + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project mod_md +!ELSE + @msdev $(TLP).dsw /USEENV /MAKE \ + "mod_md - Win32 $(LONG)" /NORECURSE $(CTARGET) +!ENDIF + +!ELSE +# NOT EXIST("srclib\openssl") && EXIST("srclib\jansson") && EXIST("srclib\curl") + +_trymd: + @echo ----- + @echo mod_md will not build unless OpenSSL, Jansson and Curl are built and placed + @echo in srclib. Example: srclib/openssl, srclib/jansson and srclib/curl + +!ENDIF + +_trydb: +!IF $(USEMAK) == 1 + cd srclib\$(UTILDIR)\dbd + for %d in (odbc $(DBD_LIST)) do \ + $(MAKE) $(MAKEOPT) -f apr_dbd_%d.mak CFG="apr_dbd_%d - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\dbm + for %d in ($(DBM_LIST) x) do if not %d == x \ + $(MAKE) $(MAKEOPT) -f apr_dbm_%d.mak CFG="apr_dbm_%d - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\..\.. +!ELSEIF $(USESLN) == 1 + for %d in (odbc $(DBD_LIST)) do \ + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project apr_dbd_%d + for %d in ($(DBM_LIST) x) do if not %d == x \ + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project apr_dbm_%d +!ELSE + @for %d in (odbc $(DBD_LIST)) do \ + msdev $(TLP).dsw /USEENV /MAKE \ + "apr_dbd_%d - Win32 $(LONG)" /NORECURSE $(CTARGET) + @for %d in ($(DBM_LIST) x) do if not %d == x \ + msdev $(TLP).dsw /USEENV /MAKE \ + "apr_dbm_%d - Win32 $(LONG)" /NORECURSE $(CTARGET) +!ENDIF + + +!IF "$(INSTDIR)" == "" +INSTDIR=\Apache24 +!ENDIF +!IF "$(DOMAINNAME)" == "" +DOMAINNAME=example.com +!ENDIF +!IF "$(SERVERNAME)" == "" +SERVERNAME=www.$(DOMAINNAME) +!ENDIF +!IF "$(SERVERADMIN)" == "" +SERVERADMIN=admin@$(DOMAINNAME) +!ENDIF +!IF "$(PORT)" == "" +PORT=80 +!ENDIF +!IF "$(SSLPORT)" == "" +SSLPORT=443 +!ENDIF + +!IF "$(LONG)" == "" +!MESSAGE +!MESSAGE INSTDIR = $(INSTDIR) +!MESSAGE DOMAINNAME = $(DOMAINNAME) +!MESSAGE SERVERNAME = $(SERVERNAME) +!MESSAGE SERVERADMIN = $(SERVERADMIN) +!MESSAGE PORT = $(PORT) +!IF EXIST("srclib\openssl") +!MESSAGE SSLPORT = $(SSLPORT) +!ENDIF +!MESSAGE +!MESSAGE To change these options use 'nmake -f Makefile.win [option=value]' +!MESSAGE Example: nmake -f Makefile.win PORT=8080 +!MESSAGE +!MESSAGE +!ENDIF + +!IFNDEF MAKEOPT +# Only default the behavior if MAKEOPT= is omitted +!IFDEF _NMAKE_VER +# Microsoft NMake options +MAKEOPT=-nologo +!ELSEIF "$(MAKE)" == "make" +# Borland make options? Not really supported (yet) +MAKEOPT=-s -N +!ENDIF +!ENDIF + +_dummy: + +_browse: + cd Browse + bscmake.exe -nologo -Iu -o Apache.bsc *.sbr + cd .. + +_buildr: + @$(MAKE) $(MAKEOPT) -f Makefile.win SHORT=R LONG=Release _build + +_buildd: + @$(MAKE) $(MAKEOPT) -f Makefile.win SHORT=D LONG=Debug _build + +installr: + @$(MAKE) $(MAKEOPT) -f Makefile.win SHORT=R LONG=Release _build _install + +installd: + @$(MAKE) $(MAKEOPT) -f Makefile.win SHORT=D LONG=Debug _build _install + +clean: _cleanr _cleand + -if exist Browse\. rd /s Browse < << > nul +y +<< + +!IF $(USEMAK) == 1 + +_cleanr: + $(MAKE) $(MAKEOPT) -f Makefile.win SHORT=R LONG=Release CTARGET=CLEAN _build + +_cleand: + $(MAKE) $(MAKEOPT) -f Makefile.win SHORT=D LONG=Debug CTARGET=CLEAN _build + +_build: + echo Building Win32 $(LONG) targets ($(SHORT) suffixes) +!IF !EXIST("srclib\apr-util") + cd srclib\expat\lib + $(MAKE) $(MAKEOPT) -f expat.mak CFG="expat - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\..\.. +!ENDIF + cd srclib\apr + $(MAKE) $(MAKEOPT) -f apr.mak CFG="apr - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f libapr.mak CFG="libapr - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!IF EXIST("srclib\apr-util") + cd srclib\apr-iconv + $(MAKE) $(MAKEOPT) -f apriconv.mak CFG="apriconv - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f libapriconv.mak CFG="libapriconv - Win32 $(LONG)" RECURSE=0 $(CTARGET) +!IF "$(CTARGET)" == "CLEAN" + $(MAKE) $(MAKEOPT) -f build\modules.mk.win clean \ + BUILD_MODE=$(LONG) BIND_MODE=shared API_SOURCE=. +!ELSE + cd ccs + $(MAKE) $(MAKEOPT) -f Makefile.win all \ + BUILD_MODE=$(LONG) BIND_MODE=shared + cd ..\ces + $(MAKE) $(MAKEOPT) -f Makefile.win all \ + BUILD_MODE=$(LONG) BIND_MODE=shared + cd .. +!ENDIF + cd ..\.. + cd srclib\apr-util\$(EXPAT) + $(MAKE) $(MAKEOPT) -f xml.mak CFG="xml - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd $(EXPBCK) + $(MAKE) $(MAKEOPT) $(SSLOPT) -f aprutil.mak CFG="aprutil - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) $(SSLOPT) -f libaprutil.mak CFG="libaprutil - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ldap + $(MAKE) $(MAKEOPT) -f apr_ldap.mak CFG="apr_ldap - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd .. +!ELSE + # DBD, DBM components live now in apr + cd srclib\apr +!ENDIF + cd dbd + for %d in (odbc $(DBD_LIST)) do \ + $(MAKE) $(MAKEOPT) -f apr_dbd_%d.mak CFG="apr_dbd_%d - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd .. + cd dbm + for %d in ($(DBM_LIST) x) do if not %d == x \ + $(MAKE) $(MAKEOPT) -f apr_dbm_%d.mak CFG="apr_dbm_%d - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd .. + cd ..\.. + cd server + $(MAKE) $(MAKEOPT) -f gen_test_char.mak CFG="gen_test_char - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd .. + $(MAKE) $(MAKEOPT) -f libhttpd.mak CFG="libhttpd - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f httpd.mak CFG="httpd - Win32 $(LONG)" RECURSE=0 $(CTARGET) +# build ldap prior to authnz_ldap + cd modules\ldap + $(MAKE) $(MAKEOPT) -f mod_ldap.mak CFG="mod_ldap - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd modules\database + $(MAKE) $(MAKEOPT) -f mod_dbd.mak CFG="mod_dbd - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd modules\aaa + $(MAKE) $(MAKEOPT) -f mod_access_compat.mak CFG="mod_access_compat - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_allowmethods.mak CFG="mod_allowmethods - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_auth_basic.mak CFG="mod_auth_basic - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_auth_digest.mak CFG="mod_auth_digest - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_auth_form.mak CFG="mod_auth_form - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authn_anon.mak CFG="mod_authn_anon - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authn_core.mak CFG="mod_authn_core - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authn_dbd.mak CFG="mod_authn_dbd - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authn_dbm.mak CFG="mod_authn_dbm - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authn_file.mak CFG="mod_authn_file - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authn_socache.mak CFG="mod_authn_socache - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authnz_fcgi.mak CFG="mod_authnz_fcgi - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authnz_ldap.mak CFG="mod_authnz_ldap - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authz_core.mak CFG="mod_authz_core - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authz_dbd.mak CFG="mod_authz_dbd - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authz_dbm.mak CFG="mod_authz_dbm - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authz_groupfile.mak CFG="mod_authz_groupfile - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authz_host.mak CFG="mod_authz_host - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authz_owner.mak CFG="mod_authz_owner - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_authz_user.mak CFG="mod_authz_user - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd modules\arch\win32 + $(MAKE) $(MAKEOPT) -f mod_isapi.mak CFG="mod_isapi - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\..\.. + cd modules\cache + $(MAKE) $(MAKEOPT) -f mod_cache.mak CFG="mod_cache - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_cache_disk.mak CFG="mod_cache_disk - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_cache_socache.mak CFG="mod_cache_socache - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_file_cache.mak CFG="mod_file_cache - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_socache_dbm.mak CFG="mod_socache_dbm - Win32 $(LONG)" RECURSE=0 $(CTARGET) +# $(MAKE) $(MAKEOPT) -f mod_socache_dc.mak CFG="mod_socache_dc - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_socache_memcache.mak CFG="mod_socache_memcache - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_socache_shmcb.mak CFG="mod_socache_shmcb - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_socache_redis.mak CFG="mod_socache_redis - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd modules\core + $(MAKE) $(MAKEOPT) -f mod_macro.mak CFG="mod_macro - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_watchdog.mak CFG="mod_watchdog - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd modules\cluster + $(MAKE) $(MAKEOPT) -f mod_heartbeat.mak CFG="mod_heartbeat - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_heartmonitor.mak CFG="mod_heartmonitor - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd modules\dav\main + $(MAKE) $(MAKEOPT) -f mod_dav.mak CFG="mod_dav - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\..\.. + cd modules\dav\fs + $(MAKE) $(MAKEOPT) -f mod_dav_fs.mak CFG="mod_dav_fs - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\..\.. + cd modules\dav\lock + $(MAKE) $(MAKEOPT) -f mod_dav_lock.mak CFG="mod_dav_lock - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\..\.. + cd modules\debugging +!IFDEF ALL + $(MAKE) $(MAKEOPT) -f mod_bucketeer.mak CFG="mod_bucketeer - Win32 $(LONG)" RECURSE=0 $(CTARGET) +!ENDIF + $(MAKE) $(MAKEOPT) -f mod_dumpio.mak CFG="mod_dumpio - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd modules\echo +!IFDEF ALL + $(MAKE) $(MAKEOPT) -f mod_echo.mak CFG="mod_echo - Win32 $(LONG)" RECURSE=0 $(CTARGET) +!ENDIF + cd ..\.. +!IFDEF ALL + cd modules\examples + $(MAKE) $(MAKEOPT) -f mod_case_filter.mak CFG="mod_case_filter - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_case_filter_in.mak CFG="mod_case_filter_in - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_example_hooks.mak CFG="mod_example_hooks - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_example_ipc.mak CFG="mod_example_ipc - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!ENDIF + cd modules\filters +!IF EXIST("srclib\brotli") + $(MAKE) $(MAKEOPT) -f mod_brotli.mak CFG="mod_brotli - Win32 $(LONG)" RECURSE=0 $(CTARGET) +!ENDIF + $(MAKE) $(MAKEOPT) -f mod_buffer.mak CFG="mod_buffer - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_charset_lite.mak CFG="mod_charset_lite - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_data.mak CFG="mod_data - Win32 $(LONG)" RECURSE=0 $(CTARGET) +!IF EXIST("srclib\zlib") + $(MAKE) $(MAKEOPT) -f mod_deflate.mak CFG="mod_deflate - Win32 $(LONG)" RECURSE=0 $(CTARGET) +!ENDIF + $(MAKE) $(MAKEOPT) -f mod_ext_filter.mak CFG="mod_ext_filter - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_filter.mak CFG="mod_filter - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_include.mak CFG="mod_include - Win32 $(LONG)" RECURSE=0 $(CTARGET) +!IF EXIST("srclib\libxml2") + $(MAKE) $(MAKEOPT) -f mod_proxy_html.mak CFG="mod_proxy_html - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_xml2enc.mak CFG="mod_xml2enc - Win32 $(LONG)" RECURSE=0 $(CTARGET) +!ENDIF + $(MAKE) $(MAKEOPT) -f mod_ratelimit.mak CFG="mod_ratelimit - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_reflector.mak CFG="mod_reflector - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_reqtimeout.mak CFG="mod_reqtimeout - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_request.mak CFG="mod_request - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_sed.mak CFG="mod_sed - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_substitute.mak CFG="mod_substitute - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd modules\generators + $(MAKE) $(MAKEOPT) -f mod_asis.mak CFG="mod_asis - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_autoindex.mak CFG="mod_autoindex - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_cgi.mak CFG="mod_cgi - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_info.mak CFG="mod_info - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_status.mak CFG="mod_status - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd modules\http + $(MAKE) $(MAKEOPT) -f mod_mime.mak CFG="mod_mime - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd modules\loggers + $(MAKE) $(MAKEOPT) -f mod_log_config.mak CFG="mod_log_config - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_log_debug.mak CFG="mod_log_debug - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_log_forensic.mak CFG="mod_log_forensic - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_logio.mak CFG="mod_logio - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!IF EXIST("srclib\lua") + cd modules\lua + $(MAKE) $(MAKEOPT) -f mod_lua.mak CFG="mod_lua - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!ENDIF + cd modules\mappers + $(MAKE) $(MAKEOPT) -f mod_actions.mak CFG="mod_actions - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_alias.mak CFG="mod_alias - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_dir.mak CFG="mod_dir - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_imagemap.mak CFG="mod_imagemap - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_negotiation.mak CFG="mod_negotiation - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_rewrite.mak CFG="mod_rewrite - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_speling.mak CFG="mod_speling - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_userdir.mak CFG="mod_userdir - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_vhost_alias.mak CFG="mod_vhost_alias - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!IF EXIST("srclib\openssl") && EXIST("srclib\jansson") && EXIST("srclib\curl") + cd modules\md + $(MAKE) $(MAKEOPT) $(SSLOPT) -f mod_md.mak CFG="mod_md - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!ENDIF + cd modules\metadata + $(MAKE) $(MAKEOPT) -f mod_cern_meta.mak CFG="mod_cern_meta - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_env.mak CFG="mod_env - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_expires.mak CFG="mod_expires - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_headers.mak CFG="mod_headers - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_ident.mak CFG="mod_ident - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_mime_magic.mak CFG="mod_mime_magic - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_remoteip.mak CFG="mod_remoteip - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_setenvif.mak CFG="mod_setenvif - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_unique_id.mak CFG="mod_unique_id - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_usertrack.mak CFG="mod_usertrack - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_version.mak CFG="mod_version - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd modules\proxy + $(MAKE) $(MAKEOPT) -f mod_proxy.mak CFG="mod_proxy - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_proxy_ajp.mak CFG="mod_proxy_ajp - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_proxy_balancer.mak CFG="mod_proxy_balancer - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_proxy_connect.mak CFG="mod_proxy_connect - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_proxy_express.mak CFG="mod_proxy_express - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_proxy_fcgi.mak CFG="mod_proxy_fcgi - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_proxy_ftp.mak CFG="mod_proxy_ftp - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_proxy_hcheck.mak CFG="mod_proxy_hcheck - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_proxy_http.mak CFG="mod_proxy_http - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_proxy_scgi.mak CFG="mod_proxy_scgi - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_proxy_uwsgi.mak CFG="mod_proxy_uwsgi - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_proxy_wstunnel.mak CFG="mod_proxy_wstunnel - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd modules\proxy\balancers + $(MAKE) $(MAKEOPT) -f mod_lbmethod_bybusyness.mak CFG="mod_lbmethod_bybusyness - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_lbmethod_byrequests.mak CFG="mod_lbmethod_byrequests - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_lbmethod_bytraffic.mak CFG="mod_lbmethod_bytraffic - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_lbmethod_heartbeat.mak CFG="mod_lbmethod_heartbeat - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\..\.. +# mod_proxy_http2 must be built after mod_proxy and mod_http2 +!IF EXIST("srclib\nghttp2") + cd modules\http2 + $(MAKE) $(MAKEOPT) -f mod_http2.mak CFG="mod_http2 - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_proxy_http2.mak CFG="mod_proxy_http2 - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!ENDIF + cd modules\session + $(MAKE) $(MAKEOPT) -f mod_session.mak CFG="mod_session - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_session_cookie.mak CFG="mod_session_cookie - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_session_dbd.mak CFG="mod_session_dbd - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd modules\slotmem + $(MAKE) $(MAKEOPT) -f mod_slotmem_plain.mak CFG="mod_slotmem_plain - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_slotmem_shm.mak CFG="mod_slotmem_shm - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!IF EXIST("srclib\openssl") +# cd modules\session +# $(MAKE) $(MAKEOPT) -f mod_session_crypto.mak CFG="mod_session_crypto - Win32 $(LONG)" RECURSE=0 $(CTARGET) +# cd ..\.. + cd modules\ssl + $(MAKE) $(MAKEOPT) $(SSLOPT) -f mod_ssl.mak CFG="mod_ssl - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd support + $(MAKE) $(MAKEOPT) $(SSLOPT) -f abs.mak CFG="abs - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd .. +!ENDIF + cd support + $(MAKE) $(MAKEOPT) -f ab.mak CFG="ab - Win32 $(LONG)" RECURSE=0 $(CTARGET) +# $(MAKE) $(MAKEOPT) -f fcgistarter.mak CFG="fcgistarter - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f htcacheclean.mak CFG="htcacheclean - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f htdbm.mak CFG="htdbm - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f htdigest.mak CFG="htdigest - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f htpasswd.mak CFG="htpasswd - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f httxt2dbm.mak CFG="httxt2dbm - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f logresolve.mak CFG="logresolve - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f rotatelogs.mak CFG="rotatelogs - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd .. + cd support\win32 + $(MAKE) $(MAKEOPT) -f ApacheMonitor.mak CFG="ApacheMonitor - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f wintty.mak CFG="wintty - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + +!ELSEIF $(USESLN) == 1 + +_cleanr: + $(MAKE) $(MAKEOPT) -f Makefile.win SHORT=R LONG=Release CTARGET="/clean" _build + +_cleand: + $(MAKE) $(MAKEOPT) -f Makefile.win SHORT=D LONG=Debug CTARGET="/clean" _build + +_build: + echo Building Win32 $(LONG) targets ($(SHORT) suffixes) +!IFDEF ALL + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project BuildAll +!ELSE + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project BuildBin +!ENDIF +!IF EXIST("srclib\openssl") + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project mod_ssl + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project abs +!ENDIF +!IF EXIST("srclib\zlib") + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project mod_deflate +!ENDIF +!IF EXIST("srclib\lua") + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project mod_lua +!ENDIF +!IF EXIST("srclib\libxml2") + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project mod_proxy_html + devenv $(TLP).sln /useenv $(CTARGET) $(LONG) /project mod_xml2enc +!ENDIF + +!ELSE + +_cleanr: + @$(MAKE) $(MAKEOPT) -f Makefile.win SHORT=R LONG=Release CTARGET="/CLEAN" _build + +_cleand: + @$(MAKE) $(MAKEOPT) -f Makefile.win SHORT=D LONG=Debug CTARGET="/CLEAN" _build + +_build: + @echo Building Win32 $(LONG) targets ($(SHORT) suffixes) +!IFDEF ALL + @msdev $(TLP).dsw /USEENV /MAKE \ + "BuildAll - Win32 $(LONG)" $(CTARGET) +!ELSE + @msdev $(TLP).dsw /USEENV /MAKE \ + "BuildBin - Win32 $(LONG)" $(CTARGET) +!ENDIF +!IF "$(CTARGET)" == "/CLEAN" +!IF EXIST("srclib\apr-iconv") + @cd srclib\apr-iconv + @$(MAKE) $(MAKEOPT) -f build\modules.mk.win clean \ + BUILD_MODE=$(LONG) BIND_MODE=shared API_SOURCE=. + @cd ..\.. +!ENDIF +!ENDIF +!IF EXIST("srclib\openssl") + @msdev $(TLP).dsw /USEENV /MAKE \ + "mod_ssl - Win32 $(LONG)" \ + "abs - Win32 $(LONG)" /NORECURSE $(CTARGET) +!ENDIF +!IF EXIST("srclib\zlib") + @msdev $(TLP).dsw /USEENV /MAKE \ + "mod_deflate - Win32 $(LONG)" /NORECURSE $(CTARGET) +!ENDIF +!IF EXIST("srclib\lua") + @msdev $(TLP).dsw /USEENV /MAKE \ + "mod_lua - Win32 $(LONG)" /NORECURSE $(CTARGET) +!ENDIF +!IF EXIST("srclib\libxml2") + @msdev $(TLP).dsw /USEENV /MAKE \ + "mod_proxy_html - Win32 $(LONG)" /NORECURSE $(CTARGET) + @msdev $(TLP).dsw /USEENV /MAKE \ + "mod_xml2enc - Win32 $(LONG)" /NORECURSE $(CTARGET) +!ENDIF + +!ENDIF + + +_copybin: + copy $(LONG)\httpd.$(src_exe) "$(inst_exe)" <.y + copy $(LONG)\libhttpd.$(src_dll) "$(inst_dll)" <.y + copy srclib\apr\$(LONG)\libapr-1.$(src_dll) "$(inst_dll)" <.y +!IF EXIST("srclib\apr-util") + copy srclib\apr-iconv\$(LONG)\libapriconv-1.$(src_dll) "$(inst_dll)" <.y + copy srclib\apr-util\$(LONG)\libaprutil-1.$(src_dll) "$(inst_dll)" <.y + copy srclib\apr-util\ldap\$(LONG)\apr_ldap-1.$(src_dll) "$(inst_dll)" <.y +!ENDIF + for %d in (odbc $(DBD_LIST)) do ( \ + copy srclib\$(UTILDIR)\dbd\$(LONG)\apr_dbd_%d-1.$(src_dll) "$(inst_dll)" <.y \ + ) + for %d in ($(DBM_LIST) x) do if not %d == x ( \ + copy srclib\$(UTILDIR)\dbm\$(LONG)\apr_dbm_%d-1.$(src_dll) "$(inst_dll)" <.y \ + ) +!IF "$(SHORT)" == "D" + copy srclib\pcre\pcred.$(src_dll) "$(inst_dll)" <.y +!ELSE + copy srclib\pcre\pcre.$(src_dll) "$(inst_dll)" <.y +!ENDIF + copy modules\aaa\$(LONG)\mod_access_compat.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_allowmethods.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_auth_basic.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_auth_digest.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_auth_form.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authn_anon.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authn_core.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authn_dbd.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authn_dbm.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authn_file.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authn_socache.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authnz_fcgi.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authnz_ldap.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authz_core.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authz_dbd.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authz_dbm.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authz_core.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authz_groupfile.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authz_host.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authz_owner.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_authz_user.$(src_so) "$(inst_so)" <.y + copy modules\arch\win32\$(LONG)\mod_isapi.$(src_so) "$(inst_so)" <.y + copy modules\cache\$(LONG)\mod_cache.$(src_so) "$(inst_so)" <.y + copy modules\cache\$(LONG)\mod_cache_disk.$(src_so) "$(inst_so)" <.y + copy modules\cache\$(LONG)\mod_cache_socache.$(src_so) "$(inst_so)" <.y + copy modules\cache\$(LONG)\mod_file_cache.$(src_so) "$(inst_so)" <.y + copy modules\cache\$(LONG)\mod_socache_dbm.$(src_so) "$(inst_so)" <.y +# copy modules\cache\$(LONG)\mod_socache_dc.$(src_so) "$(inst_so)" <.y + copy modules\cache\$(LONG)\mod_socache_memcache.$(src_so) "$(inst_so)" <.y + copy modules\cache\$(LONG)\mod_socache_shmcb.$(src_so) "$(inst_so)" <.y + copy modules\cache\$(LONG)\mod_socache_redis.$(src_so) "$(inst_so)" <.y + copy modules\core\$(LONG)\mod_macro.$(src_so) "$(inst_so)" <.y + copy modules\core\$(LONG)\mod_watchdog.$(src_so) "$(inst_so)" <.y + copy modules\cluster\$(LONG)\mod_heartbeat.$(src_so) "$(inst_so)" <.y + copy modules\cluster\$(LONG)\mod_heartmonitor.$(src_so) "$(inst_so)" <.y + copy modules\database\$(LONG)\mod_dbd.$(src_so) "$(inst_so)" <.y + copy modules\dav\fs\$(LONG)\mod_dav_fs.$(src_so) "$(inst_so)" <.y + copy modules\dav\lock\$(LONG)\mod_dav_lock.$(src_so) "$(inst_so)" <.y + copy modules\dav\main\$(LONG)\mod_dav.$(src_so) "$(inst_so)" <.y +!IFDEF ALL + copy modules\debugging\$(LONG)\mod_bucketeer.$(src_so) "$(inst_so)" <.y +!ENDIF + copy modules\debugging\$(LONG)\mod_dumpio.$(src_so) "$(inst_so)" <.y +!IFDEF ALL + copy modules\echo\$(LONG)\mod_echo.$(src_so) "$(inst_so)" <.y + copy modules\examples\$(LONG)\mod_case_filter.$(src_so) "$(inst_so)" <.y + copy modules\examples\$(LONG)\mod_case_filter_in.$(src_so) "$(inst_so)" <.y + copy modules\examples\$(LONG)\mod_example_hooks.$(src_so) "$(inst_so)" <.y + copy modules\examples\$(LONG)\mod_example_ipc.$(src_so) "$(inst_so)" <.y +!ENDIF +!IF EXIST("srclib\brotli") + copy modules\filters\$(LONG)\mod_brotli.$(src_so) "$(inst_so)" <.y +!ENDIF + copy modules\filters\$(LONG)\mod_buffer.$(src_so) "$(inst_so)" <.y + copy modules\filters\$(LONG)\mod_charset_lite.$(src_so) "$(inst_so)" <.y + copy modules\filters\$(LONG)\mod_data.$(src_so) "$(inst_so)" <.y +!IF EXIST("srclib\zlib") + copy modules\filters\$(LONG)\mod_deflate.$(src_so) "$(inst_so)" <.y +!IF EXIST("srclib\zlib\zlib1.$(src_dll)") + copy srclib\zlib\zlib1.$(src_dll) "$(inst_dll)" <.y +!ENDIF +!ENDIF + copy modules\filters\$(LONG)\mod_ext_filter.$(src_so) "$(inst_so)" <.y + copy modules\filters\$(LONG)\mod_filter.$(src_so) "$(inst_so)" <.y + copy modules\filters\$(LONG)\mod_include.$(src_so) "$(inst_so)" <.y +!IF EXIST("srclib\libxml2") + copy modules\filters\$(LONG)\mod_proxy_html.$(src_so) "$(inst_so)" <.y + copy modules\filters\$(LONG)\mod_xml2enc.$(src_so) "$(inst_so)" <.y +!IF EXIST("srclib\libxml2\win32\bin.msvc\libxml2.$(src_dll)") + copy srclib\libxml2\win32\bin.msvc\libxml2.$(src_dll) "$(inst_dll)" <.y +!ENDIF +!ENDIF + copy modules\filters\$(LONG)\mod_ratelimit.$(src_so) "$(inst_so)" <.y + copy modules\filters\$(LONG)\mod_reflector.$(src_so) "$(inst_so)" <.y + copy modules\filters\$(LONG)\mod_reqtimeout.$(src_so) "$(inst_so)" <.y + copy modules\filters\$(LONG)\mod_request.$(src_so) "$(inst_so)" <.y + copy modules\filters\$(LONG)\mod_sed.$(src_so) "$(inst_so)" <.y + copy modules\filters\$(LONG)\mod_substitute.$(src_so) "$(inst_so)" <.y + copy modules\generators\$(LONG)\mod_asis.$(src_so) "$(inst_so)" <.y + copy modules\generators\$(LONG)\mod_autoindex.$(src_so) "$(inst_so)" <.y + copy modules\generators\$(LONG)\mod_cgi.$(src_so) "$(inst_so)" <.y + copy modules\generators\$(LONG)\mod_info.$(src_so) "$(inst_so)" <.y + copy modules\generators\$(LONG)\mod_status.$(src_so) "$(inst_so)" <.y + copy modules\http\$(LONG)\mod_mime.$(src_so) "$(inst_so)" <.y +!IF EXIST("srclib\nghttp2") + copy modules\http2\$(LONG)\mod_http2.$(src_so) "$(inst_so)" <.y + copy modules\http2\$(LONG)\mod_proxy_http2.$(src_so) "$(inst_so)" <.y +!IF "$(SHORT)" == "D" + copy srclib\nghttp2\lib\MSVC_obj\nghttp2d.$(src_dll) "$(inst_dll)" <.y +!ELSE + copy srclib\nghttp2\lib\MSVC_obj\nghttp2.$(src_dll) "$(inst_dll)" <.y +!ENDIF +!ENDIF + copy modules\ldap\$(LONG)\mod_ldap.$(src_so) "$(inst_so)" <.y + copy modules\loggers\$(LONG)\mod_log_config.$(src_so) "$(inst_so)" <.y + copy modules\loggers\$(LONG)\mod_log_debug.$(src_so) "$(inst_so)" <.y + copy modules\loggers\$(LONG)\mod_log_forensic.$(src_so) "$(inst_so)" <.y + copy modules\loggers\$(LONG)\mod_logio.$(src_so) "$(inst_so)" <.y +!IF EXIST("srclib\lua") + copy modules\lua\$(LONG)\mod_lua.$(src_so) "$(inst_so)" <.y +!IF EXIST("srclib\lua\src\lua51.$(src_dll)") + copy srclib\lua\src\lua51.$(src_dll) "$(inst_dll)" <.y +!ENDIF +!ENDIF + copy modules\mappers\$(LONG)\mod_actions.$(src_so) "$(inst_so)" <.y + copy modules\mappers\$(LONG)\mod_alias.$(src_so) "$(inst_so)" <.y + copy modules\mappers\$(LONG)\mod_dir.$(src_so) "$(inst_so)" <.y + copy modules\mappers\$(LONG)\mod_imagemap.$(src_so) "$(inst_so)" <.y + copy modules\mappers\$(LONG)\mod_negotiation.$(src_so) "$(inst_so)" <.y + copy modules\mappers\$(LONG)\mod_rewrite.$(src_so) "$(inst_so)" <.y + copy modules\mappers\$(LONG)\mod_speling.$(src_so) "$(inst_so)" <.y + copy modules\mappers\$(LONG)\mod_userdir.$(src_so) "$(inst_so)" <.y + copy modules\mappers\$(LONG)\mod_vhost_alias.$(src_so) "$(inst_so)" <.y +!IF EXIST("srclib\openssl") && EXIST("srclib\jansson") && EXIST("srclib\curl") + copy modules\md\$(LONG)\mod_md.$(src_so) "$(inst_so)" <.y +!IF "$(SHORT)" == "D" + -copy srclib\curl\bin\libcurl_debug.$(src_dll) "$(inst_dll)" <.y + -copy srclib\jansson\bin\jansson_d.$(src_dll) "$(inst_dll)" <.y +!ELSE + -copy srclib\curl\bin\libcurl.$(src_dll) "$(inst_dll)" <.y + -copy srclib\jansson\bin\jansson.$(src_dll) "$(inst_dll)" <.y +!ENDIF +!ENDIF + copy modules\metadata\$(LONG)\mod_cern_meta.$(src_so) "$(inst_so)" <.y + copy modules\metadata\$(LONG)\mod_env.$(src_so) "$(inst_so)" <.y + copy modules\metadata\$(LONG)\mod_expires.$(src_so) "$(inst_so)" <.y + copy modules\metadata\$(LONG)\mod_headers.$(src_so) "$(inst_so)" <.y + copy modules\metadata\$(LONG)\mod_ident.$(src_so) "$(inst_so)" <.y + copy modules\metadata\$(LONG)\mod_mime_magic.$(src_so) "$(inst_so)" <.y + copy modules\metadata\$(LONG)\mod_remoteip.$(src_so) "$(inst_so)" <.y + copy modules\metadata\$(LONG)\mod_setenvif.$(src_so) "$(inst_so)" <.y + copy modules\metadata\$(LONG)\mod_unique_id.$(src_so) "$(inst_so)" <.y + copy modules\metadata\$(LONG)\mod_usertrack.$(src_so) "$(inst_so)" <.y + copy modules\metadata\$(LONG)\mod_version.$(src_so) "$(inst_so)" <.y + copy modules\proxy\$(LONG)\mod_proxy.$(src_so) "$(inst_so)" <.y + copy modules\proxy\$(LONG)\mod_proxy_ajp.$(src_so) "$(inst_so)" <.y + copy modules\proxy\$(LONG)\mod_proxy_balancer.$(src_so) "$(inst_so)" <.y + copy modules\proxy\$(LONG)\mod_proxy_connect.$(src_so) "$(inst_so)" <.y + copy modules\proxy\$(LONG)\mod_proxy_express.$(src_so) "$(inst_so)" <.y + copy modules\proxy\$(LONG)\mod_proxy_fcgi.$(src_so) "$(inst_so)" <.y + copy modules\proxy\$(LONG)\mod_proxy_ftp.$(src_so) "$(inst_so)" <.y + copy modules\proxy\$(LONG)\mod_proxy_hcheck.$(src_so) "$(inst_so)" <.y + copy modules\proxy\$(LONG)\mod_proxy_http.$(src_so) "$(inst_so)" <.y + copy modules\proxy\$(LONG)\mod_proxy_scgi.$(src_so) "$(inst_so)" <.y + copy modules\proxy\$(LONG)\mod_proxy_uwsgi.$(src_so) "$(inst_so)" <.y + copy modules\proxy\$(LONG)\mod_proxy_wstunnel.$(src_so) "$(inst_so)" <.y + copy modules\proxy\balancers\$(LONG)\mod_lbmethod_bybusyness.$(src_so) "$(inst_so)" <.y + copy modules\proxy\balancers\$(LONG)\mod_lbmethod_byrequests.$(src_so) "$(inst_so)" <.y + copy modules\proxy\balancers\$(LONG)\mod_lbmethod_bytraffic.$(src_so) "$(inst_so)" <.y + copy modules\proxy\balancers\$(LONG)\mod_lbmethod_heartbeat.$(src_so) "$(inst_so)" <.y + copy modules\session\$(LONG)\mod_session.$(src_so) "$(inst_so)" <.y + copy modules\session\$(LONG)\mod_session_cookie.$(src_so) "$(inst_so)" <.y + copy modules\session\$(LONG)\mod_session_dbd.$(src_so) "$(inst_so)" <.y + copy modules\slotmem\$(LONG)\mod_slotmem_plain.$(src_so) "$(inst_so)" <.y + copy modules\slotmem\$(LONG)\mod_slotmem_shm.$(src_so) "$(inst_so)" <.y +!IF EXIST("srclib\openssl") +# copy modules\session\$(LONG)\mod_session_crypto.$(src_so) "$(inst_so)" <.y + copy modules\ssl\$(LONG)\mod_ssl.$(src_so) "$(inst_so)" <.y + -copy srclib\openssl\$(SSLBIN)\$(SSLCRP)*.$(src_dll) "$(inst_dll)" <.y + -copy srclib\openssl\$(SSLBIN)\$(SSLLIB)*.$(src_dll) "$(inst_dll)" <.y + -copy srclib\openssl\$(SSLAPP)\openssl.$(src_exe) "$(inst_exe)" <.y + copy support\$(LONG)\abs.$(src_exe) "$(inst_exe)" <.y +!ENDIF + copy support\$(LONG)\ab.$(src_exe) "$(inst_exe)" <.y +# copy support\$(LONG)\fcgistarter.$(src_exe) "$(inst_exe)" <.y + copy support\$(LONG)\htcacheclean.$(src_exe) "$(inst_exe)" <.y + copy support\$(LONG)\htdbm.$(src_exe) "$(inst_exe)" <.y + copy support\$(LONG)\htdigest.$(src_exe) "$(inst_exe)" <.y + copy support\$(LONG)\htpasswd.$(src_exe) "$(inst_exe)" <.y + copy support\$(LONG)\httxt2dbm.$(src_exe) "$(inst_exe)" <.y + copy support\$(LONG)\logresolve.$(src_exe) "$(inst_exe)" <.y + copy support\$(LONG)\rotatelogs.$(src_exe) "$(inst_exe)" <.y + copy support\win32\$(LONG)\ApacheMonitor.$(src_exe) "$(inst_exe)" <.y + copy support\win32\$(LONG)\wintty.$(src_exe) "$(inst_exe)" <.y + + +# First we create the tree and populate the README so that +# whatever happens, all licensing has already propagated. +# Then repeatedly invoke the _copybin build to copy the +# real binaries, then pdb symbols, anf finally dbg syms. +# Then hit docs of various sorts, then includes and libs, +# and finally do the .conf magic. +# +_install: + echo Y >.y + echo A >.A + -mkdir "$(INSTDIR)" + -mkdir "$(INSTDIR)\bin" +!IF EXIST("srclib\apr-util") + -mkdir "$(INSTDIR)\bin\iconv" +!ENDIF + -mkdir "$(INSTDIR)\cgi-bin" + -mkdir "$(INSTDIR)\conf" + -mkdir "$(INSTDIR)\conf\extra" + -mkdir "$(INSTDIR)\conf\original" + -mkdir "$(INSTDIR)\conf\original\extra" + -mkdir "$(INSTDIR)\error" + -mkdir "$(INSTDIR)\htdocs" + -mkdir "$(INSTDIR)\manual" + -mkdir "$(INSTDIR)\icons" + -mkdir "$(INSTDIR)\include" + -mkdir "$(INSTDIR)\lib" + -mkdir "$(INSTDIR)\logs" + -mkdir "$(INSTDIR)\modules" + copy ABOUT_APACHE "$(INSTDIR)\ABOUT_APACHE.txt" <.y + copy CHANGES "$(INSTDIR)\CHANGES.txt" <.y + copy INSTALL "$(INSTDIR)\INSTALL.txt" <.y + copy LICENSE "$(INSTDIR)\LICENSE.txt" <.y + copy NOTICE "$(INSTDIR)\NOTICE.txt" <.y + copy README "$(INSTDIR)\README.txt" <.y + type << >> "$(INSTDIR)\NOTICE.txt" + +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. The original software is +available from + ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ +<< + -awk -f <> "$(INSTDIR)\LICENSE.txt" +BEGIN { + print ""; + print "For the pcre.dll component:"; + print ""; + while ( getline > 0 ) { + if ( $$0 ~ /^End$$/ ) $$0 = "END OF PCRE LICENSE"; + print $$0; + } +} +<< +!IF EXIST("srclib\openssl") + -copy srclib\openssl\apps\openssl.cnf "$(INSTDIR)\conf\openssl.cnf" <.y + type << >> "$(INSTDIR)\NOTICE.txt" + +This binary distribution includes cryptographic software written by +Eric Young (eay@cryptsoft.com), software written by Tim Hudson +(tjh@cryptsoft.com), and software developed by the OpenSSL Project +for use in the OpenSSL Toolkit . +<< + -awk -f <> "$(INSTDIR)\LICENSE.txt" +BEGIN { + print ""; + print "For the libeay32.dll, ssleay32.dll and openssl.exe components:"; + print ""; + while ( getline > 0 ) { + print $$0; + } +} +<< + copy << "$(INSTDIR)\OPENSSL-NEWS.txt" <.y + + Apache HTTP Server 2.4 Limited OpenSSL Distribution + + This binary distribution includes the minimal components of OpenSSL required + to support mod_ssl for Apache HTTP Server version 2.4 (details are listed + in OPENSSL-README.txt.) For the complete list of CHANGES to this and later + versions of OpenSSL, please refer to the definative source, + , or see the CHANGES file in the + full binary or source distribution package from . + + These OpenSSL binaries were built for distribution from the U.S. without + support for the patented encryption methods IDEA, MDC-2 or RC5. + +-------------------------------------------------------------------------------- + +<< + -copy "$(INSTDIR)\OPENSSL-NEWS.txt" \ + + srclib\openssl\NEWS "$(INSTDIR)\OPENSSL-NEWS.txt" + copy << "$(INSTDIR)\OPENSSL-README.txt" <.y + + Apache HTTP Server 2.4 Limited OpenSSL Distribution + + This binary installation of OpenSSL is a limited distribution of the + files derived from the OpenSSL project: + + LICENSE.txt (includes openssl LICENSE) + OPENSSL-NEWS.txt + OPENSSL-README.txt + conf\openssl.cnf + bin\libeay32.dll + bin\ssleay32.dll + bin\openssl.exe + + These are the minimal libraries and tools required to use mod_ssl as + distributed with Apache HTTP Server version 2.4. No library link files, + headers or sources are distributed with this binary distribution. Please + refer to the site for complete source or binary + distributions. + + These OpenSSL binaries were built for distribution from the U.S. without + support for the patented encryption methods IDEA, MDC-2 or RC5. + + The Apache HTTP Project only supports the binary distribution of these files + and development of the mod_ssl module. We cannot provide support assistance + for using or configuring the OpenSSL package or these modules. Please refer + all installation and configuration questions to the appropriate forum, + such as the user supported lists, + the Apache HTTP Server user's list or the + OpenSSL support page. + +-------------------------------------------------------------------------------- + +<< + -copy "$(INSTDIR)\OPENSSL-README.txt" \ + + srclib\openssl\README "$(INSTDIR)\OPENSSL-README.txt" +!ENDIF +!IF EXIST("srclib\zlib") + type << >> "$(INSTDIR)\NOTICE.txt" + +This binary distribution of mod_deflate.so includes zlib compression code + written by Jean-loup Gailly (jloup@gzip.org) +and Mark Adler (madler@alumni.caltech.edu) . +<< + -awk -f <> "$(INSTDIR)\LICENSE.txt" +BEGIN { + while ( getline > 0 ) { + if ( $$0 ~ /Copyright notice:/ ) { + print ""; + print "For the mod_deflate zlib compression component:"; + while ( getline > 0 && $$0 !~ /^[^ ]/ ) { + print $$0; + } + exit 0; + } + } + exit 1; +} +<< +!ENDIF +!IF EXIST("srclib\lua") + type << >> "$(INSTDIR)\NOTICE.txt" + +This binary distribution of mod_lua.so includes the Lua language, +developed at Lua.org, a laboratory of the Department of Computer Science +of PUC-Rio (the Pontifical Catholic University of Rio de Janeiro in Brazil). +For complete information, visit Lua's web site at http://www.lua.org/ +<< + -awk -f <> "$(INSTDIR)\LICENSE.txt" +BEGIN { + print ""; + print "For the mod_lua language component:"; + print ""; + while ( getline > 0 && $$0 !~ /end of COPYRIGHT/ ) { + print $$0; + } + exit 0; +} +<< +!ENDIF +!IF EXIST("srclib\libxml2") + type << >> "$(INSTDIR)\NOTICE.txt" + +This binary distributions of mod_proxy_html.so and mod_xml2enc.so include the +libxml2 C library written by Daniel Veillard (daniel veillard.com), Bjorn +Reese (breese users.sourceforge.net) and Gary Pennington (Gary.Pennington +uk.sun.com). For complete information, visit LibXML2's web site at +https://http://www.xmlsoft.org/ +<< + -awk -f <> "$(INSTDIR)\LICENSE.txt" +BEGIN { + print ""; + print "For the mod_proxy_html and mod_xml2enc components:"; + print ""; + while ( getline > 0 ) { + print $$0; + } + exit 0; +} +<< +!ENDIF +!IF EXIST("srclib\nghttp2") + type << >> "$(INSTDIR)\NOTICE.txt" + +This binary distribution of mod_http2.so includes nghttp2 C library written +by Tatsuhiro Tsujikawa. For complete information, visit nghttp2's web site +at https://nghttp2.org/ +<< + -awk -f <> "$(INSTDIR)\LICENSE.txt" +BEGIN { + print ""; + print "For the mod_http2 component:"; + print ""; + while ( getline > 0 ) { + print $$0; + } + exit 0; +} +<< +!ENDIF +!IF EXIST("srclib\brotli") + type << >> "$(INSTDIR)\NOTICE.txt" + +This binary distribution of mod_brotli.so includes Brotli C library written +by the Brotli Authors. For complete information, visit Brotli's web site +at https://github.com/google/brotli +<< + -awk -f <> "$(INSTDIR)\LICENSE.txt" +BEGIN { + print ""; + print "For the mod_brotli component:"; + print ""; + while ( getline > 0 ) { + print $$0; + } + exit 0; +} +<< +!ENDIF + $(MAKE) $(MAKEOPT) -f Makefile.win SHORT=$(SHORT) LONG=$(LONG) \ + _copybin src_exe=exe src_dll=dll src_so=so \ + inst_exe="$(INSTDIR)\bin" \ + inst_dll="$(INSTDIR)\bin" \ + inst_so="$(INSTDIR)\modules" + $(MAKE) $(MAKEOPT) -f Makefile.win SHORT=$(SHORT) LONG=$(LONG) \ + _copybin src_exe=pdb src_dll=pdb src_so=pdb \ + inst_exe="$(INSTDIR)\bin" \ + inst_dll="$(INSTDIR)\bin" \ + inst_so="$(INSTDIR)\modules" +!IF EXIST("srclib\apr-util") + cd srclib\apr-iconv + $(MAKE) $(MAKEOPT) -f build\modules.mk.win install \ + BUILD_MODE=$(LONG) BIND_MODE=shared API_SOURCE=. \ + INSTALL_DIR="$(INSTDIR)\bin\iconv" + cd ..\.. +!ENDIF + copy docs\cgi-examples\printenv "$(INSTDIR)\cgi-bin\printenv.pl" <.y + -awk -f < "$(INSTDIR)\cgi-bin\printenv.pl" + BEGIN { + if ( "perl -e \"print $$^X;\"" | getline perlroot ) { + gsub( /\\/, "/", perlroot ); + print "#!" perlroot; + } + } + { + if ( $$0 !~ /^#!/ ) { + print $$0; + } + } +<< + xcopy docs\error "$(INSTDIR)\error" /s /d < .a + xcopy docs\docroot "$(INSTDIR)\htdocs" /d < .a + xcopy docs\icons "$(INSTDIR)\icons" /s /d < .a + xcopy docs\manual "$(INSTDIR)\manual" /s /d < .a + for %f in ( \ + srclib\expat\lib\expat.h \ + srclib\apr-util\xml\expat\lib\expat.h \ + srclib\apr\include\*.h \ + srclib\apr-util\include\*.h \ + include\*.h \ + os\win32\os.h \ + modules\cache\mod_cache.h \ + modules\cache\cache_common.h \ + modules\core\mod_so.h \ + modules\core\mod_watchdog.h \ + modules\database\mod_dbd.h \ + modules\dav\main\mod_dav.h \ + modules\filters\mod_include.h \ + modules\generators\mod_cgi.h \ + modules\generators\mod_status.h \ + modules\http2\mod_http2.h \ + modules\loggers\mod_log_config.h \ + modules\mappers\mod_rewrite.h \ + modules\proxy\mod_proxy.h \ + modules\ssl\mod_ssl.h \ + modules\ssl\mod_ssl_openssl.h \ + ) do \ + @copy %f "$(INSTDIR)\include" < .y > nul + copy srclib\apr\Lib$(SHORT)\apr-1.lib "$(INSTDIR)\lib" <.y + copy srclib\apr\Lib$(SHORT)\apr-1.pdb "$(INSTDIR)\lib" <.y + copy srclib\apr\$(LONG)\libapr-1.lib "$(INSTDIR)\lib" <.y + copy srclib\apr\$(LONG)\libapr-1.exp "$(INSTDIR)\lib" <.y +!IF EXIST("srclib\apr-util") + copy srclib\apr-util\Lib$(SHORT)\aprutil-1.lib "$(INSTDIR)\lib" <.y + copy srclib\apr-util\Lib$(SHORT)\aprutil-1.pdb "$(INSTDIR)\lib" <.y + copy srclib\apr-util\$(EXPAT)\Lib$(SHORT)\xml.lib "$(INSTDIR)\lib" <.y + copy srclib\apr-util\$(EXPAT)\Lib$(SHORT)\xml.pdb "$(INSTDIR)\lib" <.y + copy srclib\apr-util\$(LONG)\libaprutil-1.lib "$(INSTDIR)\lib" <.y + copy srclib\apr-util\$(LONG)\libaprutil-1.exp "$(INSTDIR)\lib" <.y + copy srclib\apr-iconv\$(LONG)\libapriconv-1.lib "$(INSTDIR)\lib" <.y + copy srclib\apr-iconv\$(LONG)\libapriconv-1.exp "$(INSTDIR)\lib" <.y +!ELSE + copy srclib\expat\win32\$(LONG)\libexpatMT.lib "$(INSTDIR)\lib" <.y + copy srclib\expat\win32\$(LONG)\libexpatMT.exp "$(INSTDIR)\lib" <.y + copy srclib\expat\win32\$(LONG)\libexpat.lib "$(INSTDIR)\lib" <.y + copy srclib\expat\win32\$(LONG)\libexpat.exp "$(INSTDIR)\lib" <.y + copy srclib\expat\win32\$(LONG)\libexpat.dll "$(INSTDIR)\bin" <.y +!ENDIF + copy $(LONG)\libhttpd.exp "$(INSTDIR)\lib" <.y + copy $(LONG)\libhttpd.lib "$(INSTDIR)\lib" <.y + copy modules\dav\main\$(LONG)\mod_dav.exp "$(INSTDIR)\lib" <.y + copy modules\dav\main\$(LONG)\mod_dav.lib "$(INSTDIR)\lib" <.y + for %f in ( charset.conv magic mime.types ) do ( \ + copy docs\conf\%f "$(INSTDIR)\conf\original\%f" <.y ) + awk -f build\installwinconf.awk $(DOMAINNAME) $(SERVERNAME) \ + $(SERVERADMIN) $(PORT) $(SSLPORT) "$(INSTDIR) " docs/conf/ + copy "support\dbmmanage.in" "$(INSTDIR)\bin\dbmmanage.pl" + -awk -f <"$(INSTDIR)\bin\dbmmanage.pl" + { if ( $$0 ~ /^BEGIN \{ @AnyDBM_File::/ ) { + sub( /ISA = qw\(.*\)/, "ISA = qw(SDBM_File)" ); + } + if ( $$0 !~ /^#!@perlbin@/ ) + print $$0; + } +<< + del .y + del .a diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..7890540 --- /dev/null +++ b/NOTICE @@ -0,0 +1,18 @@ +Apache HTTP Server +Copyright 2025 The Apache Software Foundation. + +This product includes software developed at +The Apache Software Foundation (https://www.apache.org/). + +Portions of this software were developed at the National Center +for Supercomputing Applications (NCSA) at the University of +Illinois at Urbana-Champaign. + +This software contains code derived from the RSA Data Security +Inc. MD5 Message-Digest Algorithm, including various +modifications by Spyglass Inc., Carnegie Mellon University, and +Bell Communications Research, Inc (Bellcore). + +This software contains code derived from the PCRE library pcreposix.c +source code, written by Philip Hazel, Copyright 1997-2004 +by the University of Cambridge, England. diff --git a/NWGNUmakefile b/NWGNUmakefile new file mode 100644 index 0000000..904430d --- /dev/null +++ b/NWGNUmakefile @@ -0,0 +1,481 @@ +# +# Define our required macro's if not already done. +# + +ifndef AP_WORK +export AP_WORK = $(CURDIR) +endif + +ifndef APR_WORK +ifeq "$(wildcard $(AP_WORK)/srclib/apr)" "$(AP_WORK)/srclib/apr" +export APR_WORK = $(AP_WORK)/srclib/apr +endif +endif +ifneq "$(wildcard $(APR_WORK)/include/apr_version.h)" "$(APR_WORK)/include/apr_version.h" +$(error APR_WORK does not point to a valid APR source tree) +endif + +ifndef APU_WORK +ifeq "$(wildcard $(AP_WORK)/srclib/apr-util)" "$(AP_WORK)/srclib/apr-util" +export APU_WORK = $(AP_WORK)/srclib/apr-util +endif +endif +ifndef APU_WORK +ifeq "$(wildcard $(APR_WORK)/include/apu_version.h)" "$(APR_WORK)/include/apu_version.h" +export APU_WORK = $(APR_WORK) +endif +endif +ifneq "$(wildcard $(APU_WORK)/include/apu_version.h)" "$(APU_WORK)/include/apu_version.h" +$(error APU_WORK does not point to a valid APU source tree) +endif + +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(APR_WORK) \ + build \ + support \ + modules \ + $(EOLIST) + +# +# Get the 'head' of the build environment. This includes default targets and +# paths to tools +# + +include $(AP_WORK)/build/NWGNUhead.inc + +# +# build this level's files + +# +# Make sure all needed macro's are defined +# + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(SRC)/include \ + $(STDMOD)/aaa \ + $(STDMOD)/core \ + $(STDMOD)/filters \ + $(STDMOD)/generators \ + $(STDMOD)/http \ + $(STDMOD)/loggers \ + $(STDMOD)/mappers \ + $(STDMOD)/proxy \ + $(STDMOD)/ssl \ + $(SERVER) \ + $(SERVER)/mpm/netware \ + $(PCRE) \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + -DHAVE_CONFIG_H \ + $(EOLIST) + +# +# These defines will come after DEFINES +# +XDEFINES += \ + $(EOLIST) + +# +# These flags will be added to the link.opt file +# +XLFLAGS += \ + $(EOLIST) + +# +# These values will be appended to the correct variables based on the value of +# RELEASE +# +ifeq "$(RELEASE)" "debug" +XINCDIRS += \ + $(EOLIST) + +XCFLAGS += \ + $(EOLIST) + +XDEFINES += \ + $(EOLIST) + +XLFLAGS += \ + $(EOLIST) +endif + +ifeq "$(RELEASE)" "noopt" +XINCDIRS += \ + $(EOLIST) + +XCFLAGS += \ + $(EOLIST) + +XDEFINES += \ + $(EOLIST) + +XLFLAGS += \ + $(EOLIST) +endif + +ifeq "$(RELEASE)" "release" +XINCDIRS += \ + $(EOLIST) + +XCFLAGS += \ + $(EOLIST) + +XDEFINES += \ + $(EOLIST) + +XLFLAGS += \ + $(EOLIST) +endif + +# +# These are used by the link target if an NLM is being generated +# This is used by the link 'name' directive to name the nlm. If left blank +# TARGET_nlm (see below) will be used. +# +NLM_NAME = Apache2 + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache Web Server $(VERSION_STR) $(VERSION_SKT) + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = $(NLM_NAME) + +# +# This is used by the '-screenname' directive. If left blank, +# 'Apache for NetWare' Thread will be used. +# +NLM_SCREEN_NAME = Apache $(VERSION_STR) for NetWare + + +# +# If this is specified, it will override VERSION value in +# $(AP_WORK)/build/NWGNUenvironment.inc +# +NLM_VERSION = + +# +# If this is specified, it will override the default of 64K +# +NLM_STACK_SIZE = 65536 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = _LibCCheckUnload + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = PSEUDOPREEMPTION + +# +# If this is specified it will be linked in with the XDCData option in the def +# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled +# by setting APACHE_UNIPROC in the environment +# +XDCDATA = + +# +# If there is an NLM target, put it here +# +TARGET_nlm = \ + $(OBJDIR)/$(NLM_NAME).nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(PCRELIB) \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/buildmark.o \ + $(OBJDIR)/config.o \ + $(OBJDIR)/connection.o \ + $(OBJDIR)/core.o \ + $(OBJDIR)/core_filters.o \ + $(OBJDIR)/eoc_bucket.o \ + $(OBJDIR)/eor_bucket.o \ + $(OBJDIR)/error_bucket.o \ + $(OBJDIR)/http_core.o \ + $(OBJDIR)/http_protocol.o \ + $(OBJDIR)/http_request.o \ + $(OBJDIR)/byterange_filter.o \ + $(OBJDIR)/chunk_filter.o \ + $(OBJDIR)/http_etag.o \ + $(OBJDIR)/http_filters.o \ + $(OBJDIR)/listen.o \ + $(OBJDIR)/log.o \ + $(OBJDIR)/main.o \ + $(OBJDIR)/mod_authn_core.o \ + $(OBJDIR)/mod_authz_core.o \ + $(OBJDIR)/mod_authz_host.o \ + $(OBJDIR)/mod_alias.o \ + $(OBJDIR)/mod_dir.o \ + $(OBJDIR)/mod_env.o \ + $(OBJDIR)/mod_include.o \ + $(OBJDIR)/mod_log_config.o \ + $(OBJDIR)/mod_mime.o \ + $(OBJDIR)/mod_negotiation.o \ + $(OBJDIR)/mod_netware.o \ + $(OBJDIR)/mod_setenvif.o \ + $(OBJDIR)/mod_so.o \ + $(OBJDIR)/mod_watchdog.o \ + $(OBJDIR)/modules.o \ + $(OBJDIR)/mpm_common.o \ + $(OBJDIR)/mpm_netware.o \ + $(OBJDIR)/protocol.o \ + $(OBJDIR)/provider.o \ + $(OBJDIR)/request.o \ + $(OBJDIR)/scoreboard.o \ + $(OBJDIR)/util.o \ + $(OBJDIR)/util_cfgtree.o \ + $(OBJDIR)/util_charset.o \ + $(OBJDIR)/util_cookies.o \ + $(OBJDIR)/util_debug.o \ + $(OBJDIR)/util_expr_eval.o \ + $(OBJDIR)/util_expr_parse.o \ + $(OBJDIR)/util_expr_scan.o \ + $(OBJDIR)/util_fcgi.o \ + $(OBJDIR)/util_filter.o \ + $(OBJDIR)/util_md5.o \ + $(OBJDIR)/util_mutex.o \ + $(OBJDIR)/util_nw.o \ + $(OBJDIR)/util_pcre.o \ + $(OBJDIR)/util_regex.o \ + $(OBJDIR)/util_script.o \ + $(OBJDIR)/util_time.o \ + $(OBJDIR)/util_xml.o \ + $(OBJDIR)/vhost.o \ + $(EOLIST) + +# Build in mod_nw_ssl if Winsock is being used +ifndef USE_STDSOCKETS +FILES_nlm_objs += $(OBJDIR)/mod_nw_ssl.o \ + $(EOLIST) +endif + +# +# These are the LIB files needed to create the NLM target above. +# These will be added as a library command in the link.opt file. +# +FILES_nlm_libs = \ + $(PCRELIB) \ + $(PRELUDE) \ + $(EOLIST) + +# +# These are the modules that the above NLM target depends on to load. +# These will be added as a module command in the link.opt file. +# +FILES_nlm_modules = \ + aprlib \ + Libc \ + $(EOLIST) + +# +# If the nlm has a msg file, put it's path here +# +FILE_nlm_msg = + +# +# If the nlm has a hlp file put it's path here +# +FILE_nlm_hlp = + +# +# If this is specified, it will override $(NWOS)\copyright.txt. +# +FILE_nlm_copyright = + +# +# Any additional imports go here +# +FILES_nlm_Ximports = \ + @aprlib.imp \ + @libc.imp \ + @netware.imp \ + GetCurrentAddressSpace \ + $(EOLIST) + +# Don't link with Winsock if standard sockets are being used +ifndef USE_STDSOCKETS +FILES_nlm_Ximports += @ws2nlm.imp \ + $(EOLIST) +endif + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + @httpd.imp \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +ifeq "$(wildcard $(PCRE)/pcre.c)" "$(PCRE)/pcre.c" + +FILES_lib_objs = \ + $(OBJDIR)/pcre.o \ + $(EOLIST) + +else + +FILES_lib_objs = \ + $(OBJDIR)/chartables.o \ + $(OBJDIR)/pcre_compile.o \ + $(OBJDIR)/pcre_exec.o \ + $(OBJDIR)/pcre_fullinfo.o \ + $(OBJDIR)/pcre_globals.o \ + $(OBJDIR)/pcre_newline.o \ + $(OBJDIR)/pcre_tables.o \ + $(OBJDIR)/pcre_version.o \ + $(EOLIST) +ifeq "$(wildcard $(PCRE)/pcre_try_flipped.c)" "$(PCRE)/pcre_try_flipped.c" +FILES_lib_objs += \ + $(OBJDIR)/pcre_try_flipped.o \ + $(EOLIST) +endif + +endif + +# +# implement targets and dependancies (leave this section alone) +# + +libs :: $(OBJDIR) $(TARGET_lib) + +nlms :: libs $(TARGET_nlm) + +# +# Updated this target to create necessary directories and copy files to the +# correct place. (See $(AP_WORK)/build/NWGNUhead.inc for examples) +# +MKCNF = $(AWK) -v BDIR=$(BASEDIR) -v PORT=$(PORT) -v SSLPORT=$(SSLPORT) -v MODSSL=$(WITH_SSL) -v BSDSKT=$(USE_STDSOCKETS) -f build/mkconfNW.awk $1 > $2 + +install :: nlms instscripts FORCE + $(call COPY,$(OBJDIR)/$(NLM_NAME).nlm, $(INSTALLBASE)/) + $(call COPY,ABOUT_APACHE, $(INSTALLBASE)/) + $(call COPY,CHANGES, $(INSTALLBASE)/) + $(call COPY,LICENSE, $(INSTALLBASE)/) + $(call COPY,README, $(INSTALLBASE)/) + $(call COPY,VERSIONING, $(INSTALLBASE)/) + $(call COPY,STATUS, $(INSTALLBASE)/) + $(call COPY,support/dbmmanage.in, $(INSTALLBASE)/bin/dbmmanage.pl) + $(call COPY,support/logresolve.pl.in, $(INSTALLBASE)/bin/logresolve.pl) + $(call COPY,support/split-logfile.in, $(INSTALLBASE)/bin/split-logfile.pl) + $(call COPY,support/check_forensic, $(INSTALLBASE)/bin/check_forensic.sh) + $(call COPY,docs/conf/magic, $(INSTALLBASE)/conf/) + $(call COPY,docs/conf/mime.types, $(INSTALLBASE)/conf/) + $(call COPY,docs/conf/charset.conv, $(INSTALLBASE)/conf/) + $(call COPY,docs/cgi-examples/printenv, $(INSTALLBASE)/cgi-bin/printenv.pl) + $(call MKCNF,docs/conf/httpd.conf.in, $(INSTALLBASE)/conf/httpd.conf) + $(call MKCNF,docs/conf/extra/httpd-autoindex.conf.in, $(INSTALLBASE)/conf/extra/httpd-autoindex.conf) + $(call MKCNF,docs/conf/extra/httpd-dav.conf.in, $(INSTALLBASE)/conf/extra/httpd-dav.conf) + $(call MKCNF,docs/conf/extra/httpd-default.conf.in, $(INSTALLBASE)/conf/extra/httpd-default.conf) + $(call MKCNF,docs/conf/extra/httpd-info.conf.in, $(INSTALLBASE)/conf/extra/httpd-info.conf) + $(call MKCNF,docs/conf/extra/httpd-languages.conf.in, $(INSTALLBASE)/conf/extra/httpd-languages.conf) + $(call MKCNF,docs/conf/extra/httpd-manual.conf.in, $(INSTALLBASE)/conf/extra/httpd-manual.conf) + $(call MKCNF,docs/conf/extra/httpd-mpm.conf.in, $(INSTALLBASE)/conf/extra/httpd-mpm.conf) + $(call MKCNF,docs/conf/extra/httpd-multilang-errordoc.conf.in, $(INSTALLBASE)/conf/extra/httpd-multilang-errordoc.conf) + $(call MKCNF,docs/conf/extra/httpd-userdir.conf.in, $(INSTALLBASE)/conf/extra/httpd-userdir.conf) + $(call MKCNF,docs/conf/extra/httpd-vhosts.conf.in, $(INSTALLBASE)/conf/extra/httpd-vhosts.conf) + $(call MKCNF,docs/conf/extra/httpd-ssl.conf.in, $(INSTALLBASE)/conf/extra/httpd-ssl.conf) + $(call MKCNF,docs/conf/extra/proxy-html.conf.in, $(INSTALLBASE)/conf/extra/proxy-html.conf) + $(call COPYR,docs/docroot, $(INSTALLBASE)/htdocs) + $(call COPYR,docs/error, $(INSTALLBASE)/error) + $(call COPYR,docs/icons, $(INSTALLBASE)/icons) + $(call COPYR,docs/man, $(INSTALLBASE)/man) + $(call COPYR,docs/manual, $(INSTALLBASE)/manual) + +installdev :: FORCE + $(call COPY,$(SRC)/include/*.h, $(INSTALLBASE)/include/) + $(call COPY,$(NWOS)/*.h, $(INSTALLBASE)/include/) + $(call COPY,$(APR)/include/*.h, $(INSTALLBASE)/include/) + $(call COPY,$(APRUTIL)/include/*.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/core/mod_so.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/core/mod_watchdog.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/cache/mod_cache.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/cache/cache_common.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/database/mod_dbd.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/dav/main/mod_dav.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/filters/mod_include.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/generators/mod_cgi.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/generators/mod_status.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/loggers/mod_log_config.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/mappers/mod_rewrite.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/proxy/mod_proxy.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/session/mod_session.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/ssl/mod_ssl.h, $(INSTALLBASE)/include/) + $(call COPY,$(STDMOD)/ssl/mod_ssl_openssl.h, $(INSTALLBASE)/include/) + $(call COPY,$(APR)/*.imp, $(INSTALLBASE)/lib/) + $(call COPY,$(NWOS)/*.imp, $(INSTALLBASE)/lib/) + $(call COPY,$(NWOS)/*.xdc, $(INSTALLBASE)/lib/) + $(call COPY,$(APBUILD)/NWGNU*.inc, $(INSTALLBASE)/build/) + +prebuild :: FORCE + $(MAKE) -C $(SERVER) -f NWGNUmakefile + $(MAKE) -C $(PCRE) -f NWGNUmakefile + $(call MKDIR,$(PREBUILD_INST)) + $(call COPY,$(SERVER)/$(OBJDIR)/*.nlm, $(PREBUILD_INST)/) + $(call COPY,$(PCRE)/$(OBJDIR)/*.nlm, $(PREBUILD_INST)/) + +# +# Any specialized rules here +# + +vpath %.c server:modules/arch/netware:modules/http:modules/aaa:modules/mappers +vpath %.c modules/generators:modules/metadata:modules/filters:modules/loggers +vpath %.c modules/core:os/netware:server/mpm/netware:$(PCRE) + +$(OBJDIR)/chartables.o: os/netware/chartables.c + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(APBUILD)/NWGNUtail.inc + +include $(APBUILD)/NWGNUscripts.inc + + diff --git a/README b/README new file mode 100644 index 0000000..f1f6d78 --- /dev/null +++ b/README @@ -0,0 +1,110 @@ + + Apache HTTP Server + + What is it? + ----------- + + The Apache HTTP Server is a powerful and flexible HTTP/1.1 compliant + web server. Originally designed as a replacement for the NCSA HTTP + Server, it has grown to be the most popular web server on the + Internet. As a project of the Apache Software Foundation, the + developers aim to collaboratively develop and maintain a robust, + commercial-grade, standards-based server with freely available + source code. + + The Latest Version + ------------------ + + Details of the latest version can be found on the Apache HTTP + server project page under https://httpd.apache.org/. + + Documentation + ------------- + + The documentation available as of the date of this release is + included in HTML format in the docs/manual/ directory. The most + up-to-date documentation can be found at + https://httpd.apache.org/docs/2.4/. + + Installation + ------------ + + Please see the file called INSTALL. Platform specific notes can be + found in README.platforms. + + Licensing + --------- + + Please see the file called LICENSE. + + Cryptographic Software Notice + ----------------------------- + + This distribution may include software that has been designed for use + with cryptographic software. The country in which you currently reside + may have restrictions on the import, possession, use, and/or re-export + to another country, of encryption software. BEFORE using any encryption + software, please check your country's laws, regulations and policies + concerning the import, possession, or use, and re-export of encryption + software, to see if this is permitted. See + for more information. + + The U.S. Government Department of Commerce, Bureau of Industry and + Security (BIS), has classified this software as Export Commodity + Control Number (ECCN) 5D002.C.1, which includes information security + software using or performing cryptographic functions with asymmetric + algorithms. The form and manner of this Apache Software Foundation + distribution makes it eligible for export under the License Exception + ENC Technology Software Unrestricted (TSU) exception (see the BIS + Export Administration Regulations, Section 740.13) for both object + code and source code. + + The following provides more details on the included files that + may be subject to export controls on cryptographic software: + + Apache httpd 2.0 and later versions include the mod_ssl module under + modules/ssl/ + for configuring and listening to connections over SSL encrypted + network sockets by performing calls to a general-purpose encryption + library, such as OpenSSL or the operating system's platform-specific + SSL facilities. + + In addition, some versions of apr-util provide an abstract interface + for symmetrical cryptographic functions that make use of a + general-purpose encryption library, such as OpenSSL, NSS, or the + operating system's platform-specific facilities. This interface is + known as the apr_crypto interface, with implementation beneath the + /crypto directory. The apr_crypto interface is used by the + mod_session_crypto module available under + modules/session + for optional encryption of session information. + + Some object code distributions of Apache httpd, indicated with the + word "crypto" in the package name, may include object code for the + OpenSSL encryption library as distributed in open source form from + . + + The above files are optional and may be removed if the cryptographic + functionality is not desired or needs to be excluded from redistribution. + Distribution packages of Apache httpd that include the word "nossl" + in the package name have been created without the above files and are + therefore not subject to this notice. + + Contacts + -------- + + o If you want to be informed about new code releases, bug fixes, + security fixes, general news and information about the Apache server + subscribe to the apache-announce mailing list as described under + + + o If you want freely available support for running Apache please see the + resources at + + o If you have a concrete bug report for Apache please see the instructions + for bug reporting at + + o If you want to participate in actively developing Apache please + subscribe to the `dev@httpd.apache.org' mailing list as described at + + diff --git a/README.CHANGES b/README.CHANGES new file mode 100644 index 0000000..26f8c26 --- /dev/null +++ b/README.CHANGES @@ -0,0 +1,19 @@ +Changes can be documented in two ways now: Either by directly editing the +CHANGES file like it was done until now or by storing each entry for the +CHANGES file correctly formated in a separate file in the changes-entries +directory. + +The benefit of the single file per change approach is that it eases backporting +the CHANGES entry to a stable branch as it avoids the frequent merge conflicts +as changes are merged in different orders or not at all in the stable branch. + +In order to keep the current CHANGES file for the users as is there is a new +make target called 'update-changes'. It merges all change files in the +changes-entries directory to the top of the CHANGES file and removes them +afterwards. + +This make target can be seen in a similar way as the scripts to update the +documentation files from its xml sources. It can be executed immediately +after the new file in the changes-entries directory has been created / merged +and committed or it can be executed later. It should be executed at least before +a release gets tagged. diff --git a/README.cmake b/README.cmake new file mode 100644 index 0000000..f262c14 --- /dev/null +++ b/README.cmake @@ -0,0 +1,329 @@ +Experimental cmake-based build support for Apache httpd on Microsoft Windows + +Status +------ + +This build support is currently intended only for Microsoft Windows. + +This build support is experimental. Specifically, + +* It does not support all features of Apache httpd. +* Some components may not be built correctly and/or in a manner + compatible with the previous Windows build support. +* Build interfaces, such as the mechanisms which are used to enable + optional functionality or specify prerequisites, may change from + release to release as feedback is received from users and bugs and + limitations are resolved. + +Important: Refer to the "Known Bugs and Limitations" section for further + information. + + It is beyond the scope of this document to document or explain + how to utilize the various cmake features, such as different + build backends or provisions for finding support libraries. + + Please refer to the cmake documentation for additional information + that applies to building any project with cmake. + +Prerequisites +------------- + +The following tools must be in PATH: + +* cmake, version 2.8 or later + cmake version 3.1.3 or later is required to work with current OpenSSL + releases. (OpenSSL is an optional prerequisite of httpd.) +* Perl +* If the WITH_MODULES feature is used: awk +* If using a command-line compiler: compiler and linker and related tools + (Refer to the cmake documentation for more information.) + +The following support libraries are mandatory: + +* APR, built with cmake + + Either APR 2.0-dev (trunk) or APR 1.5.x and APR-Util 1.5.x. + + When building APR (but not APR-Util), specify the build option + APR_INSTALL_PRIVATE_H so that non-standard files required for building + Apache httpd are installed. + + Additional APR settings affect httpd but are not mandatory, such as + APR_HAVE_IPV6. +* PCRE + +Certain optional features of APR 2.0-dev (trunk) or APR-Util 1.5.x +allow some optional features of httpd to be enabled. For example, +APU_HAVE_CRYPTO is required for mod_session_crypto. + +Additional support libraries allow some optional features of httpd to be +enabled: + +* libxml2 (e.g., mod_proxy_html) +* lua 5.1 (mod_lua) +* nghttp2 (mod_http2) +* openssl (mod_ssl and https support for ab) +* zlib (mod_deflate) + +OpenSSL +------- + +If you have a binary install of OpenSSL in a well-known directory (e.g., +%HOME%\OpenSSL-Win64) and you wish to build httpd against a different +install of OpenSSL, the cmake build may unexpectedly select OpenSSL +libraries in the well-known directory even if the expected include files +are used. Check the cmake output from your httpd build to confirm that +the expected OpenSSL libraries and include files are used. + +The cmake FindOpenSSL module searches for OpenSSL libraries in a "VC" +subdirectory of the OpenSSL install with filenames that indicate the build +type (e.g., "/lib/VC/ssleay32MD.lib"); defining CMAKE_PREFIX_PATH +or OPENSSL_ROOT_DIR or even OPENSSL_LIBRARIES does not circumvent finding +these libraries. + +To work around this issue, rename the well-known OpenSSL directory while +building httpd. Let us know if you find a better solution. + +nghttp2 +------- + +This is required for mod_http2. + +cmake-based build support for nghttp2 for Windows can be found at +https://github.com/trawick/nghttp2-minimal-cmake. That easily fits into +a build system that already uses cmake for httpd, apr, and perhaps other +packages. A dynamic build of nghttp2 using its normal Windows build +system should also be usable by nghttp2. + +How to build +------------ + +1. cd to a clean directory for building (i.e., don't build in your + source tree) + +2. Make sure cmake and Perl are in PATH. Additionally, some backends + require compile tools in PATH. (Hint: "Visual Studio Command Prompt") + In the unlikely event that you use -DWITH_MODULES, described below, make + sure awk is in PATH. + +3. cmake -G "some backend, like 'NMake Makefiles'" + -DCMAKE_INSTALL_PREFIX=d:/path/to/httpdinst + -DENABLE_foo=A|I|O|a|i + -DENABLE_MODULES=A|I|O|a|i + d:/path/to/httpdsource + + Alternately, you can use the cmake-gui and update settings in the GUI. + + PCRE_INCLUDE_DIR, PCRE_LIBRARIES, APR_INCLUDE_DIR, APR_LIBRARIES, + NGHTTP2_INCLUDE_DIR, NGHTTP2_LIBRARIES: + + cmake doesn't bundle FindXXX for these packages, so the crucial + information has to be specified in this manner if they aren't found + in their default location. + + -DPCRE_INCLUDE_DIR=d:/path/to/pcreinst/include + -DPCRE_LIBRARIES=d:/path/to/pcreinst/lib/pcre[d].lib + + These will have to be specified only if PCRE is installed to a different + directory than httpd, or if debug *and* release builds of PCRE were + installed there and you want to control which is used. (Currently the + build will use pcred.lib (debug) if it is found in the default location + and not overridden with -DPCRE_LIBRARIES.) + + -DAPR_INCLUDE_DIR=d:/path/to/aprinst/include + -DAPR_LIBRARIES="d:/path/to/aprinst/lib/libapr-1.lib;d:/path/to/aprinst/lib/libaprutil-1.lib" + + These will have to be specified if APR[-Util] was installed to a + different directory than httpd. + + When building with APR trunk (future APR 2.x, with integrated APR-Util), + specify just the path to libapr-2.lib: + + -DAPR_LIBRARIES=d:/path/to/aprinst/lib/libapr-2.lib + + APR+APR-Util 1.x vs. APR trunk will be detected automatically if they + are installed to the same location as httpd. + + APR-Util 1.x has an optional LDAP library. If APR-Util has LDAP enabled + and httpd's mod_ldap and mod_authnz_ldap are being used, include the + path to the LDAP library in the APR_LIBRARIES setting. (If APR and + APR-Util are found in the default location, the LDAP library will be + included if it is present. + + -DNGHTTP2_INCLUDE_DIR=d:/path/to/nghttp2inst/include (which has nghttp2/*.h) + -DNGHTTP2_LIBRARIES="d:/path/to/nghttp2inst/lib/nghttp2.lib" + + These will have to be specified if nghttp2 was installed to a different + directory than httpd. + + LIBXML2_ICONV_INCLUDE_DIR, LIBXML2_ICONV_LIBRARIES + + If using a module that requires libxml2 *and* the build of libxml2 requires + iconv, set these variables to allow iconv includes and libraries to be + used. For example: + + -DLIBXML2_ICONV_INCLUDE_DIR=c:\iconv-1.9.2.win32\include + -DLIBXML2_ICONV_LIBRARIES=c:\iconv-1.9.2.win32\lib\iconv.lib + + CMAKE_C_FLAGS_RELEASE, _DEBUG, _RELWITHDEBINFO, _MINSIZEREL + CMAKE_BUILD_TYPE + + For NMake Makefiles the choices are at least DEBUG, RELEASE, + RELWITHDEBINFO, and MINSIZEREL + Other backends may have other selections. + + ENABLE_foo: + + Each module has a default setting which can be overridden with one of + the following values: + A build and Activate module + a build and Activate module IFF prereqs are available; if + prereqs are unavailable, don't build it + I build module but leave it Inactive (commented-out + LoadModule directive) + i build module but leave it Inactive IFF prereqs are + available; if prereqs are unavailable, don't build it + O Omit module completely + + Examples: -DENABLE_ACCESS_COMPAT=O + -DENABLE_PROXY_HTML=i + + ENABLE_MODULES: + + This changes the *minimum* enablement of all modules to the specified + value (one of A, a, I, i, O, as described under ENABLE_foo above). + + The ranking of enablement from lowest to highest is O, i, I, a, A. + If a specific module has a higher rank enablement setting, either from + a built-in default or from -DENABLE_foo, ENABLE_MODULES won't affect + that module. However, if a specific module has a lower-rank enablement + setting, presumably from a built-in default, the value of ENABLE_MODULES + will be used for that module. + + Explanations for possible values: + + -DENABLE_MODULES=a build and activate all possible modules, + ignoring any with missing prereqs + (doesn't affect modules with A for ENABLE_foo) + + -DENABLE_MODULES=i build but leave inactive all possible + modules, ignoring any with missing + prereqs + (doesn't affect modules with A, a, or I for + ENABLE_foo) + + -DENABLE_MODULES=O no impact, since all modules are either + already disabled or have a higher setting + + -DENABLE_MODULES=A build and activate all possible modules, + failing the build if any module is missing + a prereq + + -DENABLE_MODULES=I similar to -DENABLE_MODULES=A + (doesn't affect modules with A or a for + ENABLE_foo) + + WITH_MODULES: + + Comma-separated paths to single file modules to statically linked into + the server, like the --with-module=modpath:/path/to/mod_foo.c with + the autoconf-based build. Key differences: The modpath (e.g., + "generators") isn't provided or used, and the copy of the module + source being built is automatically updated when it changes. + See also EXTRA_COMPILE_FLAGS, EXTRA_INCLUDES, and EXTRA_LIBS. + + EXTRA_COMPILE_FLAGS: + + Space-delimited compile flags to define with the build. + + EXTRA_INCLUDES: + + List of additional directories to search for .h files. This may + be necessary when including third-party modules in the httpd build + via WITH_MODULES. + + EXTRA_LIBS: + + List of additional libraries to link with. This may be necessary when + including third-party modules in the httpd build via WITH_MODULES. + + Port and SSLPort: + + Port numbers for substitution into default .conf files. (The defaults + are 80 and 443.) + + INSTALL_PDB: + + If .pdb files are generated for debugging, install them. + Default: ON + + The .pdb files are generally needed for debugging low-level code + problems. If they aren't installed, they are still available in the + build directory for use by alternate packaging implementations or when + debugging on the build machine. + + INSTALL_MANUAL: + + Install the Apache HTTP Server manual. + Default: ON + + This could be turned off when developing changes in order to speed up + installation time. + +4. Build using the chosen generator (e.g., "nmake install" for cmake's "NMake + Makefiles" generator). + +Running the server and support programs +--------------------------------------- + +This build system does not copy binaries such as dlls from other projects +into the httpd install location. Without taking some precautions, httpd +and support programs can fail to start or modules can fail to load because +a support library can't be found in PATH or in the directory of the httpd +binary. + +This can be resolved in several different ways: + +* Install httpd and the various support libraries to a common install + prefix so that support libraries and httpd programs are installed in + the same bin directory and are found without setting PATH. + +* Update PATH to include the bin directories of all necessary support + libraries. + + Depending on where PATH is set, it may not affect starting httpd as + a service. + +* Maintain a script which combines required binaries into a common + location, such as the httpd installion bin directory, and use that + script after building or otherwise installing or updating support + libraries. + +* AVOID THE USE of any unrepeatable process of copying dll files around + from different install locations until something starts working. The + result is that when you later update a support library to pick up a + security fix, httpd will likely continue to use the old, vulnerable + library file. + +Known Bugs and Limitations +-------------------------- + +* no standard script or makefile is provided to tie together the builds + of httpd and support libraries in a manner suitable for typical users +* no logic to find support libraries or otherwise build these modules: + + mod_socache_dc (requires distcache), mod_serf (requires serf) + + additionally, mod_firehose doesn't compile on Windows anyway +* buildmark.c isn't necessarily rebuilt when httpd.exe is regenerated +* ApacheMonitor has a build error and is disabled +* CGI examples aren't installed +* dbmmanage.pl and wintty aren't built/installed +* module enablement defaults are not in sync with the autoconf-based build +* no support for static support library builds; unclear if that is a + requirement; if so: taking PCRE as an example, we'd need to detect that it + is static and then turn on PCRE_STATIC for the libhttpd build + +Generally: + +* Many httpd features have not been tested with this build. +* Developers need to examine the existing Windows build in great detail and see + what is missing from the cmake-based build, whether a feature or some build + nuance. +* Any feedback you can provide on your experiences with this build will be + helpful. diff --git a/README.platforms b/README.platforms new file mode 100644 index 0000000..a377079 --- /dev/null +++ b/README.platforms @@ -0,0 +1,112 @@ + + Apache HTTP Server + + Platform specific notes: + ------------------------ + +================ + Darwin (OS X): + Apache 2 relies heavily on the use of autoconf and libtool to + provide a build environment. Darwin provides these tools as part + of the Developers Tools package. Under Darwin, however, GNUlibtool + is installed as 'glibtool' to avoid conflicting with the Darwin + 'libtool' program. Apache 2 knows about this so that's not a + problem. + + As of OS X 10.2 (Jaguar), the bundled versions work perfectly. Partly + this is due to the fact that /bin/sh is now 'bash' and not 'zsh' as + well as the fact that the bundled versions are up-to-date: + autoconf 2.52 and (g)libtool 1.4.2. + + You will note that GNU libtool should actually be installed as + glibtool, to avoid conflict with a Darwin program of the same + name. + + There have been some reports that autoconf 2.52 prevents Apache's + build system from correctly handling passing multi-value envvars + to the build system (eg: CFLAGS="-g -O3" ./configure), causing + errors. Use of bash does not seem to help in this situation. If + this affects you, downgrading to autoconf 2.13 (which is installed + on Darwin) will help. + + With Leopard (at least up to 10.5.2), when running configure + you will likely see errors such as: + + rm: conftest.dSYM: is a directory + + This is a known issue and will be fixed in a later version of the + autoconf suite. These errors can be safely ignored. + + For later versions of OS X, (10.8 and 10.9), be sure to have Xcode + AND Xcode Command Line Tools installed. httpd will built both with + gcc and clang. + +========== + FreeBSD: + autoconf 2.52 creates scripts that are incompatible with the Posix + shell implementation (/bin/sh) on FreeBSD. Be sure to use v2.13 + of autoconf. + + Threaded MPMs are not supported on FreeBSD 4.x. Current releases of + FreeBSD 5.x (5.2 or later) support threaded MPMs correctly. You must pass + '--enable-threads=yes' to APR's configure in order to enable threads. + Additionally, you must use libthr or libkse via libmap.conf as the default + libc_r is still broken as of this writing. Please consult the man page for + libmap.conf for more details about configuring libthr or libkse. +================ + HP-UX: + The dlopen() system call in HP-UX has problems when loading/unloading + C++ modules. The problem can be resolved by using shl_load() instead + of dlopen(). This is fixed in the Apache 2.0.44 release. + To enable loading of C++ modules, the httpd binary has to be linked with + the following libraries : + + HP-UX (11.0 / 11i): + When using shl_load : "cpprt0_stub.s -lcl" + When using dlopen : "cpprt0_stub.s -lcl -lCsup" + + HP-UX (11i version 1.5 and greater): + When using dlopen/shl_load : "cpprt0_stub.s -lcl -lunwind" + + The cpprt0_stub.s can be downloaded from the web site : + http://h21007.www2.hp.com/hpux-devtools/CXX/hpux-devtools.0107/0083.html + + Compile cpprt0_stub.s with the PIC option + cc -c +z cpprt0_stub.s + - OR - + gcc -c -fPIC cpprt0_stub.s +================ + AIX, using the vendor C compiler with optimization: + There is an issue with compiling server/core.c with optimization enabled + which has been seen with C for AIX 5.0.2.3 and above. (5.0.2.0, 5.0.2.1, + and 5.0.2.2 have an additional problem with Apache 2.0.x, so either upgrade + the compiler or don't use optimization in order to avoid it.) + + cc_r works fine with -O2 but xlc_r does not. In order to use xlc_r with + -O2, apply the patch at + + http://www.apache.org/dist/httpd/patches/apply_to_2.0.49/aix_xlc_optimization.patch + + (That patch works with many recent levels of Apache 2+.) + +================ + Solaris: + + On Solaris, better performance may be achieved by using the Sun Studio + compiler instead of gcc. As of version 11, it is now free (registration + required). Download the compiler from: + + http://developers.sun.com/prodtech/cc/downloads/index.jsp + + If you use Sun Studio, the following compiler flags (CFLAGS) are + recommended: + + -XO4 -xchip=generic + +================ + Ubuntu: + + You will need to ensure that you have either libtool 1.5.6 + or 2.2.6b, or later. Expat 2.0.1 and PCRE 8.02 are also + recommended to be installed. If building PCRE from source, + you'll also need g++. diff --git a/ROADMAP b/ROADMAP new file mode 100644 index 0000000..4b3f662 --- /dev/null +++ b/ROADMAP @@ -0,0 +1,229 @@ +APACHE 2.x ROADMAP +================== +Last modified at [$Date: 2020-02-20 19:33:40 -0500 (Thu, 20 Feb 2020) $] + + +WORKS IN PROGRESS +----------------- + + * Source code should follow style guidelines. + OK, we all agree pretty code is good. Probably best to clean this + up by hand immediately upon branching a 2.1 tree. + Status: Justin volunteers to hand-edit the entire source tree ;) + + Justin says: + Recall when the release plan for 2.0 was written: + Absolute Enforcement of an "Apache Style" for code. + Watch this slip into 3.0. + + David says: + The style guide needs to be reviewed before this can be done. + http://httpd.apache.org/dev/styleguide.html + The current file is dated April 20th 1998! + + OtherBill offers: + It's survived since '98 because it's welldone :-) Suggest we + simply follow whatever is documented in styleguide.html as we + branch the next tree. Really sort of straightforward, if you + dislike a bit within that doc, bring it up on the dev@httpd + list prior to the next branch. + + So Bill sums up ... let's get the code cleaned up in CVS head. + Remember, it just takes cvs diff -b (that is, --ignore-space-change) + to see the code changes and ignore that cruft. Get editing Justin :) + + * Replace stat [deferred open] with open/fstat in directory_walk. + Justin, Ian, OtherBill all interested in this. Implies setting up + the apr_file_t member in request_rec, and having all modules use + that file, and allow the cleanup to close it [if it isn't a shared, + cached file handle.] + + * The Async Apache Server implemented in terms of APR. + [Bill Stoddard's pet project.] + Message-ID: <008301c17d42$9b446970$01000100@sashimi> (dev@apr) + + OtherBill notes that this can proceed in two parts... + + Async accept, setup, and tear-down of the request + e.g. dealing with the incoming request headers, prior to + dispatching the request to a thread for processing. + This doesn't need to wait for a 2.x/3.0 bump. + + Async delegation of the entire request processing chain + Too many handlers use stack storage and presume it is + available for the life of the request, so a complete + async implementation would need to happen 3.0 release. + + Brian notes that async writes will provide a bigger + scalability win than async reads for most servers. + We may want to try a hybrid sync-read/async-write MPM + as a next step. This should be relatively easy to + build: start with the current worker or leader/followers + model, but hand off each response brigade to a "completion + thread" that multiplexes writes on many connections, so + that the worker thread doesn't have to wait around for + the sendfile to complete. + + +MAKING APACHE REPOSITORY-AGNOSTIC +(or: remove knowledge of the filesystem) + +[ 2002/10/01: discussion in progress on items below; this isn't + planned yet ] + + * dav_resource concept for an HTTP resource ("ap_resource") + + * r->filename, r->canonical_filename, r->finfo need to + disappear. All users need to use new APIs on the ap_resource + object. + + (backwards compat: today, when this occurs with mod_dav and a + custom backend, the above items refer to the topmost directory + mapped by a location; e.g. docroot) + + Need to preserve a 'filename'-like string for mime-by-name + sorts of operations. But this only needs to be the name itself + and not a full path. + + Justin: Can we leverage the path info, or do we not trust the + user? + + gstein: well, it isn't the "path info", but the actual URI of + the resource. And of course we trust the user... that is + the resource they requested. + + dav_resource->uri is the field you want. path_info might + still exist, but that portion might be related to the + CGI concept of "path translated" or some other further + resolution. + + To continue, I would suggest that "path translated" and + having *any* path info is Badness. It means that you did + not fully resolve a resource for the given URI. The + "abs_path" in a URI identifies a resource, and that + should get fully resolved. None of this "resolve to + and then we have a magical second resolution + (inside the CGI script)" or somesuch. + + Justin: Well, let's consider mod_mbox for a second. It is sort of + a virtual filesystem in its own right - as it introduces + it's own notion of a URI space, but it is intrinsically + tied to the filesystem to do the lookups. But, for the + portion that isn't resolved on the file system, it has + its own addressing scheme. Do we need the ability to + layer resolution? + + * The translate_name hook goes away + + Wrowe altogether disagrees. translate_name today even operates + on URIs ... this mechanism needs to be preserved. + + * The doc for map_to_storage is totally opaque to me. It has + something to do with filesystems, but it also talks about + security and per_dir_config and other stuff. I presume something + needs to happen there -- at least better doc. + + Wrowe agrees and will write it up. + + * The directory_walk concept disappears. All configuration is + tagged to Locations. The "mod_filesystem" module might have some + internal concept of the same config appearing in multiple + places, but that is handled internally rather than by Apache + core. + + Wrowe suggests this is wrong, instead it's private to filesystem + requests, and is already invoked from map_to_storage, not the core + handler. and blocks are preserved as-is, + but sections become specific to the filesystem handler + alone. Because alternate filesystem schemes could be loaded, this + should be exposed, from the core, for other file-based stores to + share. Consider an archive store where the layers become + -> -> + + Justin: How do we map Directory entries to Locations? + + * The "Location tree" is an in-memory representation of the URL + namespace. Nodes of the tree have configuration specific to that + location in the namespace. + + Something like: + + typedef struct { + const char *name; /* name of this node relative to parent */ + + struct ap_conf_vector_t *locn_config; + + apr_hash_t *children; /* NULL if no child configs */ + } ap_locn_node; + + The following config: + + + SetHandler server-status + Order deny,allow + Deny from all + Allow from 127.0.0.1 + + + Creates a node with name=="server_status", and the node is a + child of the "/" node. (hmm. node->name is redundant with the + hash key; maybe drop node->name) + + In the config vector, mod_access has stored its Order, Deny, and + Allow configs. mod_core has stored the SetHandler. + + During the Location walk, we merge the config vectors normally. + + Note that an Alias simply associates a filesystem path (in + mod_filesystem) with that Location in the tree. Merging + continues with child locations, but a merge is never done + through filesystem locations. Config on a specific subdir needs + to be mapped back into the corresponding point in the Location + tree for proper merging. + + * Config is parsed into a tree, as we did for the 2.0 timeframe, + but that tree is just a representation of the config (for + multiple runs and for in-memory manipulation and usage). It is + unrelated to the "Location tree". + + * Calls to apr_file_io functions generally need to be replaced + with operations against the ap_resource. For example, rather + than calling apr_dir_open/read/close(), a caller uses + resource->repos->get_children() or somesuch. + + Note that things like mod_dir, mod_autoindex, and mod_negotiation + need to be converted to use these mechanisms so that their + functions will work on logical repositories rather than just + filesystems. + + * How do we handle CGI scripts? Especially when the resource may + not be backed by a file? Ideally, we should be able to come up + with some mechanism to allow CGIs to work in a + repository-independent manner. + + - Writing the virtual data as a file and then executing it? + - Can a shell be executed in a streamy manner? (Portably?) + - Have an 'execute_resource' hook/func that allows the + repository to choose its manner - be it exec() or whatever. + - Won't this approach lead to duplication of code? Helper fns? + + gstein: PHP, Perl, and Python scripts are nominally executed by + a filter inserted by mod_php/perl/python. I'd suggest + that shell/batch scripts are similar. + + But to ask further: what if it is an executable + *program* rather than just a script? Do we yank that out + of the repository, drop it onto the filesystem, and run + it? eeewwwww... + + I'll vote -0.9 for CGIs as a filter. Keep 'em handlers. + + Justin: So, do we give up executing CGIs from virtual repositories? + That seems like a sad tradeoff to make. I'd like to have + my CGI scripts under DAV (SVN) control. + + * How do we handle overlaying of Location and Directory entries? + Right now, we have a problem when /cgi-bin/ is ScriptAlias'd and + mod_dav has control over /. Some people believe that /cgi-bin/ + shouldn't be under DAV control, while others do believe it + should be. What's the right strategy? diff --git a/VERSIONING b/VERSIONING new file mode 100644 index 0000000..bc9ad8a --- /dev/null +++ b/VERSIONING @@ -0,0 +1,154 @@ +APACHE 2.x VERSIONING +===================== +[$LastChangedDate: 2020-02-20 19:33:40 -0500 (Thu, 20 Feb 2020) $] + + +INTRODUCTION +------------ +The Apache HTTP Server project must balance two competing and disjoint +objectives: maintain stable code for third party authors, distributors and +most importantly users so that bug and security fixes can be quickly adopted +without significant hardship due to user-visible changes; and continue the +development process that requires ongoing redesign to correct earlier +oversights and to add additional features. + +The Apache HTTP Server, through version 2.0, used the Module Magic Number (MMN) +to reflect API changes. This had the shortcoming of often leaving users +hunting to replace binary third party modules that were now incompatible. +This also left module authors searching through the API change histories to +determine the exact cause for the MMN change and whether their module was +affected. + +With the simultaneous release of Apache 2.2-stable and Apache 2.3-development, +the Apache HTTP Server project is moving towards a more predictable stable +release cycle, while allowing forward progress to occur without concern +for breaking the stable branch. This document explains the rationale between +the two versions and their behavior. + + +STABLE RELEASES, 2.{even}.{revision} +------------------------------------ + +All even numbered releases will be considered stable revisions. + +Stable revisions will retain forward compatibility to the maximum +possible extent. Features may be added during minor revisions, and +features may be deprecated by making appropriate notations in the +documentation, but no features may be removed. + +In essence, that implies that you can upgrade from one minor revision +to the next with a minimum of trouble. In particular, this means: + + * The Module API will retain forward compatibility. + It will not be necessary to update modules to work with new + revisions of the stable tree. + + * The run-time configuration will be forward compatible. + No configuration changes will be necessary to work with new + revisions of the stable tree. + + * Compile-time configuration will be forward compatible. + The configure command line options that work in one release + of the stable tree will also work in the next release. + +As always, it will be necessary to test any new release to assure +that it works correctly with a particular configuration and a +particular set of modules, but every effort will be made to assure +that upgrades are as smooth as possible. + +In addition, the following development restrictions will aid in +keeping the stable tree as safe as possible: + + * No 'Experimental' modules; while it may be possible (based on API changes + required to support a given module) to load a 2.3-development module into + a 2.2-stable build of Apache, there are no guarantees. Experimental + modules will be introduced to the 2.3-development versions and either + added to 2.2-stable once they are proven and compatible, or deferred + to the 2.4-stable release if they cannot be incorporated in the current + stable release due to API change requirements. + + * The stable subversion tree should not remain unstable at any time. Atomic + commits ought be used to introduce code from the development version to the + stable tree. At any given time a security release may be in preparation, + unbeknownst to other contributors. At any given time, testers may be + checking out SVN trunk to confirm that a bug has been corrected. And as + all code was well-tested in development prior to committing to the stable + tree, there is really no reason for this tree to be broken for more than + a few minutes during a lengthy commit. + +In order to avoid 'skipped' release numbers in the stable releases, the +Release Manager will generally roll a release candidate (APACHE_#_#_#_RC#) +tag. Release Candidate tarballs will be announced to the +stable-testers@httpd.apache.org for the stable tree. Then, the participants +will vote on the quality of the proposed release tarball. + +The final APACHE_#_#_# tag will not exist until the APACHE_#_#_#_RC# candidate +has passed the usual votes to release that version. Only then is the final +tarball packaged, removing all -rc# designations from the version number, and +tagging the tree with the release number. + +DEVELOPMENT RELEASES, 2.{odd}.{revision} +----------------------------------------- + +All odd numbered releases designate the 'next' possible stable release, +therefore the current development version will always be one greater than +the current stable release. Work proceeds on development releases, permitting +the modification of the MMN at any time in order to correct deficiencies +or shortcomings in the API. This means that modules from one development +release to another may not be binary compatible, or may not successfully +compile without modification to accommodate the API changes. + +The only 'supported' development release at any time will be the most +recently released version. Developers will not be answering bug reports +of older development releases once a new release is available. It becomes +the responsibility of the reporter to use the latest development version +to confirm that any issue still exists. + +Any new code, new API features or new ('experimental') modules may be +promoted at any time to the next stable release, by a vote of the project +contributors. This vote is based on the technical stability of the new +code and the stability of the interface. Once moved to stable, that feature +cannot change for the remainder of that stable release cycle, so the vote must +reflect that the final decisions on the behavior and naming of that new +feature were reached. Vetos continue to apply to this choice of introducing +the new work to the stable version. + +At any given time, when the quality of changes to the development branch +is considered release quality, that version may become a candidate for the +next stable release. This includes some or all of the API changes, promoting +experimental modules to stable or deprecating and eliminating older modules +from the last stable release. All of these choices are considered by the +project as a group in the interests of promoting the stable release, so that +any given change may be 'deferred' for a future release by the group, rather +than introduce unacceptable risks to adopting the next stable release. + +Third party module authors are strongly encouraged to test with the latest +development version. This assures that the module will be ready for the next +stable release, but more importantly, the author can react to shortcomings +in the API early enough to warn the dev@httpd.apache.org community of the +shortcomings so that they can be addressed before the stable release. The +entire burden is on the module author to anticipate the needs of their module +before the stable release is created. Once a new stable release cycle has +begun, that API will be present for the lifetime of the stable release. Any +desired changes in the stable versions must wait for inclusion into the next +release cycle. + +When deciding to promote a development tree to being stable, a determination +should be made whether the changes since the last stable version warrant a +major version bump. That is, if 2.2 is the current stable version and 2.3 is +'ready' to become stable, the group needs to decide if the next stable +version is 2.4 or 3.0. One suggested rule of thumb is that if it requires +too much effort to port a module from 2.2 to 2.4, then the stable version +should be labeled 3.0. + +In order to ease the burden of creating development releases, the process +for packaging a development releases is less formal than for the stable +release. This strategy reflects the fact that while in development, versions +are cheap. Development releases may be classified as alpha, beta, or GA +to reflect the group's perceived stability of the tree. Development releases +may be made at any time by any committer. + +Please read the following link for a more detailed description of the +development release strategy: + +http://httpd.apache.org/dev/release.html diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000..51cf130 --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,783 @@ + +dnl APACHE_HELP_STRING(LHS, RHS) +dnl Autoconf 2.50 can not handle substr correctly. It does have +dnl AC_HELP_STRING, so let's try to call it if we can. +dnl Note: this define must be on one line so that it can be properly returned +dnl as the help string. +AC_DEFUN([APACHE_HELP_STRING],[ifelse(regexp(AC_ACVERSION, 2\.1), -1, AC_HELP_STRING($1,$2),[ ]$1 substr([ ],len($1))$2)])dnl + +dnl APACHE_SUBST(VARIABLE) +dnl Makes VARIABLE available in generated files +dnl (do not use @variable@ in Makefiles, but $(variable)) +AC_DEFUN([APACHE_SUBST],[ + APACHE_VAR_SUBST="$APACHE_VAR_SUBST $1" + AC_SUBST($1) +]) + +dnl APACHE_FAST_OUTPUT(FILENAME) +dnl Perform substitutions on FILENAME (Makefiles only) +AC_DEFUN([APACHE_FAST_OUTPUT],[ + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $1" +]) + +dnl APACHE_GEN_CONFIG_VARS +dnl Creates config_vars.mk +AC_DEFUN([APACHE_GEN_CONFIG_VARS],[ + APACHE_SUBST(HTTPD_VERSION) + APACHE_SUBST(HTTPD_MMN) + APACHE_SUBST(abs_srcdir) + APACHE_SUBST(bindir) + APACHE_SUBST(sbindir) + APACHE_SUBST(cgidir) + APACHE_SUBST(logfiledir) + APACHE_SUBST(exec_prefix) + APACHE_SUBST(datadir) + APACHE_SUBST(localstatedir) + APACHE_SUBST(mandir) + APACHE_SUBST(libdir) + APACHE_SUBST(libexecdir) + APACHE_SUBST(htdocsdir) + APACHE_SUBST(manualdir) + APACHE_SUBST(includedir) + APACHE_SUBST(errordir) + APACHE_SUBST(iconsdir) + APACHE_SUBST(sysconfdir) + APACHE_SUBST(installbuilddir) + APACHE_SUBST(runtimedir) + APACHE_SUBST(proxycachedir) + APACHE_SUBST(other_targets) + APACHE_SUBST(progname) + APACHE_SUBST(prefix) + APACHE_SUBST(AWK) + APACHE_SUBST(CC) + APACHE_SUBST(CPP) + APACHE_SUBST(CXX) + APACHE_SUBST(CPPFLAGS) + APACHE_SUBST(CFLAGS) + APACHE_SUBST(CXXFLAGS) + APACHE_SUBST(LTFLAGS) + APACHE_SUBST(LDFLAGS) + APACHE_SUBST(LT_LDFLAGS) + APACHE_SUBST(SH_LDFLAGS) + APACHE_SUBST(HTTPD_LDFLAGS) + APACHE_SUBST(UTIL_LDFLAGS) + APACHE_SUBST(LIBS) + APACHE_SUBST(DEFS) + APACHE_SUBST(INCLUDES) + APACHE_SUBST(NOTEST_CPPFLAGS) + APACHE_SUBST(NOTEST_CFLAGS) + APACHE_SUBST(NOTEST_CXXFLAGS) + APACHE_SUBST(NOTEST_LDFLAGS) + APACHE_SUBST(NOTEST_LIBS) + APACHE_SUBST(EXTRA_CPPFLAGS) + APACHE_SUBST(EXTRA_CFLAGS) + APACHE_SUBST(EXTRA_CXXFLAGS) + APACHE_SUBST(EXTRA_LDFLAGS) + APACHE_SUBST(EXTRA_LIBS) + APACHE_SUBST(EXTRA_INCLUDES) + APACHE_SUBST(INTERNAL_CPPFLAGS) + APACHE_SUBST(LIBTOOL) + APACHE_SUBST(SHELL) + APACHE_SUBST(RSYNC) + APACHE_SUBST(SVN) + APACHE_SUBST(MODULE_DIRS) + APACHE_SUBST(MODULE_CLEANDIRS) + APACHE_SUBST(PORT) + APACHE_SUBST(SSLPORT) + APACHE_SUBST(CORE_IMPLIB_FILE) + APACHE_SUBST(CORE_IMPLIB) + APACHE_SUBST(SH_LIBS) + APACHE_SUBST(SH_LIBTOOL) + APACHE_SUBST(MK_IMPLIB) + APACHE_SUBST(MKDEP) + APACHE_SUBST(INSTALL_PROG_FLAGS) + APACHE_SUBST(MPM_MODULES) + APACHE_SUBST(ENABLED_MPM_MODULE) + APACHE_SUBST(DSO_MODULES) + APACHE_SUBST(ENABLED_DSO_MODULES) + APACHE_SUBST(LOAD_ALL_MODULES) + APACHE_SUBST(APR_BINDIR) + APACHE_SUBST(APR_INCLUDEDIR) + APACHE_SUBST(APR_VERSION) + APACHE_SUBST(APR_CONFIG) + APACHE_SUBST(APU_BINDIR) + APACHE_SUBST(APU_INCLUDEDIR) + APACHE_SUBST(APU_VERSION) + APACHE_SUBST(APU_CONFIG) + + abs_srcdir="`(cd $srcdir && pwd)`" + + AC_MSG_NOTICE([creating config_vars.mk]) + test -d build || $mkdir_p build + > build/config_vars.mk + for i in $APACHE_VAR_SUBST; do + eval echo "$i = \$$i" >> build/config_vars.mk + done +]) + +dnl APACHE_GEN_MAKEFILES +dnl Creates Makefiles +AC_DEFUN([APACHE_GEN_MAKEFILES],[ + $SHELL $srcdir/build/fastgen.sh $srcdir $ac_cv_mkdir_p $BSD_MAKEFILE $APACHE_FAST_OUTPUT_FILES +]) + +dnl +dnl APACHE_TYPE_RLIM_T +dnl +dnl If rlim_t is not defined, define it to int +dnl +AC_DEFUN([APACHE_TYPE_RLIM_T], [ + AC_CACHE_CHECK([for rlim_t], ac_cv_type_rlim_t, [ + AC_TRY_COMPILE([ +#include +#include +#include +], [rlim_t spoon;], [ + ac_cv_type_rlim_t=yes + ],[ac_cv_type_rlim_t=no + ]) + ]) + if test "$ac_cv_type_rlim_t" = "no" ; then + AC_DEFINE(rlim_t, int, + [Define to 'int' if doesn't define it for us]) + fi +]) + +dnl the list of build variables which are available for customization on a +dnl per module subdir basis (to be inserted into modules.mk with a "MOD_" +dnl prefix, i.e. MOD_CFLAGS etc.). Used in APACHE_MODPATH_{INIT,FINISH}. +define(mod_buildvars, [CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES]) +dnl +dnl APACHE_MODPATH_INIT(modpath) +AC_DEFUN([APACHE_MODPATH_INIT],[ + current_dir=$1 + modpath_current=modules/$1 + modpath_static= + modpath_shared= + for var in mod_buildvars; do + eval MOD_$var= + done + test -d $1 || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk +])dnl +dnl +AC_DEFUN([APACHE_MODPATH_FINISH],[ + echo "DISTCLEAN_TARGETS = modules.mk" >> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in mod_buildvars; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + APACHE_FAST_OUTPUT($modpath_current/Makefile) +])dnl +dnl +dnl APACHE_MODPATH_ADD(name[, shared[, objects [, ldflags[, libs]]]]) +AC_DEFUN([APACHE_MODPATH_ADD],[ + if test -z "$3"; then + objects="mod_$1.lo" + else + objects="$3" + fi + + if test -z "$module_standalone"; then + if test -z "$2"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_$1.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<$mpmpath/modules.mk<$mpmpath/modules.mk<" if it was specified. +dnl +AC_DEFUN([APACHE_CHECK_OPENSSL],[ + AC_CACHE_CHECK([for OpenSSL], [ac_cv_openssl], [ + dnl initialise the variables we use + ac_cv_openssl=no + ap_openssl_found="" + ap_openssl_base="" + ap_openssl_libs="" + ap_openssl_mod_cflags="" + ap_openssl_mod_ldflags="" + + dnl Determine the OpenSSL base directory, if any + AC_MSG_CHECKING([for user-provided OpenSSL base directory]) + AC_ARG_WITH(ssl, APACHE_HELP_STRING(--with-ssl=PATH,OpenSSL installation directory), [ + dnl If --with-ssl specifies a directory, we use that directory + if test "x$withval" != "xyes" -a "x$withval" != "x"; then + dnl This ensures $withval is actually a directory and that it is absolute + ap_openssl_base="`cd $withval ; pwd`" + fi + ]) + if test "x$ap_openssl_base" = "x"; then + AC_MSG_RESULT(none) + else + AC_MSG_RESULT($ap_openssl_base) + fi + + dnl Run header and version checks + saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" + saved_LDFLAGS="$LDFLAGS" + + dnl Before doing anything else, load in pkg-config variables + if test -n "$PKGCONFIG"; then + saved_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" + if test "x$ap_openssl_base" != "x"; then + if test -f "${ap_openssl_base}/lib/pkgconfig/openssl.pc"; then + dnl Ensure that the given path is used by pkg-config too, otherwise + dnl the system openssl.pc might be picked up instead. + PKG_CONFIG_PATH="${ap_openssl_base}/lib/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + elif test -f "${ap_openssl_base}/lib64/pkgconfig/openssl.pc"; then + dnl Ensure that the given path is used by pkg-config too, otherwise + dnl the system openssl.pc might be picked up instead. + PKG_CONFIG_PATH="${ap_openssl_base}/lib64/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + fi + fi + AC_ARG_ENABLE(ssl-staticlib-deps,APACHE_HELP_STRING(--enable-ssl-staticlib-deps,[link mod_ssl with dependencies of OpenSSL's static libraries (as indicated by "pkg-config --static"). Must be specified in addition to --enable-ssl.]), [ + if test "$enableval" = "yes"; then + PKGCONFIG_LIBOPTS="--static" + fi + ]) + ap_openssl_libs="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-l --silence-errors openssl`" + if test $? -eq 0; then + ap_openssl_found="yes" + pkglookup="`$PKGCONFIG --cflags-only-I openssl`" + APR_ADDTO(CPPFLAGS, [$pkglookup]) + APR_ADDTO(MOD_CFLAGS, [$pkglookup]) + APR_ADDTO(ab_CFLAGS, [$pkglookup]) + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-L openssl`" + APR_ADDTO(LDFLAGS, [$pkglookup]) + APR_ADDTO(MOD_LDFLAGS, [$pkglookup]) + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-other openssl`" + APR_ADDTO(LDFLAGS, [$pkglookup]) + APR_ADDTO(MOD_LDFLAGS, [$pkglookup]) + fi + PKG_CONFIG_PATH="$saved_PKG_CONFIG_PATH" + fi + + dnl fall back to the user-supplied directory if not found via pkg-config + if test "x$ap_openssl_base" != "x" -a "x$ap_openssl_found" = "x"; then + APR_ADDTO(CPPFLAGS, [-I$ap_openssl_base/include]) + APR_ADDTO(MOD_CFLAGS, [-I$ap_openssl_base/include]) + APR_ADDTO(ab_CFLAGS, [-I$ap_openssl_base/include]) + APR_ADDTO(LDFLAGS, [-L$ap_openssl_base/lib]) + APR_ADDTO(MOD_LDFLAGS, [-L$ap_openssl_base/lib]) + if test "x$ap_platform_runtime_link_flag" != "x"; then + APR_ADDTO(LDFLAGS, [$ap_platform_runtime_link_flag$ap_openssl_base/lib]) + APR_ADDTO(MOD_LDFLAGS, [$ap_platform_runtime_link_flag$ap_openssl_base/lib]) + fi + fi + + AC_MSG_CHECKING([for OpenSSL version >= 0.9.8a]) + AC_TRY_COMPILE([#include ],[ +#if !defined(OPENSSL_VERSION_NUMBER) +#error "Missing OpenSSL version" +#endif +#if OPENSSL_VERSION_NUMBER < 0x0090801f +#error "Unsupported OpenSSL version " OPENSSL_VERSION_TEXT +#endif], + [AC_MSG_RESULT(OK) + ac_cv_openssl=yes], + [AC_MSG_RESULT(FAILED)]) + + if test "x$ac_cv_openssl" = "xyes"; then + ap_openssl_libs="${ap_openssl_libs:--lssl -lcrypto} `$apr_config --libs`" + APR_ADDTO(MOD_LDFLAGS, [$ap_openssl_libs]) + APR_ADDTO(LIBS, [$ap_openssl_libs]) + APR_SETVAR(ab_LIBS, [$MOD_LDFLAGS]) + APACHE_SUBST(ab_CFLAGS) + APACHE_SUBST(ab_LIBS) + + dnl Run library and function checks + liberrors="" + AC_CHECK_HEADERS([openssl/engine.h]) + AC_CHECK_FUNCS([SSL_CTX_new], [], [liberrors="yes"]) + AC_CHECK_FUNCS([OPENSSL_init_ssl]) + AC_CHECK_FUNCS([ENGINE_init ENGINE_load_builtin_engines RAND_egd]) + if test "x$liberrors" != "x"; then + AC_MSG_WARN([OpenSSL libraries are unusable]) + fi + else + AC_MSG_WARN([OpenSSL version is too old]) + fi + + dnl restore + CPPFLAGS="$saved_CPPFLAGS" + LIBS="$saved_LIBS" + LDFLAGS="$saved_LDFLAGS" + + dnl cache MOD_LDFLAGS, MOD_CFLAGS + ap_openssl_mod_cflags=$MOD_CFLAGS + ap_openssl_mod_ldflags=$MOD_LDFLAGS + ]) + if test "x$ac_cv_openssl" = "xyes"; then + AC_DEFINE(HAVE_OPENSSL, 1, [Define if OpenSSL is available]) + APR_ADDTO(MOD_LDFLAGS, [$ap_openssl_mod_ldflags]) + APR_ADDTO(MOD_CFLAGS, [$ap_openssl_mod_cflags]) + fi +]) + +AC_DEFUN([APACHE_CHECK_SYSTEMD], [ +dnl Check for systemd support for listen.c's socket activation. +case $host in +*-linux-*) + if test -n "$PKGCONFIG" && $PKGCONFIG --exists libsystemd; then + SYSTEMD_LIBS=`$PKGCONFIG --libs libsystemd` + elif test -n "$PKGCONFIG" && $PKGCONFIG --exists libsystemd-daemon; then + SYSTEMD_LIBS=`$PKGCONFIG --libs libsystemd-daemon` + else + AC_CHECK_LIB(systemd-daemon, sd_notify, SYSTEMD_LIBS="-lsystemd-daemon") + fi + if test -n "$SYSTEMD_LIBS"; then + AC_CHECK_HEADERS(systemd/sd-daemon.h) + if test "${ac_cv_header_systemd_sd_daemon_h}" = "no" || test -z "${SYSTEMD_LIBS}"; then + AC_MSG_WARN([Your system does not support systemd.]) + else + AC_DEFINE(HAVE_SYSTEMD, 1, [Define if systemd is supported]) + fi + fi + ;; +esac +]) + +dnl +dnl APACHE_EXPORT_ARGUMENTS +dnl Export (via APACHE_SUBST) the various path-related variables that +dnl apache will use while generating scripts like autoconf and apxs and +dnl the default config file. + +AC_DEFUN([APACHE_SUBST_EXPANDED_ARG],[ + APR_EXPAND_VAR(exp_$1, [$]$1) + APACHE_SUBST(exp_$1) + APR_PATH_RELATIVE(rel_$1, [$]exp_$1, ${prefix}) + APACHE_SUBST(rel_$1) +]) + +AC_DEFUN([APACHE_EXPORT_ARGUMENTS],[ + APACHE_SUBST_EXPANDED_ARG(exec_prefix) + APACHE_SUBST_EXPANDED_ARG(bindir) + APACHE_SUBST_EXPANDED_ARG(sbindir) + APACHE_SUBST_EXPANDED_ARG(libdir) + APACHE_SUBST_EXPANDED_ARG(libexecdir) + APACHE_SUBST_EXPANDED_ARG(mandir) + APACHE_SUBST_EXPANDED_ARG(sysconfdir) + APACHE_SUBST_EXPANDED_ARG(datadir) + APACHE_SUBST_EXPANDED_ARG(installbuilddir) + APACHE_SUBST_EXPANDED_ARG(errordir) + APACHE_SUBST_EXPANDED_ARG(iconsdir) + APACHE_SUBST_EXPANDED_ARG(htdocsdir) + APACHE_SUBST_EXPANDED_ARG(manualdir) + APACHE_SUBST_EXPANDED_ARG(cgidir) + APACHE_SUBST_EXPANDED_ARG(includedir) + APACHE_SUBST_EXPANDED_ARG(localstatedir) + APACHE_SUBST_EXPANDED_ARG(runtimedir) + APACHE_SUBST_EXPANDED_ARG(logfiledir) + APACHE_SUBST_EXPANDED_ARG(proxycachedir) +]) + +dnl +dnl APACHE_CHECK_APxVER({apr|apu}, major, minor, +dnl [actions-if-ok], [actions-if-not-ok]) +dnl +dnl Checks for APR or APR-util of given major/minor version or later; +dnl if so, runs actions-if-ok; otherwise runs actions-if-not-ok if given. +dnl If the version is not satisfactory and actions-if-not-ok is not +dnl given, then an error is printed and the configure script is aborted. +dnl +dnl The first argument must be [apr] or [apu]. +dnl +AC_DEFUN([APACHE_CHECK_APxVER], [ +define(ap_ckver_major, translit($1, [apru], [APRU])[_MAJOR_VERSION]) +define(ap_ckver_minor, translit($1, [apru], [APRU])[_MINOR_VERSION]) +define(ap_ckver_cvar, [ap_cv_$1ver$2$3]) +define(ap_ckver_name, ifelse([$1],[apr],[APR],[APR-util])) + +ap_ckver_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS `$[$1]_config --includes`" + +AC_CACHE_CHECK([for ap_ckver_name version $2.$3.0 or later], ap_ckver_cvar, [ +AC_EGREP_CPP([good], [ +#include <$1_version.h> +#if ]ap_ckver_major[ > $2 || (]ap_ckver_major[ == $2 && ]ap_ckver_minor[ >= $3) +good +#endif +], [ap_ckver_cvar=yes], [ap_ckver_cvar=no])]) + +if test "$ap_ckver_cvar" = "yes"; then + ifelse([$4],[],[:],[$4]) +else + ifelse([$5],[],[AC_MSG_ERROR([ap_ckver_name version $2.$3.0 or later is required])], [$5]) +fi + +CPPFLAGS="$ap_ckver_CPPFLAGS" + +undefine([ap_ckver_major]) +undefine([ap_ckver_minor]) +undefine([ap_ckver_cvar]) +undefine([ap_ckver_name]) +]) + +dnl +dnl APACHE_CHECK_VOID_PTR_LEN +dnl +dnl Checks if the size of a void pointer is at least as big as a "long" +dnl integer type. +dnl +AC_DEFUN([APACHE_CHECK_VOID_PTR_LEN], [ + +AC_CACHE_CHECK([for void pointer length], [ap_cv_void_ptr_lt_long], +[AC_TRY_RUN([ +int main(void) +{ + return sizeof(void *) < sizeof(long); +}], [ap_cv_void_ptr_lt_long=no], [ap_cv_void_ptr_lt_long=yes], + [ap_cv_void_ptr_lt_long=yes])]) + +if test "$ap_cv_void_ptr_lt_long" = "yes"; then + AC_MSG_ERROR([Size of "void *" is less than size of "long"]) +fi +]) + +dnl +dnl APACHE_CHECK_APR_HAS_LDAP +dnl +dnl Check if APR_HAS_LDAP is 1 +dnl Unfortunately, we can't use APR_CHECK_APR_DEFINE (because it only includes apr.h) +dnl or APR_CHECK_DEFINE (because it only checks for defined'ness and not for 0/1). +dnl +AC_DEFUN([APACHE_CHECK_APR_HAS_LDAP], [ + AC_CACHE_CHECK([for ldap support in apr/apr-util],ac_cv_APR_HAS_LDAP,[ + apache_old_cppflags="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCLUDES" + AC_EGREP_CPP(YES_IS_DEFINED, [ +#include +#if APR_HAS_LDAP +YES_IS_DEFINED +#endif + ], ac_cv_APR_HAS_LDAP=yes, ac_cv_APR_HAS_LDAP=no) + CPPFLAGS="$apache_old_cppflags" + ]) +]) + +dnl +dnl APACHE_ADD_GCC_CFLAG +dnl +dnl Check if compiler is gcc and supports flag. If yes, add to NOTEST_CFLAGS. +dnl NOTEST_CFLAGS is merged lately, thus it won't accumulate in CFLAGS here. +dnl Also, AC_LANG_PROGRAM() itself is known to trigger [-Wstrict-prototypes] +dnl with some autoconf versions, so we force -Wno-strict-prototypes for the +dnl check to avoid spurious failures when adding flags like -Werror. +dnl +AC_DEFUN([APACHE_ADD_GCC_CFLAG], [ + define([ap_gcc_ckvar], [ac_cv_gcc_]translit($1, [-:.=], [____])) + if test "$GCC" = "yes"; then + AC_CACHE_CHECK([whether gcc accepts $1], ap_gcc_ckvar, [ + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $1 -Wno-strict-prototypes" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + [ap_gcc_ckvar=yes], [ap_gcc_ckvar=no]) + CFLAGS="$save_CFLAGS" + ]) + if test "$]ap_gcc_ckvar[" = "yes" ; then + APR_ADDTO(NOTEST_CFLAGS,[$1]) + fi + fi + undefine([ap_gcc_ckvar]) +]) diff --git a/ap.d b/ap.d new file mode 100644 index 0000000..6084096 --- /dev/null +++ b/ap.d @@ -0,0 +1,102 @@ +#pragma D depends_on provider io +typedef struct request_rec { + uintptr_t pool; + uintptr_t connection; + uintptr_t server; + uintptr_t next; + uintptr_t prev; + uintptr_t main; + char *the_request; + int assbackwards; + int proxyreq; + int header_only; + char *protocol; + int proto_num; + char *hostname; + int64_t request_time; + char *status_line; + int status; + const char *method; + int method_number; + int64_t allowed; + uintptr_t allowed_xmethods; + uintptr_t allowed_methods; + offset_t sent_bodyct; + offset_t bytes_sent; + int64_t mtime; + int chunked; + char *range; + offset_t clength; + offset_t remaining; + offset_t read_length; + int read_body; + int read_chunked; + unsigned expecting_100; + uintptr_t headers_in; + uintptr_t headers_out; + uintptr_t err_headers_out; + uintptr_t subprocess_env; + uintptr_t notes; + char *content_type; /* Break these out --- we dispatch on 'em */ + char *handler; /* What we *really* dispatch on */ + char *content_encoding; + uintptr_t content_languages; + char *vlist_validator; + char *user; + char *ap_auth_type; + int no_cache; + int no_local_copy; + char *unparsed_uri; + char *uri; + char *filename; + char *canonical_filename; + char *path_info; + char *args; + /* finfo */ + uintptr_t finfo_pool; + int32_t finfo_valid; + int32_t finfo_protection; + int32_t finfo_filetype; + int finfo_user; + int finfo_group; + uint64_t finfo_inode; + uint64_t finfo_device; + int32_t finfo_nlink; + offset_t finfo_size; + offset_t finfo_csize; + int64_t finfo_atime; + int64_t finfo_mtime; + int64_t finfo_ctime; + char *finfo_fname; + char *finfo_name; + uintptr_t finfo_ffilehand; + /* parsed_uri */ + char *uri_scheme; + char *uri_hostinfo; + char *uri_user; + char *uri_password; + char *uri_hostname; + char *uri_port_str; + char *uri_path; + char *uri_query; + char *uri_fragment; + uintptr_t uri_hostent; + uint16_t uri_port; + unsigned uri_is_initialized:1; + unsigned uri_dns_looked_up:1; + unsigned uri_dns_resolved:1; + + /* back to request_rec */ + int used_path_info; + uintptr_t per_dir_config; + uintptr_t request_config; + uintptr_t htaccess; + uintptr_t output_filters; + uintptr_t input_filters; + uintptr_t proto_output_filters; + uintptr_t proto_input_filters; + int eos_sent; + uintptr_t kept_body; + uintptr_t invoke_mtx; +} request_rec; + diff --git a/apache_probes.d b/apache_probes.d new file mode 100644 index 0000000..294626d --- /dev/null +++ b/apache_probes.d @@ -0,0 +1,222 @@ +provider ap { + /* Explicit, core */ + probe internal__redirect(char *, char *); + probe process__request__entry(uintptr_t, char *); + probe process__request__return(uintptr_t, char *, uint32_t); + probe read__request__entry(uintptr_t, uintptr_t); + probe read__request__success(uintptr_t, char *, char *, char *, uint32_t); + probe read__request__failure(uintptr_t); + + /* Explicit, modules */ + probe proxy__run(uintptr_t, uintptr_t, uintptr_t, char *, int); + probe proxy__run__finished(uintptr_t, int, int); + probe rewrite__log(uintptr_t, int, int, char *, char *); + + /* Implicit, APR hooks */ + probe access_checker__entry(); + probe access_checker__dispatch__invoke(char *); + probe access_checker__dispatch__complete(char *, uint32_t); + probe access_checker__return(uint32_t); + probe auth_checker__entry(); + probe auth_checker__dispatch__invoke(char *); + probe auth_checker__dispatch__complete(char *, uint32_t); + probe auth_checker__return(uint32_t); + probe check_config__entry(); + probe check_config__dispatch__invoke(char *); + probe check_config__dispatch__complete(char *, uint32_t); + probe check_config__return(uint32_t); + probe check_user_id__entry(); + probe check_user_id__dispatch__invoke(char *); + probe check_user_id__dispatch__complete(char *, uint32_t); + probe check_user_id__return(uint32_t); + probe child_init__entry(); + probe child_init__dispatch__invoke(char *); + probe child_init__dispatch__complete(char *, uint32_t); + probe child_init__return(uint32_t); + probe create_connection__entry(); + probe create_connection__dispatch__invoke(char *); + probe create_connection__dispatch__complete(char *, uint32_t); + probe create_connection__return(uint32_t); + probe create_request__entry(); + probe create_request__dispatch__invoke(char *); + probe create_request__dispatch__complete(char *, uint32_t); + probe create_request__return(uint32_t); + probe default_port__entry(); + probe default_port__dispatch__invoke(char *); + probe default_port__dispatch__complete(char *, uint32_t); + probe default_port__return(uint32_t); + probe drop_privileges__entry(); + probe drop_privileges__dispatch__invoke(char *); + probe drop_privileges__dispatch__complete(char *, uint32_t); + probe drop_privileges__return(uint32_t); + probe error_log__entry(); + probe error_log__dispatch__invoke(char *); + probe error_log__dispatch__complete(char *, uint32_t); + probe error_log__return(uint32_t); + probe fatal_exception__entry(); + probe fatal_exception__dispatch__invoke(char *); + probe fatal_exception__dispatch__complete(char *, uint32_t); + probe fatal_exception__return(uint32_t); + probe fixups__entry(); + probe fixups__dispatch__invoke(char *); + probe fixups__dispatch__complete(char *, uint32_t); + probe fixups__return(uint32_t); + probe get_mgmt_items__entry(); + probe get_mgmt_items__dispatch__invoke(char *); + probe get_mgmt_items__dispatch__complete(char *, uint32_t); + probe get_mgmt_items__return(uint32_t); + probe get_suexec_identity__entry(); + probe get_suexec_identity__dispatch__invoke(char *); + probe get_suexec_identity__dispatch__complete(char *, uint32_t); + probe get_suexec_identity__return(uint32_t); + probe handler__entry(); + probe handler__dispatch__invoke(char *); + probe handler__dispatch__complete(char *, uint32_t); + probe handler__return(uint32_t); + probe header_parser__entry(); + probe header_parser__dispatch__invoke(char *); + probe header_parser__dispatch__complete(char *, uint32_t); + probe header_parser__return(uint32_t); + probe http_scheme__entry(); + probe http_scheme__dispatch__invoke(char *); + probe http_scheme__dispatch__complete(char *, uint32_t); + probe http_scheme__return(uint32_t); + probe insert_error_filter__entry(); + probe insert_error_filter__dispatch__invoke(char *); + probe insert_error_filter__dispatch__complete(char *, uint32_t); + probe insert_error_filter__return(uint32_t); + probe insert_filter__entry(); + probe insert_filter__dispatch__invoke(char *); + probe insert_filter__dispatch__complete(char *, uint32_t); + probe insert_filter__return(uint32_t); + probe log_transaction__entry(); + probe log_transaction__dispatch__invoke(char *); + probe log_transaction__dispatch__complete(char *, uint32_t); + probe log_transaction__return(uint32_t); + probe map_to_storage__entry(); + probe map_to_storage__dispatch__invoke(char *); + probe map_to_storage__dispatch__complete(char *, uint32_t); + probe map_to_storage__return(uint32_t); + probe monitor__entry(); + probe monitor__dispatch__invoke(char *); + probe monitor__dispatch__complete(char *, uint32_t); + probe monitor__return(uint32_t); + probe mpm__entry(); + probe mpm__dispatch__invoke(char *); + probe mpm__dispatch__complete(char *, uint32_t); + probe mpm__return(uint32_t); + probe mpm_get_name__entry(); + probe mpm_get_name__dispatch__invoke(char *); + probe mpm_get_name__dispatch__complete(char *, uint32_t); + probe mpm_get_name__return(uint32_t); + probe mpm_note_child_killed__entry(); + probe mpm_note_child_killed__dispatch__invoke(char *); + probe mpm_note_child_killed__dispatch__complete(char *, uint32_t); + probe mpm_note_child_killed__return(uint32_t); + probe mpm_register_timed_callback__entry(); + probe mpm_register_timed_callback__dispatch__invoke(char *); + probe mpm_register_timed_callback__dispatch__complete(char *, uint32_t); + probe mpm_register_timed_callback__return(uint32_t); + probe mpm_query__entry(); + probe mpm_query__dispatch__invoke(char *); + probe mpm_query__dispatch__complete(char *, uint32_t); + probe mpm_query__return(uint32_t); + probe open_logs__entry(); + probe open_logs__dispatch__invoke(char *); + probe open_logs__dispatch__complete(char *, uint32_t); + probe open_logs__return(uint32_t); + probe optional_fn_retrieve__entry(); + probe optional_fn_retrieve__dispatch__invoke(char *); + probe optional_fn_retrieve__dispatch__complete(char *, uint32_t); + probe optional_fn_retrieve__return(uint32_t); + probe post_config__entry(); + probe post_config__dispatch__invoke(char *); + probe post_config__dispatch__complete(char *, uint32_t); + probe post_config__return(uint32_t); + probe post_read_request__entry(); + probe post_read_request__dispatch__invoke(char *); + probe post_read_request__dispatch__complete(char *, uint32_t); + probe post_read_request__return(uint32_t); + probe pre_config__entry(); + probe pre_config__dispatch__invoke(char *); + probe pre_config__dispatch__complete(char *, uint32_t); + probe pre_config__return(uint32_t); + probe pre_connection__entry(); + probe pre_connection__dispatch__invoke(char *); + probe pre_connection__dispatch__complete(char *, uint32_t); + probe pre_connection__return(uint32_t); + probe pre_mpm__entry(); + probe pre_mpm__dispatch__invoke(char *); + probe pre_mpm__dispatch__complete(char *, uint32_t); + probe pre_mpm__return(uint32_t); + probe process_connection__entry(); + probe process_connection__dispatch__invoke(char *); + probe process_connection__dispatch__complete(char *, uint32_t); + probe process_connection__return(uint32_t); + probe quick_handler__entry(); + probe quick_handler__dispatch__invoke(char *); + probe quick_handler__dispatch__complete(char *, uint32_t); + probe quick_handler__return(uint32_t); + probe test_config__entry(); + probe test_config__dispatch__invoke(char *); + probe test_config__dispatch__complete(char *, uint32_t); + probe test_config__return(uint32_t); + probe translate_name__entry(); + probe translate_name__dispatch__invoke(char *); + probe translate_name__dispatch__complete(char *, uint32_t); + probe translate_name__return(uint32_t); + probe type_checker__entry(); + probe type_checker__dispatch__invoke(char *); + probe type_checker__dispatch__complete(char *, uint32_t); + probe type_checker__return(uint32_t); + + /* Implicit, APR hooks for proxy */ + probe canon_handler__entry(); + probe canon_handler__dispatch__invoke(char *); + probe canon_handler__dispatch__complete(char *, uint32_t); + probe canon_handler__return(uint32_t); + probe post_request__entry(); + probe post_request__dispatch__invoke(char *); + probe post_request__dispatch__complete(char *, uint32_t); + probe post_request__return(uint32_t); + probe pre_request__entry(); + probe pre_request__dispatch__invoke(char *); + probe pre_request__dispatch__complete(char *, uint32_t); + probe pre_request__return(uint32_t); + probe scheme_handler__entry(); + probe scheme_handler__dispatch__invoke(char *); + probe scheme_handler__dispatch__complete(char *, uint32_t); + probe scheme_handler__return(uint32_t); + + /* Implicit, APR hooks for dav */ + probe find_liveprop__entry(); + probe find_liveprop__dispatch__invoke(char *); + probe find_liveprop__dispatch__complete(char *, uint32_t); + probe find_liveprop__return(uint32_t); + probe gather_propsets__entry(); + probe gather_propsets__dispatch__invoke(char *); + probe gather_propsets__dispatch__complete(char *, uint32_t); + probe gather_propsets__return(uint32_t); + probe insert_all_liveprops__entry(); + probe insert_all_liveprops__dispatch__invoke(char *); + probe insert_all_liveprops__dispatch__complete(char *, uint32_t); + probe insert_all_liveprops__return(uint32_t); + + /* Implicit, APR hooks for watchdog */ + probe watchdog_exit__entry(); + probe watchdog_exit__dispatch__invoke(char *); + probe watchdog_exit__dispatch__complete(char *, uint32_t); + probe watchdog_exit__return(uint32_t); + probe watchdog_init__entry(); + probe watchdog_init__dispatch__invoke(char *); + probe watchdog_init__dispatch__complete(char *, uint32_t); + probe watchdog_init__return(uint32_t); + probe watchdog_need__entry(); + probe watchdog_need__dispatch__invoke(char *); + probe watchdog_need__dispatch__complete(char *, uint32_t); + probe watchdog_need__return(uint32_t); + probe watchdog_step__entry(); + probe watchdog_step__dispatch__invoke(char *); + probe watchdog_step__dispatch__complete(char *, uint32_t); + probe watchdog_step__return(uint32_t); +}; diff --git a/build/NWGNUenvironment.inc b/build/NWGNUenvironment.inc new file mode 100644 index 0000000..0e510c0 --- /dev/null +++ b/build/NWGNUenvironment.inc @@ -0,0 +1,410 @@ +# +# Setup needed Tools and Libraries +# + +ifeq "$(wildcard $(AP_WORK)/NWGNUcustom.ini)" "$(AP_WORK)/NWGNUcustom.ini" +include $(AP_WORK)/NWGNUcustom.ini +CUSTOM_INI = $(AP_WORK)/NWGNUcustom.ini +endif + +ifndef VERBOSE +.SILENT: +endif + +# +# Treat like an include +# +ifndef EnvironmentDefined + +# +# simple macros for parsing makefiles +# +EOLIST:= +EMPTY := +COMMA := , +SPACE := $(EMPTY) $(EMPTY) + +# +# Base environment +# + +# Try and handle case issues +ifndef NOVELLLIBC +ifdef NovellLibC +NOVELLLIBC = $(NovellLibC) +endif +endif + +ifndef NOVELLLIBC +NOVELLLIBC = C:/novell/ndk/libc +endif +ifneq "$(wildcard $(NOVELLLIBC)/include/ndkvers.h)" "$(NOVELLLIBC)/include/ndkvers.h" +$(error NOVELLLIBC does not point to a valid Novell LIBC SDK) +endif + +ifndef LDAPSDK +LDAPSDK = C:/novell/ndk/cldapsdk/NetWare/libc +endif +ifneq "$(wildcard $(LDAPSDK)/inc/ldap.h)" "$(LDAPSDK)/inc/ldap.h" +$(error LDAPSDK does not point to a valid Novell CLDAP SDK) +endif + +ifdef WITH_HTTP2 +ifneq "$(wildcard $(NGH2SRC)/lib/nghttp2_hd.h)" "$(NGH2SRC)/lib/nghttp2_hd.h" +$(error NGH2SRC does not point to a valid NGHTTP2 source tree) +endif +endif + +ifndef PCRESRC +PCRESRC = $(AP_WORK)/srclib/pcre +endif +ifneq "$(wildcard $(PCRESRC)/pcre-config.in)" "$(PCRESRC)/pcre-config.in" +$(error PCRESRC does not point to a valid PCRE source tree) +endif + +# This is a placeholder +# ifndef ZLIBSDK +# ZLIBSDK = C:/novell/ndk/zlibsdk +# endif + +ifndef METROWERKS +METROWERKS = $(ProgramFiles)\Metrowerks\CodeWarrior +endif + +# If LM_LICENSE_FILE isn't defined, define a variable that can be used to +# restart make with it defined +ifndef LM_LICENSE_FILE +NO_LICENSE_FILE = NO_LICENSE_FILE +endif + +# +# Set the Release type that you want to build, possible values are: +# +# debug - full debug switches are set +# noopt - normal switches are set +# release - optimization switches are set (default) + +ifdef reltype +RELEASE = $(reltype) +endif + +ifdef RELTYPE +RELEASE = $(RELTYPE) +endif + +ifdef debug +RELEASE = debug +endif + +ifdef DEBUG +RELEASE = debug +endif + +ifdef noopt +RELEASE = noopt +endif + +ifdef NOOPT +RELEASE = noopt +endif + +ifdef optimized +RELEASE = release +endif + +ifdef OPTIMIZED +RELEASE = release +endif + +ifndef RELEASE +RELEASE = release +endif + +OBJDIR = obj_$(RELEASE) + +# Define minimum APR version to check for +APR_WANTED = 1004000 + +# +# Setup compiler information +# + +# MetroWerks NLM tools +CC = mwccnlm +CPP = mwccnlm +LINK = mwldnlm +LIB = mwldnlm -type library -w nocmdline +WIN_CC = mwcc + +# Setup build tools +AWK = awk + +# Setup distribution tools +ZIP = zip -qr9 +7ZA = 7za >NUL a + +# +# Declare Command and tool macros here +# + +ifeq ($(findstring /sh,$(SHELL)),/sh) +DEL = rm -f $1 +RMDIR = rm -fr $1 +MKDIR = mkdir -p $1 +COPY = -cp -afv $1 $2 +#COPYR = -cp -afr $1/* $2 +COPYR = -rsync -aC $1/* $2 +TOUCH = -touch $1 +ECHONL = echo "" +DL = ' +CAT = cat +else +ifeq "$(OS)" "Windows_NT" +DEL = $(shell if exist $(subst /,\,$1) del /q /f 2>NUL $(subst /,\,$1)) +RMDIR = $(shell if exist $(subst /,\,$1)\NUL rd /q /s 2>NUL $(subst /,\,$1)) +else +DEL = $(shell if exist $(subst /,\,$1) del 2>NUL $(subst /,\,$1)) +RMDIR = $(shell if exist $(subst /,\,$1)\NUL deltree /y 2>NUL $(subst /,\,$1)) +endif +ECHONL = $(ComSpec) /c echo. +MKDIR = $(shell if not exist $(subst /,\,$1)\NUL md 2>NUL $(subst /,\,$1)) +COPY = -copy /y 2>NUL $(subst /,\,$1) $(subst /,\,$2) +COPYR = -xcopy /q /y /e 2>NUL $(subst /,\,$1) $(subst /,\,$2) +TOUCH = -copy /b 2>&1>NUL $(subst /,\,$1) +,, +CAT = type +endif + +ifdef IPV6 +ifndef USE_STDSOCKETS +USE_STDSOCKETS=1 +endif +endif + +NOVI = $(NOVELLLIBC)/imports +PRELUDE = $(NOVI)/libcpre.o + +INCDIRS = $(NOVELLLIBC)/include; +ifndef USE_STDSOCKETS +INCDIRS += $(NOVELLLIBC)/include/winsock; +endif +ifneq "$(LDAPSDK)" "" +INCDIRS += $(LDAPSDK)/inc; +endif +ifneq "$(ZLIBSDK)" "" +INCDIRS += $(ZLIBSDK); +endif +ifneq "$(PCRESRC)" "" +INCDIRS += $(PCRESRC); +endif + +DEFINES = -DNETWARE +ifndef USE_STDSOCKETS +DEFINES += -DUSE_WINSOCK +endif +ifndef DEBUG +DEFINES += -DNDEBUG +endif + +ifdef USE_STDSOCKETS +VERSION_SKT = (BSDSOCK) +else +VERSION_SKT = (WINSOCK) +endif + +# MetroWerks static Libraries +CLIB3S = $(METROWERKS)/Novell Support/Metrowerks Support/Libraries/Runtime/mwcrtl.lib +MATH3S = +PLIB3S = $(METROWERKS)/Novell Support/Metrowerks Support/Libraries/MSL C++/MWCPP.lib + +ifeq "$(OS)" "Windows_NT" +# MetroWerks Win32 build flags to create build tools +MWCW_MSL = "$(METROWERKS)/MSL" +MWCW_W32 = "$(METROWERKS)/Win32-x86 Support" +CC_FOR_BUILD = $(WIN_CC) +CFLAGS_FOR_BUILD = -O2 -gccinc -nodefaults -proc 586 -w off +CFLAGS_FOR_BUILD += -ir $(MWCW_MSL) -ir $(MWCW_W32) -lr $(MWCW_MSL) -lr $(MWCW_W32) +CFLAGS_FOR_BUILD += -lMSL_All_x86.lib -lkernel32.lib -luser32.lib +else +# GNUC build flags to create build tools +CC_FOR_BUILD = gcc +CFLAGS_FOR_BUILD = -Wall -O2 +endif + +# Base compile flags +# and prefix or precompiled header added here. + +# The default flags are as follows: +# +# -c compile only, no link +# -gccinc search directory of referencing file first for #includes +# -Cpp_exceptions off disable C++ exceptions +# -RTTI off disable C++ run-time typing information +# -align 4 align on 4 byte bounderies +# -w nocmdline disable command-line driver/parser warnings +# -proc PII generate code base on Pentium II instruction set +# -inst mmx use MMX extensions (Not used) + +CFLAGS += -c -w nocmdline -gccinc -Cpp_exceptions off -RTTI off -align 4 -proc PII + +ifdef CC_MAX_ERRORS +CFLAGS += -maxerrors $(CC_MAX_ERRORS) +else +CFLAGS += -maxerrors 1 +endif + +ifeq "$(REQUIRE_PROTOTYPES)" "1" +CFLAGS += -r +endif + +# -g generate debugging information +# -O0 level 0 optimizations +ifeq "$(RELEASE)" "debug" +CFLAGS += -g -O0 +endif + +# -O4,p level 4 optimizations, optimize for speed +ifeq "$(RELEASE)" "release" +CFLAGS += -O4,p +endif + +# -prefix pre_nw.h #include pre_nw.h for all files +CFLAGS += -prefix pre_nw.h + + +ifneq ($(findstring /sh,$(SHELL)),/sh) +PATH:=$(PATH);$(METROWERKS)\bin;$(METROWERKS)\Other Metrowerks Tools\Command Line Tools +endif + +# +# Declare major project deliverables output directories here +# + +ifndef PORT +PORT = 80 +endif + +ifndef SSLPORT +SSLPORT = 443 +endif + +ifdef DEST +INSTALL = $(subst \,/,$(DEST)) +ifeq (/, $(findstring /,$(INSTALL))) +INSTDIRS = $(INSTALL) +endif +endif + +ifdef dest +INSTALL = $(subst \,/,$(dest)) +ifeq (/, $(findstring /,$(INSTALL))) +INSTDIRS = $(INSTALL) +endif +endif + +ifndef INSTALL +INSTALL = $(AP_WORK)/Dist +INSTDIRS = $(INSTALL) +endif + +ifeq ($(MAKECMDGOALS),installdev) +ifndef BASEDIR +export BASEDIR = apache_$(VERSION_STR)-sdk +endif +else +ifndef BASEDIR +export BASEDIR = Apache$(VERSION_MAJMIN) +endif +endif + +# Add support for building IPV6 alongside +ifneq "$(IPV6)" "" +DEFINES += -DNW_BUILD_IPV6 +# INCDIRS := $(NOVELLLIBC)/include/winsock/IPV6;$(INCDIRS) + +ifneq "$(findstring IPV6,$(OBJDIR))" "IPV6" +OBJDIR := $(OBJDIR)_IPV6 +endif + +ifneq "$(findstring IPV6,$(INSTALL))" "IPV6" +INSTALL := $(INSTALL)_IPV6 +endif + +ifneq "$(findstring IPV6,$(INSTDIRS))" "IPV6" +INSTDIRS := $(INSTDIRS)_IPV6 +endif + +endif + +INSTALLBASE = $(INSTALL)/$(BASEDIR) + +INSTDEVDIRS = \ + $(INSTALL) \ + $(INSTALLBASE) \ + $(INSTALLBASE)/build \ + $(INSTALLBASE)/include \ + $(INSTALLBASE)/lib \ + $(EOLIST) + +INSTDIRS += \ + $(INSTALLBASE) \ + $(INSTALLBASE)/bin \ + $(INSTALLBASE)/cgi-bin \ + $(INSTALLBASE)/conf \ + $(INSTALLBASE)/conf/extra \ + $(INSTALLBASE)/error \ + $(INSTALLBASE)/htdocs \ + $(INSTALLBASE)/icons \ + $(INSTALLBASE)/logs \ + $(INSTALLBASE)/man \ + $(INSTALLBASE)/manual \ + $(INSTALLBASE)/modules \ + $(EOLIST) + +# +# Common directories +# + +SRC = $(subst \,/,$(AP_WORK)) +APR = $(subst \,/,$(APR_WORK)) +APRUTIL = $(subst \,/,$(APU_WORK)) +APBUILD = $(SRC)/build +STDMOD = $(SRC)/modules +HTTPD = $(SRC)/modules/http +DAV = $(SRC)/modules/dav +NWOS = $(SRC)/os/netware +SERVER = $(SRC)/server +SUPMOD = $(SRC)/support +APULDAP = $(APRUTIL)/ldap +XML = $(APRUTIL)/xml +APRTEST = $(APR)/test +PCRE = $(PCRESRC) + +PREBUILD_INST = $(SRC)/nwprebuild + +# +# Internal Libraries +# + +APRLIB = $(APR)/$(OBJDIR)/aprlib.lib +APRUTLIB = $(APRUTIL)/$(OBJDIR)/aprutil.lib +APULDAPLIB = $(APULDAP)/$(OBJDIR)/apuldap.lib +STMODLIB = $(STDMOD)/$(OBJDIR)/stdmod.lib +PCRELIB = $(SRC)/$(OBJDIR)/pcre.lib +NWOSLIB = $(NWOS)/$(OBJDIR)/netware.lib +SERVLIB = $(SERVER)/$(OBJDIR)/server.lib +HTTPDLIB = $(HTTPD)/$(OBJDIR)/httpd.lib +XMLLIB = $(XML)/$(OBJDIR)/xmllib.lib + +# +# Additional general defines +# + +EnvironmentDefined = 1 +endif # ifndef EnvironmentDefined + +# This is always set so that it will show up in lower directories + +ifdef Path +Path = $(PATH) +endif + diff --git a/build/NWGNUhead.inc b/build/NWGNUhead.inc new file mode 100644 index 0000000..2ef4dac --- /dev/null +++ b/build/NWGNUhead.inc @@ -0,0 +1,109 @@ +# +# Obtain the global build environment +# + +include $(AP_WORK)/build/NWGNUenvironment.inc + +# +# Define base targets and rules +# + +TARGETS = libs nlms install clobber_libs clobber_nlms clean installdev + +.PHONY : $(TARGETS) default all help $(NO_LICENSE_FILE) + +# Here is where we will use the NO_LICENSE_FILE variable to see if we need to +# restart the make with it defined + +ifdef NO_LICENSE_FILE + +default: NO_LICENSE_FILE + +all: NO_LICENSE_FILE + +install :: NO_LICENSE_FILE + +installdev :: NO_LICENSE_FILE + +NO_LICENSE_FILE : + $(MAKE) $(MAKECMDGOALS) -f NWGNUmakefile RELEASE=$(RELEASE) DEST="$(INSTALL)" LM_LICENSE_FILE="$(METROWERKS)/license.dat" + +else # LM_LICENSE_FILE must be defined so use the real targets + +default: $(SUBDIRS) libs nlms + +all: $(SUBDIRS) libs nlms install + +$(TARGETS) :: $(SUBDIRS) + +install :: nlms $(INSTDIRS) + +installdev :: $(INSTDEVDIRS) + +$(INSTDIRS) :: + $(call MKDIR,$@) + +$(INSTDEVDIRS) :: + $(call MKDIR,$@) + +endif #NO_LICENSE_FILE check + +help : + @echo $(DL)targets for RELEASE=$(RELEASE):$(DL) + @echo $(DL)(default) . . . . libs nlms$(DL) + @echo $(DL)all . . . . . . . does everything (libs nlms install)$(DL) + @echo $(DL)libs. . . . . . . builds all libs$(DL) + @echo $(DL)nlms. . . . . . . builds all nlms$(DL) + @echo $(DL)install . . . . . builds libs and nlms and copies install files to$(DL) + @echo $(DL) "$(INSTALL)"$(DL) + @echo $(DL)installdev. . . . copies headers and files needed for development to$(DL) + @echo $(DL) "$(INSTALL)"$(DL) + @echo $(DL)clean . . . . . . deletes $(OBJDIR) dirs, *.err, and *.map$(DL) + @echo $(DL)clobber_all . . . deletes all possible output from the make$(DL) + @echo $(DL)clobber_install . deletes all files in $(INSTALL)$(DL) + @$(ECHONL) + @echo $(DL)Multiple targets can be used on a single nmake command line -$(DL) + @echo $(DL)(i.e. $(MAKE) clean all)$(DL) + @$(ECHONL) + @echo $(DL)You can also specify RELEASE=debug, RELEASE=noopt, or RELEASE=optimized$(DL) + @echo $(DL)The default is RELEASE=optimized$(DL) + +clobber_all :: clean clobber_install clobber_prebuild + +clobber_install :: + $(call RMDIR,$(INSTALL)) + +clobber_prebuild :: + $(call RMDIR,$(PREBUILD_INST)) + +# +# build recursive targets +# + +$(SUBDIRS) : FORCE +ifneq "$(MAKECMDGOALS)" "clean" +ifneq "$(findstring clobber_,$(MAKECMDGOALS))" "clobber_" + @$(ECHONL) + @echo $(DL)Building $(CURDIR)/$@$(DL) +endif +endif + $(MAKE) -C $@ $(MAKECMDGOALS) -f NWGNUmakefile RELEASE=$(RELEASE) DEST="$(INSTALL)" LM_LICENSE_FILE="$(LM_LICENSE_FILE)" + @$(ECHONL) + +FORCE: + +# +# Standard targets +# + +clean :: $(SUBDIRS) + @echo $(DL)Cleaning up $(CURDIR)$(DL) + $(call RMDIR,$(OBJDIR)) + $(call DEL,*.err) + $(call DEL,*.map) + $(call DEL,*.tmp) +# $(call DEL,*.d) + +$(OBJDIR) :: + $(call MKDIR,$@) + diff --git a/build/NWGNUmakefile b/build/NWGNUmakefile new file mode 100644 index 0000000..1954257 --- /dev/null +++ b/build/NWGNUmakefile @@ -0,0 +1,140 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(APR_WORK)/build \ + $(EOLIST) + +# +# Get the 'head' of the build environment. This includes default targets and +# paths to tools +# + +include $(AP_WORK)/build/NWGNUhead.inc + +# +# build this level's files + +FILES_prebuild_headers = \ + $(SRC)/include/ap_config_layout.h \ + $(NWOS)/test_char.h \ + $(PCRE)/config.h \ + $(PCRE)/pcre.h \ + $(EOLIST) + +nlms :: libs $(NWOS)/httpd.imp $(DAV)/main/dav.imp $(STDMOD)/cache/mod_cache.imp + +libs :: chkapr $(NWOS)/chartables.c + +$(DAV)/main/dav.imp : make_nw_export.awk $(DAV)/main/mod_dav.h + @echo $(DL)GEN $@$(DL) + $(AWK) -v EXPPREFIX=AP$(VERSION_MAJMIN) -f $^ >$@ + +$(STDMOD)/cache/mod_cache.imp: make_nw_export.awk $(STDMOD)/cache/mod_cache.h $(STDMOD)/cache/cache_util.h + @echo $(DL)GEN $@$(DL) + $(AWK) -v EXPPREFIX=AP$(VERSION_MAJMIN) -f $^ >$@ + +$(NWOS)/httpd.imp : make_nw_export.awk nw_export.i + @echo $(DL)GEN $@$(DL) + $(AWK) -v EXPPREFIX=AP$(VERSION_MAJMIN) -f $^ >$@ + +nw_export.i : nw_export.inc $(FILES_prebuild_headers) cc.opt + @echo $(DL)GEN $@$(DL) + $(CC) $< @cc.opt + +cc.opt : NWGNUmakefile $(APBUILD)/NWGNUenvironment.inc $(APBUILD)/NWGNUtail.inc $(APBUILD)/NWGNUhead.inc + @echo $(DL)-P$(DL)> $@ + @echo $(DL)-EP$(DL)>> $@ + @echo $(DL)-nosyspath$(DL)>> $@ + @echo $(DL)-w nocmdline$(DL)>> $@ + @echo $(DL)$(DEFINES)$(DL)>> $@ + @echo $(DL)-I$(SRC)/include$(DL)>> $@ + @echo $(DL)-I$(HTTPD)$(DL)>> $@ + @echo $(DL)-I$(STDMOD)/aaa$(DL)>> $@ + @echo $(DL)-I$(STDMOD)/core$(DL)>> $@ + @echo $(DL)-I$(NWOS)$(DL)>> $@ + @echo $(DL)-I$(SERVER)/mpm/netware$(DL)>> $@ + @echo $(DL)-I$(APR)/include$(DL)>> $@ + @echo $(DL)-I$(APRUTIL)/include$(DL)>> $@ + @echo $(DL)-ir $(NOVELLLIBC)$(DL)>> $@ + +$(SRC)/include/ap_config_layout.h: $(NWOS)/netware_config_layout.h + @echo Creating $@ + $(call COPY,$<,$@) + +$(PCRE)/%.h: $(PCRE)/%.h.generic + @echo Creating $@ + $(call COPY,$<,$@) + +$(PCRE)/%.h: $(PCRE)/%.hw + @echo Creating $@ + $(call COPY,$<,$@) + +ifneq "$(BUILDTOOL_AS_NLM)" "1" + +$(NWOS)/chartables.c: dftables.exe $(PCRE)/dftables.c + @echo $(DL)GEN $@$(DL) + $< $@ + +%.exe: $(PCRE)/%.c $(PCRE)/config.h $(PCRE)/pcre.h + @echo $(DL)Creating Build Helper $@$(DL) + $(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) -DHAVE_CONFIG_H $< -o $@ + +$(NWOS)/test_char.h: gen_test_char.exe $(SERVER)/gen_test_char.c + @echo $(DL)GEN $@$(DL) + $< > $@ + +%.exe: $(SERVER)/%.c + @echo $(DL)Creating Build Helper $@$(DL) + $(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) -DCROSS_COMPILE $< -o $@ + +else + +ifneq "$(wildcard $(NWOS)/chartables.c)" "$(NWOS)/chartables.c" +$(error Error: required source $(NWOS)/chartables.c not found!) +endif + +ifneq "$(wildcard $(NWOS)/test_char.h)" "$(NWOS)/test_char.h" +$(error Error: required header $(NWOS)/test_char.h not found!) +endif + +endif + +# +# Check for minimum APR version +# +chkapr: $(APR)/build/nw_ver.awk $(APR)/include/apr_version.h + @echo $(DL)Checking for APR version...$(DL) + $(AWK) -v WANTED=$(APR_WANTED) -f $^ + +# +# You can use this target if all that is needed is to copy files to the +# installation area +# +install :: nlms FORCE + +clean :: + $(call DEL,$(SRC)/include/ap_config_layout.h) + $(call DEL,$(PCRE)/config.h) + $(call DEL,$(PCRE)/pcre.h) + $(call DEL,$(STDMOD)/cache/mod_cache.imp) + $(call DEL,$(DAV)/main/dav.imp) + $(call DEL,$(NWOS)/httpd.imp) + $(call DEL,nw_export.i) + $(call DEL,cc.opt) + $(call DEL,NWGNUversion.inc) +ifneq "$(BUILDTOOL_AS_NLM)" "1" + $(call DEL,$(NWOS)/chartables.c) + $(call DEL,$(NWOS)/test_char.h) + $(call DEL,dftables.exe) + $(call DEL,gen_test_char.exe) +endif + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(APBUILD)/NWGNUtail.inc + diff --git a/build/NWGNUscripts.inc b/build/NWGNUscripts.inc new file mode 100644 index 0000000..27029eb --- /dev/null +++ b/build/NWGNUscripts.inc @@ -0,0 +1,43 @@ +# Include for creating start/stop/restart NCF scripts. + +instscripts:: FORCE $(INSTALLBASE)/ap2start.ncf $(INSTALLBASE)/ap2auto.ncf $(INSTALLBASE)/ap2rest.ncf $(INSTALLBASE)/ap2stop.ncf + +$(INSTALLBASE)/ap2start.ncf: + @echo $(DL)# NCF to start Apache 2.x in own address space$(DL)> $@ + @echo $(DL)# Make sure that httpstk is not listening on 80$(DL)>> $@ + @echo $(DL)# httpcloseport 80 /silent$(DL)>> $@ + @echo $(DL)# search add SYS:/$(BASEDIR)$(DL)>> $@ + @echo $(DL)load address space = $(BASEDIR) SYS:/$(BASEDIR)/apache2$(DL)>> $@ + @echo $(DL)# If you have problems with 3rd-party modules try to load in OS space.$(DL)>> $@ + @echo $(DL)# load SYS:/$(BASEDIR)/apache2$(DL)>> $@ + @$(ECHONL)>> $@ + +$(INSTALLBASE)/ap2auto.ncf: + @echo $(DL)# NCF to start Apache 2.x in own address space$(DL)> $@ + @echo $(DL)# and let automatically restart in case it crashes$(DL)>> $@ + @echo $(DL)# Make sure that httpstk is not listening on 80$(DL)>> $@ + @echo $(DL)# httpcloseport 80 /silent$(DL)>> $@ + @echo $(DL)# search add SYS:/$(BASEDIR)$(DL)>> $@ + @echo $(DL)restart address space = $(BASEDIR) SYS:/$(BASEDIR)/apache2$(DL)>> $@ + @$(ECHONL)>> $@ + +$(INSTALLBASE)/ap2rest.ncf: + @echo $(DL)# NCF to restart Apache 2.x in own address space$(DL)> $@ + @echo $(DL)apache2 restart -p $(BASEDIR)$(DL)>> $@ + @echo $(DL)# If you have loaded Apache2.x in OS space use the line below.$(DL)>> $@ + @echo $(DL)# apache2 restart$(DL)>> $@ + @$(ECHONL)>> $@ + +$(INSTALLBASE)/ap2stop.ncf: + @echo $(DL)# NCF to stop Apache 2.x in own address space$(DL)> $@ + @echo $(DL)apache2 shutdown -p $(BASEDIR)$(DL)>> $@ + @echo $(DL)# If you have loaded Apache2.x in OS space use the line below.$(DL)>> $@ + @echo $(DL)# apache2 shutdown$(DL)>> $@ + @$(ECHONL)>> $@ + +$(INSTALLBASE)/ap2prod.ncf: + @echo $(DL)# NCF to create a product record for Apache 2.x in product database$(DL)> $@ + @echo $(DL)PRODSYNC DEL APACHE$(VERSION_MAJMIN)$(DL)>> $@ + @echo $(DL)PRODSYNC ADD APACHE$(VERSION_MAJMIN) ProductRecord "$(VERSION_STR)" "Apache $(VERSION_STR) Webserver"$(DL)>> $@ + @$(ECHONL)>> $@ + diff --git a/build/NWGNUtail.inc b/build/NWGNUtail.inc new file mode 100644 index 0000000..4c19a63 --- /dev/null +++ b/build/NWGNUtail.inc @@ -0,0 +1,332 @@ +# +# This contains final targets and should be included at the end of any +# NWGNUmakefile file +# + +# +# If we are going to create an nlm, make sure we have assigned variables to +# use during the link. +# +ifndef NLM_NAME +NLM_NAME = $(TARGET_nlm) +endif + +ifndef NLM_DESCRIPTION +NLM_DESCRIPTION = $(NLM_NAME) +endif + +ifndef NLM_THREAD_NAME +NLM_THREAD_NAME = $(NLM_NAME) Thread +endif + +ifndef NLM_SCREEN_NAME +NLM_SCREEN_NAME = DEFAULT +endif + +ifndef NLM_COPYRIGHT +NLM_COPYRIGHT = Licensed under the Apache License, Version 2.0 +endif + +ifeq "$(NLM_FLAGS)" "" +NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION +endif + +ifeq "$(NLM_STACK_SIZE)" "" +NLM_STACK_SIZE = 65536 +endif + +ifeq "$(NLM_ENTRY_SYM)" "" +NLM_ENTRY_SYM = _LibCPrelude +endif + +ifeq "$(NLM_EXIT_SYM)" "" +NLM_EXIT_SYM = _LibCPostlude +endif + +ifeq "$(NLM_VERSION)" "" +NLM_VERSION = $(VERSION) +endif + +# +# Create dependency lists based on the files available +# + +STANDARD_DEPENDS = \ + $(APBUILD)/NWGNUhead.inc \ + $(APBUILD)/NWGNUenvironment.inc \ + $(APBUILD)/NWGNUtail.inc \ + $(CUSTOM_INI) \ + $(EOLIST) + +CCOPT_DEPENDS = $(STANDARD_DEPENDS) + +$(NLM_NAME)_LINKOPT_DEPENDS = \ + $(TARGET_lib) \ + $(STANDARD_DEPENDS) \ + $(VERSION_INC) \ + $(EOLIST) + +ifeq "$(words $(strip $(TARGET_lib)))" "1" +LIB_NAME = $(basename $(notdir $(TARGET_lib))) +$(LIB_NAME)_LIBLST_DEPENDS = \ + $(FILES_lib_objs) \ + $(STANDARD_DEPENDS) \ + $(CUSTOM_INI) \ + $(EOLIST) +endif + +ifeq "$(wildcard NWGNU$(LIB_NAME))" "NWGNU$(LIB_NAME)" +$(LIB_NAME)_LIBLST_DEPENDS += NWGNU$(LIB_NAME) +CCOPT_DEPENDS += NWGNU$(LIB_NAME) +else +CCOPT_DEPENDS += NWGNUmakefile +endif + +ifeq "$(wildcard NWGNU$(NLM_NAME))" "NWGNU$(NLM_NAME)" +$(NLM_NAME)_LINKOPT_DEPENDS += NWGNU$(NLM_NAME) +CCOPT_DEPENDS += NWGNU$(NLM_NAME) +else +CCOPT_DEPENDS += NWGNUmakefile +endif + +CPPOPT_DEPENDS = $(CCOPT_DEPENDS) + +# +# Generic compiler rules +# + +ifneq "$(MAKECMDGOALS)" "clean" +ifneq "$(findstring clobber_,$(MAKECMDGOALS))" "clobber_" +$(APBUILD)/NWGNUversion.inc: $(APBUILD)/nw_ver.awk $(SRC)/include/ap_release.h + @echo $(DL)GEN $@$(DL) + $(AWK) -f $^ $(SRC)/.svn/all-wcprops > $@ + +-include $(APBUILD)/NWGNUversion.inc + +ifneq "$(strip $(VERSION_STR))" "" +VERSION_INC = $(APBUILD)/NWGNUversion.inc +else +VERSION = 2,4,0 +VERSION_STR = 2.4.0 +VERSION_MAJMIN = 24 +endif +endif +endif +ifeq "$(USE_SVNREV)" "1" +ifneq "$(strip $(SVN_REVISION))" "" +CFLAGS += -DAP_SERVER_ADD_STRING=\"$(SVN_REVISION)\" +endif +endif + + +ifeq "$(words $(strip $(TARGET_nlm)))" "1" + +$(OBJDIR)/%.o: %.c $(OBJDIR)/$(NLM_NAME)_cc.opt + @echo $(DL)CC $<$(DL) + $(CC) -o $@ $< @$(word 2, $^) + +$(OBJDIR)/$(NLM_NAME)_cc.opt: $(CCOPT_DEPENDS) + $(call DEL,$@) + @echo $(DL)GEN $@$(DL) +ifneq "$(strip $(CFLAGS))" "" + @echo $(DL)$(CFLAGS)$(DL)>> $@ +endif +ifneq "$(strip $(XCFLAGS))" "" + @echo $(DL)$(XCFLAGS)$(DL)>> $@ +endif +ifneq "$(strip $(XINCDIRS))" "" + @echo $(DL)$(foreach xincdir,$(strip $(subst ;,$(SPACE),$(XINCDIRS))),-I$(xincdir))$(DL)>> $@ +endif +ifneq "$(strip $(INCDIRS))" "" + @echo $(DL)$(foreach incdir,$(strip $(subst ;,$(SPACE),$(INCDIRS))),-I$(incdir))$(DL)>> $@ +endif +ifneq "$(strip $(DEFINES))" "" + @echo $(DL)$(DEFINES)$(DL)>> $@ +endif +ifneq "$(strip $(XDEFINES))" "" + @echo $(DL)$(XDEFINES)$(DL)>> $@ +endif + +$(OBJDIR)/%.o: %.cpp $(OBJDIR)/$(NLM_NAME)_cpp.opt + @echo $(DL)CC $<$(DL) + $(CC) -o $@ $< @$(word 2, $^) + +$(OBJDIR)/$(NLM_NAME)_cpp.opt: $(CPPOPT_DEPENDS) + $(call DEL,$@) + @echo $(DL)GEN $@$(DL) +ifneq "$(strip $(CFLAGS))" "" + @echo $(DL)$(CFLAGS)$(DL)>> $@ +endif +ifneq "$(strip $(XCFLAGS))" "" + @echo $(DL)$(XCFLAGS)$(DL)>> $@ +endif +ifneq "$(strip $(XINCDIRS))" "" + @echo $(DL)$(foreach xincdir,$(strip $(subst ;,$(SPACE),$(XINCDIRS))),-I$(xincdir))$(DL)>> $@ +endif +ifneq "$(strip $(INCDIRS))" "" + @echo $(DL)$(foreach incdir,$(strip $(subst ;,$(SPACE),$(INCDIRS))),-I$(incdir))$(DL)>> $@ +endif +ifneq "$(strip $(DEFINES))" "" + @echo $(DL)$(DEFINES)$(DL)>> $@ +endif +ifneq "$(strip $(XDEFINES))" "" + @echo $(DL)$(XDEFINES)$(DL)>> $@ +endif + +endif # one target nlm + +# +# Rules to build libraries +# + +# If we only have one target library then build it + +ifeq "$(words $(strip $(TARGET_lib)))" "1" + +$(TARGET_lib) : $(OBJDIR)/$(LIB_NAME)_lib.lst + $(call DEL,$@) + @echo $(DL)AR $@$(DL) + $(LIB) -o $@ @$< + +$(OBJDIR)/$(LIB_NAME)_lib.lst: $($(LIB_NAME)_LIBLST_DEPENDS) + $(call DEL,$@) +ifneq "$(strip $(FILES_lib_objs))" "" + @echo $(DL)GEN $@$(DL) + @echo $(DL)$(FILES_lib_objs)$(DL)>> $@ +endif + +else # We must have more than one target library so load the individual makefiles + +$(OBJDIR)/%.lib: NWGNU% $(STANDARD_DEPENDS) FORCE + @echo $(DL)Calling $<$(DL) + $(MAKE) -f $< $(MAKECMDGOALS) RELEASE=$(RELEASE) + +endif + +# +# Rules to build nlms. +# + +# If we only have one target NLM then build it +ifeq "$(words $(strip $(TARGET_nlm)))" "1" + +$(TARGET_nlm) : $(FILES_nlm_objs) $(FILES_nlm_libs) $(OBJDIR)/$(NLM_NAME)_link.opt + @echo $(DL)LINK $@$(DL) + $(LINK) @$(OBJDIR)/$(NLM_NAME)_link.opt + +# This will force the link option file to be rebuilt if we change the +# corresponding makefile + +$(OBJDIR)/$(NLM_NAME)_link.opt : $($(NLM_NAME)_LINKOPT_DEPENDS) + $(call DEL,$@) + $(call DEL,$(@:.opt=.def)) + @echo $(DL)GEN $@$(DL) + @echo $(DL)-nlmversion=$(NLM_VERSION)$(DL)>> $@ + @echo $(DL)-warnings off$(DL)>> $@ + @echo $(DL)-zerobss$(DL)>> $@ + @echo $(DL)-o $(TARGET_nlm)$(DL)>> $@ +ifneq "$(FILE_nlm_copyright)" "" + @$(CAT) $(FILE_nlm_copyright)>> $@ +endif +ifeq "$(RELEASE)" "debug" + @echo $(DL)-g$(DL)>> $@ + @echo $(DL)-sym internal$(DL)>> $@ + @echo $(DL)-sym codeview4$(DL)>> $@ + @echo $(DL)-osym $(OBJDIR)/$(NLM_NAME).sym$(DL)>> $@ +else + @echo $(DL)-sym internal$(DL)>> $@ +endif + @echo $(DL)-l $(SRC)/$(OBJDIR)$(DL)>> $@ + @echo $(DL)-l $(HTTPD)/$(OBJDIR)$(DL)>> $@ + @echo $(DL)-l $(SERVER)/$(OBJDIR)$(DL)>> $@ + @echo $(DL)-l $(STDMOD)/$(OBJDIR)$(DL)>> $@ + @echo $(DL)-l $(NWOS)/$(OBJDIR)$(DL)>> $@ + @echo $(DL)-l $(NWOS)$(DL)>> $@ + @echo $(DL)-l $(APR)/$(OBJDIR)$(DL)>> $@ + @echo $(DL)-l $(APR)$(DL)>> $@ + @echo $(DL)-l $(APRUTIL)/$(OBJDIR)$(DL)>> $@ + @echo $(DL)-l $(PCRE)/$(OBJDIR)$(DL)>> $@ + @echo $(DL)-l "$(METROWERKS)/Novell Support/Metrowerks Support/Libraries/Runtime"$(DL)>> $@ + @echo $(DL)-l "$(METROWERKS)/Novell Support/Metrowerks Support/Libraries/MSL C++"$(DL)>> $@ +ifneq "$(IPV6)" "" + @echo $(DL)-l $(NOVELLLIBC)/include/winsock/IPV6$(DL)>> $@ +endif + @echo $(DL)-l $(NOVELLLIBC)/imports$(DL)>> $@ +ifneq "$(LDAPSDK)" "" + @echo $(DL)-l $(LDAPSDK)/imports$(DL)>> $@ +endif + @echo $(DL)-l $(APULDAP)/$(OBJDIR)$(DL)>> $@ + @echo $(DL)-l $(XML)/$(OBJDIR)$(DL)>> $@ + @echo $(DL)-l $(SRC)/$(OBJDIR)$(DL)>> $@ + @echo $(DL)-nodefaults$(DL)>> $@ + @echo $(DL)-map $(OBJDIR)/$(NLM_NAME).map$(DL)>> $@ +ifneq "$(strip $(XLFLAGS))" "" + @echo $(DL)$(XLFLAGS)$(DL)>> $@ +endif +ifneq "$(strip $(FILES_nlm_objs))" "" + @echo $(DL)$(foreach objfile,$(strip $(FILES_nlm_objs)),$(objfile))$(DL)>> $@ +endif +ifneq "$(FILES_nlm_libs)" "" + @echo $(DL)$(foreach libfile, $(notdir $(strip $(FILES_nlm_libs))),-l$(libfile))$(DL)>> $@ +endif + @echo $(DL)-commandfile $(@:.opt=.def)$(DL)>> $@ + @echo $(DL)# Do not edit this file - it is created by make!$(DL)> $(@:.opt=.def) + @echo $(DL)# All your changes will be lost!!$(DL)>> $(@:.opt=.def) +ifneq "$(FILE_nlm_msg)" "" + @echo $(DL)Messages $(FILE_nlm_msg)$(DL)>> $(@:.opt=.def) +endif +ifneq "$(FILE_nlm_hlp)" "" + @echo $(DL)Help $(FILE_nlm_hlp)$(DL)>> $(@:.opt=.def) +endif +ifeq "$(FILE_nlm_copyright)" "" + @echo $(DL)copyright "$(NLM_COPYRIGHT)"$(DL)>> $(@:.opt=.def) +endif + @echo $(DL)description "$(NLM_DESCRIPTION)"$(DL)>> $(@:.opt=.def) + @echo $(DL)threadname "$(NLM_THREAD_NAME)"$(DL)>> $(@:.opt=.def) + @echo $(DL)screenname "$(NLM_SCREEN_NAME)"$(DL)>> $(@:.opt=.def) + @echo $(DL)stacksize $(subst K,000,$(subst k,K,$(strip $(NLM_STACK_SIZE))))$(DL)>> $(@:.opt=.def) +# @echo $(DL)version $(NLM_VERSION) $(DL)>> $(@:.opt=.def) + @echo $(DL)start $(NLM_ENTRY_SYM)$(DL)>> $(@:.opt=.def) + @echo $(DL)exit $(NLM_EXIT_SYM)$(DL)>> $(@:.opt=.def) +ifneq "$(NLM_CHECK_SYM)" "" + @echo $(DL)check $(NLM_CHECK_SYM)$(DL)>> $(@:.opt=.def) +endif + @echo $(DL)$(strip $(NLM_FLAGS))$(DL)>> $(@:.opt=.def) +ifneq "$(FILES_nlm_modules)" "" + @echo $(DL)module $(foreach module,$(subst $(SPACE),$(COMMA),$(strip $(FILES_nlm_modules))),$(module))$(DL)>> $(@:.opt=.def) +endif +ifneq "$(FILES_nlm_Ximports)" "" + @echo $(DL)import $(foreach import,$(subst $(SPACE),$(COMMA),$(strip $(FILES_nlm_Ximports))),$(import))$(DL)>> $(@:.opt=.def) +endif +ifneq "$(FILES_nlm_exports)" "" + @echo $(DL)export $(foreach export,$(subst $(SPACE),$(COMMA),$(strip $(FILES_nlm_exports))),$(export))$(DL)>> $(@:.opt=.def) +endif +# if APACHE_UNIPROC is defined, don't include XDCData +ifndef APACHE_UNIPROC +ifneq "$(string $(XDCDATA))" "" + @echo $(DL)xdcdata $(XDCDATA)$(DL)>> $(@:.opt=.def) +else + @echo $(DL)xdcdata apache.xdc$(DL)>> $(@:.opt=.def) +endif +endif + +else # more than one target so look for individual makefiles. + +# Only include these if NO_LICENSE_FILE isn't set to prevent excessive +# recursion + +ifndef NO_LICENSE_FILE + +$(OBJDIR)/%.nlm: NWGNU% $($(NLM_NAME)_LINKOPT_DEPENDS) FORCE + @echo $(DL)Calling $<$(DL) + $(MAKE) -f $< $(MAKECMDGOALS) RELEASE=$(RELEASE) + @$(ECHONL) + +else + +$(TARGET_nlm): + +endif # NO_LICENSE_FILE + +endif + diff --git a/build/PrintPath b/build/PrintPath new file mode 100755 index 0000000..2a2b48b --- /dev/null +++ b/build/PrintPath @@ -0,0 +1,130 @@ +#!/bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# Look for program[s] somewhere in $PATH. +# +# Options: +# -s +# Do not print out full pathname. (silent) +# -pPATHNAME +# Look in PATHNAME instead of $PATH +# +# Usage: +# PrintPath [-s] [-pPATHNAME] program [program ...] +# +# Initially written by Jim Jagielski for the Apache configuration mechanism +# (with kudos to Kernighan/Pike) + +## +# Some "constants" +## +pathname=$PATH +echo="yes" + +## +# Find out what OS we are running for later on +## +os=`(uname) 2>/dev/null` + +## +# Parse command line +## +for args in $* +do + case $args in + -s ) echo="no" ;; + -p* ) pathname="`echo $args | sed 's/^..//'`" ;; + * ) programs="$programs $args" ;; + esac +done + +## +# Now we make the adjustments required for OS/2 and everyone +# else :) +# +# First of all, all OS/2 programs have the '.exe' extension. +# Next, we adjust PATH (or what was given to us as PATH) to +# be whitespace separated directories. +# Finally, we try to determine the best flag to use for +# test/[] to look for an executable file. OS/2 just has '-r' +# but with other OSs, we do some funny stuff to check to see +# if test/[] knows about -x, which is the prefered flag. +## + +if [ "x$os" = "xOS/2" ] +then + ext=".exe" + pathname=`echo -E $pathname | + sed 's/^;/.;/ + s/;;/;.;/g + s/;$/;./ + s/;/ /g + s/\\\\/\\//g' ` + test_exec_flag="-r" +else + ext="" # No default extensions + pathname=`echo $pathname | + sed 's/^:/.:/ + s/::/:.:/g + s/:$/:./ + s/:/ /g' ` + # Here is how we test to see if test/[] can handle -x + testfile="pp.t.$$" + + cat > $testfile </dev/null`; then + test_exec_flag="-x" + else + test_exec_flag="-r" + fi + rm -f $testfile +fi + +for program in $programs +do + for path in $pathname + do + if [ $test_exec_flag $path/${program}${ext} ] && \ + [ ! -d $path/${program}${ext} ]; then + if [ "x$echo" = "xyes" ]; then + echo $path/${program}${ext} + fi + exit 0 + fi + +# Next try without extension (if one was used above) + if [ "x$ext" != "x" ]; then + if [ $test_exec_flag $path/${program} ] && \ + [ ! -d $path/${program} ]; then + if [ "x$echo" = "xyes" ]; then + echo $path/${program} + fi + exit 0 + fi + fi + done +done +exit 1 + diff --git a/build/aix/README b/build/aix/README new file mode 100644 index 0000000..3b87bd1 --- /dev/null +++ b/build/aix/README @@ -0,0 +1,66 @@ +The script buildaix.ksh will attempt to build a AIX installp fileset +out of a source tree for ASF project + +REQUIREMENTS: + Fileset Level State Type Description (Uninstaller) + ---------------------------------------------------------------------------- + bos.adt.insttools 5.3.7.2 C F Tool to Create installp + Packages + Fileset Level State Type Description (Uninstaller) + ---------------------------------------------------------------------------- + rpm.rte 3.0.5.41 C F RPM Package Manager + +Additional: +Preferred: download zlib sources and copy zlib.h and zconf.h to /opt/include +and, if configure cannot find them directly, add symbolic links from /usr/include to /opt/include + +To build a package, make sure you are in the root of the source tree, +and run: + +build/aix/buildaix.ksh + +An AIX fileset named $PKG.$NAME.$ARCH.$VERSION.I will be +created in the build/aix directory. the .template file created is also there. + +KNOWN issues: +on AIX libtool is known to have issues with the install command. +Some of these issues have been resolved by extracting the apr/apu utilities +from the projects (i.e. NOT using the embedded version) +In case of problems I recommend that you install the GNU 'install' program (part of coreutils) +If make DESTDIR=$TEMPDIR install command continues to fail, try 'make install' and then run +the buildaix.ksh command again + +TODO +Add Copyright display/banner +Add Apache LICENSE to fileset and require acceptance +Add special instructions for TCB - to ignore /etc/* /var/httpd/htdocs/* +Add _config_i scripts to setup autostart +Add _pre_i scripts to verify pre-requisites, required users/groups, etc. + +# This layout is intended to put customizeable data in /etc and /var +# the file listing will be used to create an exceptions file to modify +# the behavior of syschk checksum generation. +# AIX layout + + prefix: /opt/httpd + exec_prefix: /opt/httpd + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/libexec + mandir: /usr/share/man + sysconfdir: /etc/httpd + datadir: /var/httpd + installbuilddir: ${datadir}/build + errordir: ${datadir}/error + htdocsdir: ${datadir}/htdocs + cgidir: ${datadir}/cgi-bin + iconsdir: ${prefix}/icons + manualdir: ${prefix}/manual + includedir: ${prefix}/include + localstatedir: /var/httpd + runtimedir: ${localstatedir}/run + logfiledir: ${localstatedir}/logs + proxycachedir: ${localstatedir}/proxy + + diff --git a/build/aix/aixinfo b/build/aix/aixinfo new file mode 100644 index 0000000..58ac3a1 --- /dev/null +++ b/build/aix/aixinfo @@ -0,0 +1,16 @@ + +PKG="ASF" +NAME="httpd" +ARCH="powerpc" +VERSION="2.2.22" +CATEGORY="application" +VENDOR="Apache Software Foundation" +EMAIL="dev@httpd.apache.org" +VMMN=`build/get-version.sh mmn include/ap_mmn.h MODULE_MAGIC_NUMBER` +REVISION=`build/get-version.sh all include/ap_release.h AP_SERVER` +VERSION=`echo $REVISION | cut -d- -s -f1` +RELEASE=`echo $REVISION | cut -d- -s -f2` +if [ "x$VERSION" = "x" ]; then + VERSION=$REVISION + RELEASE=0 +fi diff --git a/build/aix/aixproto.ksh b/build/aix/aixproto.ksh new file mode 100755 index 0000000..5c5c471 --- /dev/null +++ b/build/aix/aixproto.ksh @@ -0,0 +1,78 @@ +#!/usr/bin/ksh +TEMPDIR=$1 +BUILD=`pwd` +. build/aix/pkginfo + +package=$PKG +name=$NAME +vrmf=$VERSION +descr="$VENDOR $NAME for $ARCH" +umask 022 +INFO=$BUILD/build/aix/.info +mkdir -p $INFO + +template=${INFO}/${PKG}.${NAME}.${vrmf}.template +>$template + +cd ${TEMPDIR} +rm -rf .info lpp_name tmp +# get the directory sizes in blocks +for d in etc opt var +do + set `du -s $d/${NAME}` + let sz$d=$1+1 +done +set `du -s usr/share/man` +szman=$1+1 + +files=./httpd-root +cd ${TEMPDIR}/.. +find ${files} -type d -exec chmod og+rx {} \; +chmod -R go+r ${files} +chown -R 0:0 ${files} + +cat - <>$template +Package Name: ${package}.${NAME} +Package VRMF: ${vrmf}.0 +Update: N +Fileset + Fileset Name: ${package}.${NAME}.rte + Fileset VRMF: ${vrmf}.0 + Fileset Description: ${descr} + USRLIBLPPFiles + EOUSRLIBLPPFiles + Bosboot required: N + License agreement acceptance required: N + Include license files in this package: N + Requisites: + Upsize: /usr/share/man ${szman}; + Upsize: /etc/${NAME} $szetc; + Upsize: /opt/${NAME} $szopt; + Upsize: /var/${NAME} $szvar; + USRFiles +EOF + +find ${files} | sed -e s#^${files}## | sed -e "/^$/d" >>$template + +cat - <>$template + EOUSRFiles + ROOT Part: N + ROOTFiles + EOROOTFiles + Relocatable: N +EOFileset +EOF + +cp ${template} ${BUILD}/build/aix + +# use mkinstallp to create the fileset. result is in ${TEMPDIR}/tmp +mkinstallp -d ${TEMPDIR} -T ${template} + +cp ${TEMPDIR}/tmp/$PKG.$NAME.$VERSION.0.bff ${BUILD}/build/aix +cd $BUILD/build/aix +rm -f $PKG.$NAME.$VERSION.$ARCH.I +mv $PKG.$NAME.$VERSION.0.bff $PKG.$NAME.$VERSION.$ARCH.I +rm .toc +inutoc . +installp -d . -ap ${PKG}.${NAME} +installp -d . -L diff --git a/build/aix/buildaix.ksh b/build/aix/buildaix.ksh new file mode 100755 index 0000000..83521d4 --- /dev/null +++ b/build/aix/buildaix.ksh @@ -0,0 +1,127 @@ +#!/usr/bin/ksh +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# + +# buildaix.ksh: This script builds an AIX fileset of Apache httpd + +# if arguments - try to run fast +cmd=$0 + +export CFLAGS='-O2 -qlanglvl=extc99' + +lslpp -L bos.adt.insttools >/dev/null + [[ $? -ne 0 ]] && echo "must have bos.adt.insttools installed" && exit -1 + +apr_config=`which apr-1-config` +apu_config=`which apu-1-config` + +if [[ -z ${apr_config} && -z ${apu_config} ]] +then + export PATH=/opt/bin:${PATH} + apr_config=`which apr-1-config` + apu_config=`which apu-1-config` +fi + +while test $# -gt 0 +do + # Normalize + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + case "$1" in + --with-apr=*) + apr_config=$optarg + ;; + esac + + case "$1" in + --with-apr-util=*) + apu_config=$optarg + ;; + esac + + shift + argc-- +done + +if [ ! -f "$apr_config" -a ! -f "$apr_config/configure.in" ]; then + echo "The apr source directory / apr-1-config could not be found" + echo "If available, install the ASF.apu.rte and ASF.apr.rte filesets" + echo "Usage: $cmd [--with-apr=[dir|file]] [--with-apr-util=[dir|file]]" + exit 1 +fi + +if [ ! -f "$apu_config" -a ! -f "$apu_config/configure.in" ]; then + echo "The apu source directory / apu-1-config could not be found" + echo "If available, install the ASF.apu.rte and ASF.apr.rte filesets" + echo "Usage: $cmd [--with-apr=[dir|file]] [--with-apr-util=[dir|file]]" + exit 1 +fi + +. build/aix/aixinfo +LAYOUT=AIX +TEMPDIR=/var/tmp/$USER/${NAME}.${VERSION} +rm -rf $TEMPDIR + +if [[ ! -e ./Makefile ]] # if Makefile exists go faster +then +# --with-mpm=worker \n\ + echo "+ ./configure \n\ + --enable-layout=$LAYOUT \n\ + --with-apr=$apr_config \n\ + --with-apr-util=$apu_config \n\ + --enable-mpms-shared=all \n\ + --enable-mods-shared=all \n\ + --disable-lua > build/aix/configure.out" + +# --with-mpm=worker \ + ./configure \ + --enable-layout=$LAYOUT \ + --with-apr=$apr_config \ + --with-apr-util=$apu_config \ + --enable-mpms-shared=all \ + --enable-mods-shared=all \ + --disable-lua > build/aix/configure.out + [[ $? -ne 0 ]] && echo './configure' returned an error && exit -1 +else + echo $0: using existing Makefile + echo $0: run make distclean to get a standard AIX configure + echo + ls -l ./Makefile config.* + echo +fi + +echo "+ make > build/aix/make.out" +make > build/aix/make.out + [[ $? -ne 0 ]] && echo 'make' returned an error && exit -1 + +echo "+ make install DESTDIR=$TEMPDIR > build/aix/install.out" +make install DESTDIR=$TEMPDIR > build/aix/install.out + [[ $? -ne 0 ]] && echo 'make install' returned an error && exit -1 + +echo "+ build/aix/mkinstallp.ksh $TEMPDIR > build/aix/mkinstallp.out" +build/aix/mkinstallp.ksh $TEMPDIR > build/aix/mkinstallp.out + [[ $? -ne 0 ]] && echo mkinstallp.ksh returned an error && exit -1 + +rm -rf $TEMPDIR + +# list installable fileset(s) +echo ======================== +installp -d build/aix -L +echo ======================== diff --git a/build/aix/mkinstallp.ksh b/build/aix/mkinstallp.ksh new file mode 100755 index 0000000..12049fc --- /dev/null +++ b/build/aix/mkinstallp.ksh @@ -0,0 +1,201 @@ +#!/usr/bin/ksh +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# + +# minstallp.ksh # create an installp image of ${NAME} (defined in aixinfo) +# from TEMPDIR using mkinstallp (part of bos.adt.insttools) + +[[ $# == 0 ]] && echo $0: Syntax error && echo "Syntax: $0 " && exit -1 + +umask 022 +TEMPDIR=$1 +BASE=`pwd` +cd ${TEMPDIR} +[[ $? != 0 ]] && echo $0: ${TEMPDIR} -- bad directory && exit -1 + +# clean up side-effects from DEBUG passes - usr/local might be there as +# a circular link i.e. usr/local points at /usr/local +# as we are not using /usr/local for ASF packaging, remove it! +# mkinstallp seems to make usr/local -> /usr/local +[[ -f usr/local ]] && rm -f usr/local && echo removed unexpected usr/local !! +[[ -L usr/local ]] && rm -f usr/local && echo removed unexpected usr/local !! +[[ -d usr/local ]] && rm -rf usr/local && echo removed unexpected usr/local !! + +# use the aixinfo for PKG NAME VERSION etc labels +cd ${BASE} +. build/aix/aixinfo +# INFO=${BASE}/build/aix/.info +# mkdir -p $INFO +INFO=${BASE}/build/aix +template=${INFO}/${PKG}.${NAME}.${VERSION}.template +>$template + +# mkinstallp template definitions +# TODO: add AIX oslevel/uname information for package filename +package=$PKG +name=$NAME +vrmf=$VERSION +release=$RELEASE +descr="$NAME version ${VERSION} for $ARCH ${VENDOR}" + +# copy LICENSE information +# TODO: setup template so that license acceptance is required +# TODO: add Copyright Information for display during install +mkdir -p ${TEMPDIR}/usr/swlag/en_US +cp ${BASE}/LICENSE ${TEMPDIR}/usr/swlag/en_US/${PKG}.${NAME}.la + +cd ${TEMPDIR} +# remove files we do not want as "part" possibly +# left-over from a previous packaging +rm -rf .info lpp_name tmp usr/lpp +[[ $? -ne 0 ]] && echo $cmd: cleanup error && pwd && ls -ltr && exit -1 + +#if we are going to add extra symbolic links - do it now +[[ -r build/aix/aixlinks ]] && ksh build/aix/aixlinks + +# get the directory sizes in blocks +for d in etc opt var +do + if [[ -d $d/${NAME} ]] + then + set `du -s $d/${NAME}` + else + [[ -d $d ]] && set `du -s $d` + fi + # make sure the argument exists before using setting values + if [[ -d $d ]] + then + eval nm$d=/"$2" + let sz$d=$1 + fi +done + +files=./${NAME}.${VERSION} +cd ${TEMPDIR}/.. +find ${files} -type d -exec chmod og+rx {} \; +chmod -R go+r ${files} +chown -R 0.0 ${files} + +cat - <>$template +Package Name: ${PKG}.${NAME} +Package VRMF: ${VERSION}.${RELEASE} +Update: N +Fileset + Fileset Name: ${PKG}.${NAME}.rte + Fileset VRMF: ${VERSION}.${RELEASE} + Fileset Description: ${descr} + USRLIBLPPFiles + EOUSRLIBLPPFiles + Bosboot required: N + License agreement acceptance required: N + Name of license agreement: + Include license files in this package: N + Requisites: +EOF + +[[ $szetc -ne 0 ]] && echo " Upsize: ${nmetc} $szetc;" >> $template +[[ $szopt -ne 0 ]] && echo " Upsize: ${nmopt} $szopt;" >> $template +[[ $szvar -ne 0 ]] && echo " Upsize: ${nmvar} $szvar;" >> $template +echo " USRFiles" >> $template + +# USR part -- i.e. files in /usr and /opt +cd ${TEMPDIR}/.. +find ${files}/usr/swlag ${files}/opt \ + | sed -e s#^${files}## | sed -e "/^$/d" >>$template +echo " EOUSRFiles" >> $template + +if [[ $szetc -gt 0 || $szvar -gt 0 ]] +then +INSTROOT=${TEMPDIR}/usr/lpp/${PKG}.${NAME}/inst_root +mkdir -p ${INSTROOT} +cd ${TEMPDIR} +[[ $szetc -gt 0 ]] && find ./etc -type d | backup -if - | (cd ${INSTROOT}; restore -xqf -) >/dev/null +[[ $szvar -gt 0 ]] && find ./var -type d | backup -if - | (cd ${INSTROOT}; restore -xqf -) >/dev/null +cat - <>$template + ROOT Part: Y + ROOTFiles +EOF + +# ROOT part +cd ${TEMPDIR}/.. +find ${files}/etc ${files}/var \ + | sed -e s#^${files}## | sed -e "/^$/d" >>$template +else +# no ROOT parts to include +cat - <>$template + ROOT Part: N + ROOTFiles +EOF +fi +cat - <>$template + EOROOTFiles + Relocatable: N +EOFileset +EOF +# man pages as separate fileset +cd ${TEMPDIR} +if [[ -d usr/share/man ]] +then + # manual pages, space required calculation + set `du -s usr/share/man` + szman=$1 + descr="$NAME ${VERSION} man pages ${VENDOR}" + cat - <>$template +Fileset + Fileset Name: ${PKG}.${NAME}.man.en_US + Fileset VRMF: ${VERSION}.${RELEASE} + Fileset Description: ${descr} + USRLIBLPPFiles + EOUSRLIBLPPFiles + Bosboot required: N + License agreement acceptance required: N + Name of license agreement: + Include license files in this package: N + Requisites: +EOF + + echo " Upsize: /usr/share/man ${szman};" >> $template + echo " USRFiles" >> $template + cd ${TEMPDIR}/.. + find ${files}/usr/share | sed -e s#^${files}## | sed -e "/^$/d" >>$template + cat - <>$template + EOUSRFiles + ROOT Part: N + ROOTFiles + EOROOTFiles + Relocatable: N +EOFileset + +EOF +fi + +# use mkinstallp to create the fileset. result is in ${TEMPDIR}/tmp +# must actually sit in TEMPDIR for ROOT part processing to succeed +# also - need "empty" directories to exist, as they do not get copied +# in the inst_root part +cd ${TEMPDIR} +mkinstallp -d ${TEMPDIR} -T ${template} +[[ $? -ne 0 ]] && echo mkinstallp returned error status && exit -1 + +# copy package to build/aix +# create TOC +cp ${TEMPDIR}/tmp/$PKG.$NAME.$VERSION.0.bff ${BASE}/build/aix +cd ${BASE}/build/aix +rm -f $PKG.$NAME.$VERSION.$ARCH.I +mv $PKG.$NAME.$VERSION.0.bff $PKG.$NAME.$ARCH.$VERSION.I +rm -f .toc +inutoc . diff --git a/build/apr_common.m4 b/build/apr_common.m4 new file mode 100644 index 0000000..99d7ce1 --- /dev/null +++ b/build/apr_common.m4 @@ -0,0 +1,987 @@ +dnl -------------------------------------------------------- -*- autoconf -*- +dnl Licensed to the Apache Software Foundation (ASF) under one or more +dnl contributor license agreements. See the NOTICE file distributed with +dnl this work for additional information regarding copyright ownership. +dnl The ASF licenses this file to You under the Apache License, Version 2.0 +dnl (the "License"); you may not use this file except in compliance with +dnl the License. You may obtain a copy of the License at +dnl +dnl http://www.apache.org/licenses/LICENSE-2.0 +dnl +dnl Unless required by applicable law or agreed to in writing, software +dnl distributed under the License is distributed on an "AS IS" BASIS, +dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +dnl See the License for the specific language governing permissions and +dnl limitations under the License. + +dnl +dnl apr_common.m4: APR's general-purpose autoconf macros +dnl + +dnl +dnl APR_CONFIG_NICE(filename) +dnl +dnl Saves a snapshot of the configure command-line for later reuse +dnl +AC_DEFUN([APR_CONFIG_NICE], [ + rm -f $1 + cat >$1<> $1 + fi + if test -n "$CFLAGS"; then + echo "CFLAGS=\"$CFLAGS\"; export CFLAGS" >> $1 + fi + if test -n "$CPPFLAGS"; then + echo "CPPFLAGS=\"$CPPFLAGS\"; export CPPFLAGS" >> $1 + fi + if test -n "$LDFLAGS"; then + echo "LDFLAGS=\"$LDFLAGS\"; export LDFLAGS" >> $1 + fi + if test -n "$LTFLAGS"; then + echo "LTFLAGS=\"$LTFLAGS\"; export LTFLAGS" >> $1 + fi + if test -n "$LIBS"; then + echo "LIBS=\"$LIBS\"; export LIBS" >> $1 + fi + if test -n "$INCLUDES"; then + echo "INCLUDES=\"$INCLUDES\"; export INCLUDES" >> $1 + fi + if test -n "$NOTEST_CFLAGS"; then + echo "NOTEST_CFLAGS=\"$NOTEST_CFLAGS\"; export NOTEST_CFLAGS" >> $1 + fi + if test -n "$NOTEST_CPPFLAGS"; then + echo "NOTEST_CPPFLAGS=\"$NOTEST_CPPFLAGS\"; export NOTEST_CPPFLAGS" >> $1 + fi + if test -n "$NOTEST_LDFLAGS"; then + echo "NOTEST_LDFLAGS=\"$NOTEST_LDFLAGS\"; export NOTEST_LDFLAGS" >> $1 + fi + if test -n "$NOTEST_LIBS"; then + echo "NOTEST_LIBS=\"$NOTEST_LIBS\"; export NOTEST_LIBS" >> $1 + fi + + # Retrieve command-line arguments. + eval "set x $[0] $ac_configure_args" + shift + + for arg + do + APR_EXPAND_VAR(arg, $arg) + echo "\"[$]arg\" \\" >> $1 + done + echo '"[$]@"' >> $1 + chmod +x $1 +])dnl + +dnl APR_MKDIR_P_CHECK(fallback-mkdir-p) +dnl checks whether mkdir -p works +AC_DEFUN([APR_MKDIR_P_CHECK], [ + AC_CACHE_CHECK(for working mkdir -p, ac_cv_mkdir_p,[ + test -d conftestdir && rm -rf conftestdir + mkdir -p conftestdir/somedir >/dev/null 2>&1 + if test -d conftestdir/somedir; then + ac_cv_mkdir_p=yes + else + ac_cv_mkdir_p=no + fi + rm -rf conftestdir + ]) + if test "$ac_cv_mkdir_p" = "yes"; then + mkdir_p="mkdir -p" + else + mkdir_p="$1" + fi +]) + +dnl +dnl APR_SUBDIR_CONFIG(dir [, sub-package-cmdline-args, args-to-drop]) +dnl +dnl dir: directory to find configure in +dnl sub-package-cmdline-args: arguments to add to the invocation (optional) +dnl args-to-drop: arguments to drop from the invocation (optional) +dnl +dnl Note: This macro relies on ac_configure_args being set properly. +dnl +dnl The args-to-drop argument is shoved into a case statement, so +dnl multiple arguments can be separated with a |. +dnl +dnl Note: Older versions of autoconf do not single-quote args, while 2.54+ +dnl places quotes around every argument. So, if you want to drop the +dnl argument called --enable-layout, you must pass the third argument as: +dnl [--enable-layout=*|\'--enable-layout=*] +dnl +dnl Trying to optimize this is left as an exercise to the reader who wants +dnl to put up with more autoconf craziness. I give up. +dnl +AC_DEFUN([APR_SUBDIR_CONFIG], [ + # save our work to this point; this allows the sub-package to use it + AC_CACHE_SAVE + + echo "configuring package in $1 now" + ac_popdir=`pwd` + apr_config_subdirs="$1" + test -d $1 || $mkdir_p $1 + ac_abs_srcdir=`(cd $srcdir/$1 && pwd)` + cd $1 + +changequote(, )dnl + # A "../" for each directory in /$config_subdirs. + ac_dots=`echo $apr_config_subdirs|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'` +changequote([, ])dnl + + # Make the cache file pathname absolute for the subdirs + # required to correctly handle subdirs that might actually + # be symlinks + case "$cache_file" in + /*) # already absolute + ac_sub_cache_file=$cache_file ;; + *) # Was relative path. + ac_sub_cache_file="$ac_popdir/$cache_file" ;; + esac + + ifelse($3, [], [apr_configure_args=$ac_configure_args],[ + apr_configure_args= + apr_sep= + for apr_configure_arg in $ac_configure_args + do + case "$apr_configure_arg" in + $3) + continue ;; + esac + apr_configure_args="$apr_configure_args$apr_sep'$apr_configure_arg'" + apr_sep=" " + done + ]) + + dnl autoconf doesn't add --silent to ac_configure_args; explicitly pass it + test "x$silent" = "xyes" && apr_configure_args="$apr_configure_args --silent" + + dnl AC_CONFIG_SUBDIRS silences option warnings, emulate this for 2.62 + apr_configure_args="--disable-option-checking $apr_configure_args" + + dnl The eval makes quoting arguments work - specifically the second argument + dnl where the quoting mechanisms used is "" rather than []. + dnl + dnl We need to execute another shell because some autoconf/shell combinations + dnl will choke after doing repeated APR_SUBDIR_CONFIG()s. (Namely Solaris + dnl and autoconf-2.54+) + if eval $SHELL $ac_abs_srcdir/configure $apr_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_abs_srcdir $2 + then : + echo "$1 configured properly" + else + echo "configure failed for $1" + exit 1 + fi + + cd $ac_popdir + + # grab any updates from the sub-package + AC_CACHE_LOAD +])dnl + +dnl +dnl APR_SAVE_THE_ENVIRONMENT(variable_name) +dnl +dnl Stores the variable (usually a Makefile macro) for later restoration +dnl +AC_DEFUN([APR_SAVE_THE_ENVIRONMENT], [ + apr_ste_save_$1="$$1" +])dnl + +dnl +dnl APR_RESTORE_THE_ENVIRONMENT(variable_name, prefix_) +dnl +dnl Uses the previously saved variable content to figure out what configure +dnl has added to the variable, moving the new bits to prefix_variable_name +dnl and restoring the original variable contents. This makes it possible +dnl for a user to override configure when it does something stupid. +dnl +AC_DEFUN([APR_RESTORE_THE_ENVIRONMENT], [ +dnl Check whether $apr_ste_save_$1 is empty or +dnl only whitespace. The verbatim "X" is token number 1, +dnl the following whitespace will be ignored. +set X $apr_ste_save_$1 +if test ${#} -eq 1; then + $2$1="$$1" + $1= +else + if test "x$apr_ste_save_$1" = "x$$1"; then + $2$1= + else + $2$1=`echo "$$1" | sed -e "s%${apr_ste_save_$1}%%"` + $1="$apr_ste_save_$1" + fi +fi +if test "x$silent" != "xyes"; then + echo " restoring $1 to \"$$1\"" + echo " setting $2$1 to \"$$2$1\"" +fi +AC_SUBST($2$1) +])dnl + +dnl +dnl APR_SETIFNULL(variable, value) +dnl +dnl Set variable iff it's currently null +dnl +AC_DEFUN([APR_SETIFNULL], [ + if test -z "$$1"; then + test "x$silent" != "xyes" && echo " setting $1 to \"$2\"" + $1="$2" + fi +])dnl + +dnl +dnl APR_SETVAR(variable, value) +dnl +dnl Set variable no matter what +dnl +AC_DEFUN([APR_SETVAR], [ + test "x$silent" != "xyes" && echo " forcing $1 to \"$2\"" + $1="$2" +])dnl + +dnl +dnl APR_ADDTO(variable, value) +dnl +dnl Add value to variable +dnl +AC_DEFUN([APR_ADDTO], [ + if test "x$$1" = "x"; then + test "x$silent" != "xyes" && echo " setting $1 to \"$2\"" + $1="$2" + else + apr_addto_bugger="$2" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $$1; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to $1" + $1="$$1 $i" + fi + done + fi +])dnl + +dnl +dnl APR_REMOVEFROM(variable, value) +dnl +dnl Remove a value from a variable +dnl +AC_DEFUN([APR_REMOVEFROM], [ + if test "x$$1" = "x$2"; then + test "x$silent" != "xyes" && echo " nulling $1" + $1="" + else + apr_new_bugger="" + apr_removed=0 + for i in $$1; do + if test "x$i" != "x$2"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + test "x$silent" != "xyes" && echo " removed \"$2\" from $1" + $1=$apr_new_bugger + fi + fi +]) dnl + +dnl +dnl APR_CHECK_DEFINE_FILES( symbol, header_file [header_file ...] ) +dnl +AC_DEFUN([APR_CHECK_DEFINE_FILES], [ + AC_CACHE_CHECK([for $1 in $2],ac_cv_define_$1,[ + ac_cv_define_$1=no + for curhdr in $2 + do + AC_EGREP_CPP(YES_IS_DEFINED, [ +#include <$curhdr> +#ifdef $1 +YES_IS_DEFINED +#endif + ], ac_cv_define_$1=yes) + done + ]) + if test "$ac_cv_define_$1" = "yes"; then + AC_DEFINE(HAVE_$1, 1, [Define if $1 is defined]) + fi +]) + + +dnl +dnl APR_CHECK_DEFINE(symbol, header_file) +dnl +AC_DEFUN([APR_CHECK_DEFINE], [ + AC_CACHE_CHECK([for $1 in $2],ac_cv_define_$1,[ + AC_EGREP_CPP(YES_IS_DEFINED, [ +#include <$2> +#ifdef $1 +YES_IS_DEFINED +#endif + ], ac_cv_define_$1=yes, ac_cv_define_$1=no) + ]) + if test "$ac_cv_define_$1" = "yes"; then + AC_DEFINE(HAVE_$1, 1, [Define if $1 is defined in $2]) + fi +]) + +dnl +dnl APR_CHECK_APR_DEFINE( symbol ) +dnl +AC_DEFUN([APR_CHECK_APR_DEFINE], [ +apr_old_cppflags=$CPPFLAGS +CPPFLAGS="$CPPFLAGS $INCLUDES" +AC_EGREP_CPP(YES_IS_DEFINED, [ +#include +#if $1 +YES_IS_DEFINED +#endif +], ac_cv_define_$1=yes, ac_cv_define_$1=no) +CPPFLAGS=$apr_old_cppflags +]) + +dnl APR_CHECK_FILE(filename); set ac_cv_file_filename to +dnl "yes" if 'filename' is readable, else "no". +dnl @deprecated! - use AC_CHECK_FILE instead +AC_DEFUN([APR_CHECK_FILE], [ +dnl Pick a safe variable name +define([apr_cvname], ac_cv_file_[]translit([$1], [./+-], [__p_])) +AC_CACHE_CHECK([for $1], [apr_cvname], +[if test -r $1; then + apr_cvname=yes + else + apr_cvname=no + fi]) +]) + +define(APR_IFALLYES,[dnl +ac_rc=yes +for ac_spec in $1; do + ac_type=`echo "$ac_spec" | sed -e 's/:.*$//'` + ac_item=`echo "$ac_spec" | sed -e 's/^.*://'` + case $ac_type in + header ) + ac_item=`echo "$ac_item" | sed 'y%./+-%__p_%'` + ac_var="ac_cv_header_$ac_item" + ;; + file ) + ac_item=`echo "$ac_item" | sed 'y%./+-%__p_%'` + ac_var="ac_cv_file_$ac_item" + ;; + func ) ac_var="ac_cv_func_$ac_item" ;; + struct ) ac_var="ac_cv_struct_$ac_item" ;; + define ) ac_var="ac_cv_define_$ac_item" ;; + custom ) ac_var="$ac_item" ;; + esac + eval "ac_val=\$$ac_var" + if test ".$ac_val" != .yes; then + ac_rc=no + break + fi +done +if test ".$ac_rc" = .yes; then + : + $2 +else + : + $3 +fi +]) + + +define(APR_BEGIN_DECISION,[dnl +ac_decision_item='$1' +ac_decision_msg='FAILED' +ac_decision='' +]) + + +AC_DEFUN([APR_DECIDE],[dnl +dnl Define the flag (or not) in apr_private.h via autoheader +AH_TEMPLATE($1, [Define if $2 will be used]) +ac_decision='$1' +ac_decision_msg='$2' +ac_decision_$1=yes +ac_decision_$1_msg='$2' +]) + + +define(APR_DECISION_OVERRIDE,[dnl + ac_decision='' + for ac_item in $1; do + eval "ac_decision_this=\$ac_decision_${ac_item}" + if test ".$ac_decision_this" = .yes; then + ac_decision=$ac_item + eval "ac_decision_msg=\$ac_decision_${ac_item}_msg" + fi + done +]) + + +define(APR_DECISION_FORCE,[dnl +ac_decision="$1" +eval "ac_decision_msg=\"\$ac_decision_${ac_decision}_msg\"" +]) + + +define(APR_END_DECISION,[dnl +if test ".$ac_decision" = .; then + echo "[$]0:Error: decision on $ac_decision_item failed" 1>&2 + exit 1 +else + if test ".$ac_decision_msg" = .; then + ac_decision_msg="$ac_decision" + fi + AC_DEFINE_UNQUOTED(${ac_decision_item}) + AC_MSG_RESULT([decision on $ac_decision_item... $ac_decision_msg]) +fi +]) + + +dnl +dnl APR_TRY_COMPILE_NO_WARNING(INCLUDES, FUNCTION-BODY, +dnl [ACTIONS-IF-NO-WARNINGS], [ACTIONS-IF-WARNINGS]) +dnl +dnl Tries a compile test with warnings activated so that the result +dnl is false if the code doesn't compile cleanly. For compilers +dnl where it is not known how to activate a "fail-on-error" mode, +dnl it is undefined which of the sets of actions will be run. +dnl +AC_DEFUN([APR_TRY_COMPILE_NO_WARNING], +[apr_save_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS $CFLAGS_WARN" + if test "$ac_cv_prog_gcc" = "yes"; then + CFLAGS="$CFLAGS -Werror" + fi + AC_COMPILE_IFELSE( + [AC_LANG_SOURCE( + [ +#ifndef PACKAGE_NAME +#include "confdefs.h" +#endif + ] + [[$1]] + [int main(int argc, const char *const *argv) {] + [[$2]] + [ return 0; }] + )], [CFLAGS=$apr_save_CFLAGS +$3], [CFLAGS=$apr_save_CFLAGS +$4]) +]) + +dnl +dnl APR_CHECK_STRERROR_R_RC +dnl +dnl Decide which style of retcode is used by this system's +dnl strerror_r(). It either returns int (0 for success, -1 +dnl for failure), or it returns a pointer to the error +dnl string. +dnl +dnl +AC_DEFUN([APR_CHECK_STRERROR_R_RC], [ +AC_CACHE_CHECK([whether return code from strerror_r has type int], +[ac_cv_strerror_r_rc_int], +[AC_TRY_RUN([ +#include +#include +#include +#include +int main(void) +{ + char buf[1024]; + if (strerror_r(ERANGE, buf, sizeof buf) < 1) { + exit(0); + } + else { + exit(1); + } +}], [ + ac_cv_strerror_r_rc_int=yes ], [ + ac_cv_strerror_r_rc_int=no ], [ + ac_cv_strerror_r_rc_int=no ] ) ] ) +if test "x$ac_cv_strerror_r_rc_int" = xyes; then + AC_DEFINE(STRERROR_R_RC_INT, 1, [Define if strerror returns int]) +fi +] ) + +dnl +dnl APR_CHECK_DIRENT_INODE +dnl +dnl Decide if d_fileno or d_ino are available in the dirent +dnl structure on this platform. Single UNIX Spec says d_ino, +dnl BSD uses d_fileno. Undef to find the real beast. +dnl +AC_DEFUN([APR_CHECK_DIRENT_INODE], [ +AC_CACHE_CHECK([for inode member of struct dirent], apr_cv_dirent_inode, [ +apr_cv_dirent_inode=no +AC_TRY_COMPILE([ +#include +#include +],[ +#ifdef d_ino +#undef d_ino +#endif +struct dirent de; de.d_fileno; +], apr_cv_dirent_inode=d_fileno) +if test "$apr_cv_dirent_inode" = "no"; then +AC_TRY_COMPILE([ +#include +#include +],[ +#ifdef d_fileno +#undef d_fileno +#endif +struct dirent de; de.d_ino; +], apr_cv_dirent_inode=d_ino) +fi +]) +if test "$apr_cv_dirent_inode" != "no"; then + AC_DEFINE_UNQUOTED(DIRENT_INODE, $apr_cv_dirent_inode, + [Define if struct dirent has an inode member]) +fi +]) + +dnl +dnl APR_CHECK_DIRENT_TYPE +dnl +dnl Decide if d_type is available in the dirent structure +dnl on this platform. Not part of the Single UNIX Spec. +dnl Note that this is worthless without DT_xxx macros, so +dnl look for one while we are at it. +dnl +AC_DEFUN([APR_CHECK_DIRENT_TYPE], [ +AC_CACHE_CHECK([for file type member of struct dirent], apr_cv_dirent_type,[ +apr_cv_dirent_type=no +AC_TRY_COMPILE([ +#include +#include +],[ +struct dirent de; de.d_type = DT_REG; +], apr_cv_dirent_type=d_type) +]) +if test "$apr_cv_dirent_type" != "no"; then + AC_DEFINE_UNQUOTED(DIRENT_TYPE, $apr_cv_dirent_type, + [Define if struct dirent has a d_type member]) +fi +]) + +dnl the following is a newline, a space, a tab, and a backslash (the +dnl backslash is used by the shell to skip newlines, but m4 sees it; +dnl treat it like whitespace). +dnl WARNING: don't reindent these lines, or the space/tab will be lost! +define([apr_whitespace],[ + \]) + +dnl +dnl APR_COMMA_ARGS(ARG1 ...) +dnl convert the whitespace-separated arguments into comman-separated +dnl arguments. +dnl +dnl APR_FOREACH(CODE-BLOCK, ARG1, ARG2, ...) +dnl subsitute CODE-BLOCK for each ARG[i]. "eachval" will be set to ARG[i] +dnl within each iteration. +dnl +changequote({,}) +define({APR_COMMA_ARGS},{patsubst([$}{1],[[}apr_whitespace{]+],[,])}) +define({APR_FOREACH}, + {ifelse($}{2,,, + [define([eachval], + $}{2)$}{1[]APR_FOREACH([$}{1], + builtin([shift], + builtin([shift], $}{@)))])}) +changequote([,]) + +dnl APR_FLAG_HEADERS(HEADER-FILE ... [, FLAG-TO-SET ] [, "yes" ]) +dnl we set FLAG-TO-SET to 1 if we find HEADER-FILE, otherwise we set to 0 +dnl if FLAG-TO-SET is null, we automagically determine it's name +dnl by changing all "/" to "_" in the HEADER-FILE and dropping +dnl all "." and "-" chars. If the 3rd parameter is "yes" then instead of +dnl setting to 1 or 0, we set FLAG-TO-SET to yes or no. +dnl +AC_DEFUN([APR_FLAG_HEADERS], [ +AC_CHECK_HEADERS($1) +for aprt_i in $1 +do + ac_safe=`echo "$aprt_i" | sed 'y%./+-%__p_%'` + aprt_2=`echo "$aprt_i" | sed -e 's%/%_%g' -e 's/\.//g' -e 's/-//g'` + if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + eval "ifelse($2,,$aprt_2,$2)=ifelse($3,yes,yes,1)" + else + eval "ifelse($2,,$aprt_2,$2)=ifelse($3,yes,no,0)" + fi +done +]) + +dnl APR_FLAG_FUNCS(FUNC ... [, FLAG-TO-SET] [, "yes" ]) +dnl if FLAG-TO-SET is null, we automagically determine it's name +dnl prepending "have_" to the function name in FUNC, otherwise +dnl we use what's provided as FLAG-TO-SET. If the 3rd parameter +dnl is "yes" then instead of setting to 1 or 0, we set FLAG-TO-SET +dnl to yes or no. +dnl +AC_DEFUN([APR_FLAG_FUNCS], [ +AC_CHECK_FUNCS($1) +for aprt_j in $1 +do + aprt_3="have_$aprt_j" + if eval "test \"`echo '$ac_cv_func_'$aprt_j`\" = yes"; then + eval "ifelse($2,,$aprt_3,$2)=ifelse($3,yes,yes,1)" + else + eval "ifelse($2,,$aprt_3,$2)=ifelse($3,yes,no,0)" + fi +done +]) + +dnl Iteratively interpolate the contents of the second argument +dnl until interpolation offers no new result. Then assign the +dnl final result to $1. +dnl +dnl Example: +dnl +dnl foo=1 +dnl bar='${foo}/2' +dnl baz='${bar}/3' +dnl APR_EXPAND_VAR(fraz, $baz) +dnl $fraz is now "1/2/3" +dnl +AC_DEFUN([APR_EXPAND_VAR], [ +ap_last= +ap_cur="$2" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +$1="${ap_cur}" +]) + +dnl +dnl Removes the value of $3 from the string in $2, strips of any leading +dnl slashes, and returns the value in $1. +dnl +dnl Example: +dnl orig_path="${prefix}/bar" +dnl APR_PATH_RELATIVE(final_path, $orig_path, $prefix) +dnl $final_path now contains "bar" +AC_DEFUN([APR_PATH_RELATIVE], [ +ap_stripped=`echo $2 | sed -e "s#^$3##"` +# check if the stripping was successful +if test "x$2" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + $1="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + $1="$2" +fi +]) + +dnl APR_HELP_STRING(LHS, RHS) +dnl Autoconf 2.50 can not handle substr correctly. It does have +dnl AC_HELP_STRING, so let's try to call it if we can. +dnl Note: this define must be on one line so that it can be properly returned +dnl as the help string. When using this macro with a multi-line RHS, ensure +dnl that you surround the macro invocation with []s +AC_DEFUN([APR_HELP_STRING], [ifelse(regexp(AC_ACVERSION, 2\.1), -1, AC_HELP_STRING([$1],[$2]),[ ][$1] substr([ ],len($1))[$2])]) + +dnl +dnl APR_LAYOUT(configlayout, layoutname [, extravars]) +dnl +AC_DEFUN([APR_LAYOUT], [ + if test ! -f $srcdir/config.layout; then + echo "** Error: Layout file $srcdir/config.layout not found" + echo "** Error: Cannot use undefined layout '$LAYOUT'" + exit 1 + fi + # Catch layout names including a slash which will otherwise + # confuse the heck out of the sed script. + case $2 in + */*) + echo "** Error: $2 is not a valid layout name" + exit 1 ;; + esac + pldconf=./config.pld + changequote({,}) + sed -e "1s/[ ]*<[lL]ayout[ ]*$2[ ]*>[ ]*//;1t" \ + -e "1,/[ ]*<[lL]ayout[ ]*$2[ ]*>[ ]*/d" \ + -e '/[ ]*<\/Layout>[ ]*/,$d' \ + -e "s/^[ ]*//g" \ + -e "s/:[ ]*/=\'/g" \ + -e "s/[ ]*$/'/g" \ + $1 > $pldconf + layout_name=$2 + if test ! -s $pldconf; then + echo "** Error: unable to find layout $layout_name" + exit 1 + fi + . $pldconf + rm $pldconf + for var in prefix exec_prefix bindir sbindir libexecdir mandir \ + sysconfdir datadir includedir localstatedir runtimedir \ + logfiledir libdir installbuilddir libsuffix $3; do + eval "val=\"\$$var\"" + case $val in + *+) + val=`echo $val | sed -e 's;\+$;;'` + eval "$var=\"\$val\"" + autosuffix=yes + ;; + *) + autosuffix=no + ;; + esac + val=`echo $val | sed -e 's:\(.\)/*$:\1:'` + val=`echo $val | sed -e 's:[\$]\([a-z_]*\):${\1}:g'` + if test "$autosuffix" = "yes"; then + if echo $val | grep apache >/dev/null; then + addtarget=no + else + addtarget=yes + fi + if test "$addtarget" = "yes"; then + val="$val/apache2" + fi + fi + eval "$var='$val'" + done + changequote([,]) +])dnl + +dnl +dnl APR_ENABLE_LAYOUT(default layout name [, extra vars]) +dnl +AC_DEFUN([APR_ENABLE_LAYOUT], [ +AC_ARG_ENABLE(layout, +[ --enable-layout=LAYOUT],[ + LAYOUT=$enableval +]) + +if test -z "$LAYOUT"; then + LAYOUT="$1" +fi +APR_LAYOUT($srcdir/config.layout, $LAYOUT, $2) + +AC_MSG_CHECKING(for chosen layout) +AC_MSG_RESULT($layout_name) +]) + + +dnl +dnl APR_PARSE_ARGUMENTS +dnl a reimplementation of autoconf's argument parser, +dnl used here to allow us to co-exist layouts and argument based +dnl set ups. +AC_DEFUN([APR_PARSE_ARGUMENTS], [ +ac_prev= +# Retrieve the command-line arguments. The eval is needed because +# the arguments are quoted to preserve accuracy. +eval "set x $ac_configure_args" +shift +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 + + ac_optarg=`expr "x$ac_option" : 'x[[^=]]*=\(.*\)'` + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$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" ;; + + -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" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -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" ;; + + -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" ;; + + esac +done + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [[\\/$]]* | ?:[[\\/]]* | NONE | '' ) ;; + *) AC_MSG_ERROR([expected an absolute path for --$ac_var: $ac_val]);; + esac +done + +])dnl + +dnl +dnl APR_CHECK_DEPEND +dnl +dnl Determine what program we can use to generate .deps-style dependencies +dnl +AC_DEFUN([APR_CHECK_DEPEND], [ +dnl Try to determine what depend program we can use +dnl All GCC-variants should have -MM. +dnl If not, then we can check on those, too. +if test "$GCC" = "yes"; then + MKDEP='$(CC) -MM' +else + rm -f conftest.c +dnl should be available everywhere! + cat > conftest.c < + int main(int argc, const char *argv[]) { return 0; } +EOF + MKDEP="true" + for i in "$CC -MM" "$CC -M" "$CPP -MM" "$CPP -M" "cpp -M"; do + AC_MSG_CHECKING([if $i can create proper make dependencies]) + if $i conftest.c 2>/dev/null | grep 'conftest.o: conftest.c' >/dev/null; then + MKDEP=$i + AC_MSG_RESULT(yes) + break; + fi + AC_MSG_RESULT(no) + done + rm -f conftest.c +fi + +AC_SUBST(MKDEP) +]) + +dnl +dnl APR_CHECK_TYPES_FMT_COMPATIBLE(TYPE-1, TYPE-2, FMT-TAG, +dnl [ACTION-IF-TRUE], [ACTION-IF-FALSE]) +dnl +dnl Try to determine whether two types are the same and accept the given +dnl printf formatter (bare token, e.g. literal d, ld, etc). +dnl +AC_DEFUN([APR_CHECK_TYPES_FMT_COMPATIBLE], [ +define([apr_cvname], apr_cv_typematch_[]translit([$1], [ ], [_])_[]translit([$2], [ ], [_])_[][$3]) +AC_CACHE_CHECK([whether $1 and $2 use fmt %$3], apr_cvname, [ +APR_TRY_COMPILE_NO_WARNING([#include +#include +#ifdef HAVE_STDINT_H +#include +#endif +], [ + $1 chk1, *ptr1; + $2 chk2, *ptr2 = &chk1; + ptr1 = &chk2; + *ptr1 = *ptr2 = 0; + printf("%$3 %$3", chk1, chk2); +], [apr_cvname=yes], [apr_cvname=no])]) +if test "$apr_cvname" = "yes"; then + : + $4 +else + : + $5 +fi +]) + +dnl +dnl APR_CHECK_TYPES_COMPATIBLE(TYPE-1, TYPE-2, [ACTION-IF-TRUE]) +dnl +dnl Try to determine whether two types are the same. Only works +dnl for gcc and icc. +dnl +dnl @deprecated @see APR_CHECK_TYPES_FMT_COMPATIBLE +dnl +AC_DEFUN([APR_CHECK_TYPES_COMPATIBLE], [ +define([apr_cvname], apr_cv_typematch_[]translit([$1], [ ], [_])_[]translit([$2], [ ], [_])) +AC_CACHE_CHECK([whether $1 and $2 are the same], apr_cvname, [ +AC_TRY_COMPILE(AC_INCLUDES_DEFAULT, [ + int foo[0 - !__builtin_types_compatible_p($1, $2)]; +], [apr_cvname=yes +$3], [apr_cvname=no])]) +]) diff --git a/build/binbuild.sh b/build/binbuild.sh new file mode 100755 index 0000000..92fe0a7 --- /dev/null +++ b/build/binbuild.sh @@ -0,0 +1,206 @@ +#!/bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# binbuild.sh - Builds an Apache binary distribution. +# Initially written by Lars Eilebrecht . + +OS=`./build/config.guess` +PRINTPATH="build/PrintPath" +APFULLDIR=`pwd` +BUILD_DIR="$APFULLDIR/bindist" +DEFAULT_DIR="/usr/local/apache2" +APDIR="$APFULLDIR" +APDIR=`basename $APDIR` +CONFIGPARAM="--enable-layout=Apache --prefix=$BUILD_DIR --enable-mods-shared=most --with-expat=$APFULLDIR/srclib/apr-util/xml/expat --enable-static-support" +VER=`echo $APDIR | sed s/httpd-//` +TAR="`$PRINTPATH tar`" +GZIP="`$PRINTPATH gzip`" +COMPRESS="`$PRINTPATH compress`" +MD5="`$PRINTPATH md5`" +if [ x$MD5 = x ]; then + OPENSSL="`$PRINTPATH openssl`" + if [ x$OPENSSL != x ]; then + MD5="$OPENSSL md5" + fi +fi + +if [ x$1 != x ]; then + USER=$1 +else + USER="`build/buildinfo.sh -n %u@%h%d`" +fi + +if [ ! -f ./ABOUT_APACHE ]; then + echo "ERROR: The current directory contains no valid Apache distribution." + echo "Please change the directory to the top level directory of a freshly" + echo "unpacked Apache 2.0 source distribution and re-execute the script" + echo "'./build/binbuild.sh'." + exit 1; +fi + +if [ -d ./CVS ]; then + echo "ERROR: The current directory is a CVS checkout of Apache." + echo "Only a standard Apache 2.0 source distribution should be used to" + echo "create a binary distribution." + exit 1; +fi + +echo "Building Apache $VER binary distribution..." +echo "Platform is \"$OS\"..." + +( echo "Build log for Apache binary distribution" && \ + echo "----------------------------------------------------------------------" && \ + ./configure $CONFIGPARAM && \ + echo "----------------------------------------------------------------------" && \ + make clean && \ + rm -rf bindist install-bindist.sh *.bindist + echo "----------------------------------------------------------------------" && \ + make && \ + echo "----------------------------------------------------------------------" && \ + make install root="bindist/" && \ + echo "----------------------------------------------------------------------" && \ + make clean && \ + echo "----------------------------------------------------------------------" && \ + echo "[EOF]" \ +) 2>&1 | tee build.log + +if [ ! -f ./bindist/bin/httpd ]; then + echo "ERROR: Failed to build Apache. See \"build.log\" for details." + exit 1; +fi + +echo "Binary image successfully created..." + +./bindist/bin/httpd -v + +echo "Creating supplementary files..." + +( echo " " && \ + echo "Apache $VER binary distribution" && \ + echo "================================" && \ + echo " " && \ + echo "This binary distribution is usable on a \"$OS\"" && \ + echo "system and was built by \"$USER\"." && \ + echo "" && \ + echo "The distribution contains all standard Apache modules as shared" && \ + echo "objects. This allows you to enable or disable particular modules" && \ + echo "with the LoadModule/AddModule directives in the configuration file" && \ + echo "without the need to re-compile Apache." && \ + echo "" && \ + echo "See \"INSTALL.bindist\" on how to install the distribution." && \ + echo " " && \ + echo "NOTE: Please do not send support-related mails to the address mentioned" && \ + echo " above or to any member of the Apache Group! Support questions" && \ + echo " should be directed to the forums mentioned at" && \ + echo " http://httpd.apache.org/lists.html#http-users" && \ + echo " where some of the Apache team lurk, in the company of many other" && \ + echo " Apache gurus who should be able to help." && \ + echo " If you think you found a bug in Apache or have a suggestion please" && \ + echo " visit the bug report page at http://httpd.apache.org/bug_report.html" && \ + echo " " && \ + echo "----------------------------------------------------------------------" && \ + ./bindist/bin/httpd -V && \ + echo "----------------------------------------------------------------------" \ +) > README.bindist +cp README.bindist ../httpd-$VER-$OS.README + +( echo " " && \ + echo "Apache $VER binary installation" && \ + echo "================================" && \ + echo " " && \ + echo "To install this binary distribution you have to execute the installation" && \ + echo "script \"install-bindist.sh\" in the top-level directory of the distribution." && \ + echo " " && \ + echo "The script takes the ServerRoot directory into which you want to install" && \ + echo "Apache as an option. If you omit the option the default path" && \ + echo "\"$DEFAULT_DIR\" is used." && \ + echo "Make sure you have write permissions in the target directory, e.g. switch" && \ + echo "to user \"root\" before you execute the script." && \ + echo " " && \ + echo "See \"README.bindist\" for further details about this distribution." && \ + echo " " && \ + echo "Please note that this distribution includes the complete Apache source code." && \ + echo "Therefore you may compile Apache yourself at any time if you have a compiler" && \ + echo "installation on your system." && \ + echo "See \"INSTALL\" for details on how to accomplish this." && \ + echo " " \ +) > INSTALL.bindist + +sed -e "s%\@default_dir\@%$DEFAULT_DIR%" \ + -e "s%\@ver\@%$VER%" \ + -e "s%\@os\@%$OS%" \ + build/install-bindist.sh.in > install-bindist.sh + +chmod 755 install-bindist.sh + +sed -e "s%$BUILD_DIR%$DEFAULT_DIR%" \ + -e "s%^ServerAdmin.*%ServerAdmin you@your.address%" \ + -e "s%#ServerName.*%#ServerName localhost%" \ + bindist/conf/httpd-std.conf > bindist/conf/httpd.conf +cp bindist/conf/httpd.conf bindist/conf/httpd-std.conf + +for one_file in apachectl envvars envvars-std; do + sed -e "s%$BUILD_DIR%$DEFAULT_DIR%" \ + bindist/bin/$one_file > bindist/bin/$one_file.tmp + mv bindist/bin/$one_file.tmp bindist/bin/$one_file +done + +echo "Creating distribution archive and readme file..." + +if [ ".`grep -i error build.log > /dev/null`" != . ]; then + echo "ERROR: Failed to build Apache. See \"build.log\" for details." + exit 1; +else + if [ "x$TAR" != "x" ]; then + case "x$OS" in + x*os390*) $TAR -cfU ../httpd-$VER-$OS.tar -C .. httpd-$VER;; + *) (cd .. && $TAR -cf httpd-$VER-$OS.tar httpd-$VER);; + esac + if [ "x$GZIP" != "x" ]; then + $GZIP -9 ../httpd-$VER-$OS.tar + ARCHIVE=../httpd-$VER-$OS.tar.gz + elif [ "x$COMPRESS" != "x" ]; then + $COMPRESS ../httpd-$VER-$OS.tar + ARCHIVE=../httpd-$VER-$OS.tar.Z + else + echo "WARNING: Could not find a 'gzip' program!" + echo " tar archive is not compressed." + ARCHIVE=../httpd-$VER-$OS.tar + fi + else + echo "ERROR: Could not find a 'tar' program!" + echo " Please execute the following commands manually:" + echo " tar -cf ../httpd-$VER-$OS.tar ." + echo " gzip -9 ../httpd-$VER-$OS.tar" + fi + + if [ "x$MD5" != "x" ]; then + $MD5 $ARCHIVE > $ARCHIVE.md5 + fi + + if [ -f $ARCHIVE ] && [ -f ../httpd-$VER-$OS.README ]; then + echo "Ready." + echo "You can find the binary archive ($ARCHIVE)" + echo "and the readme file (httpd-$VER-$OS.README) in the" + echo "parent directory." + exit 0; + else + echo "ERROR: Archive or README is missing." + exit 1; + fi +fi diff --git a/build/bsd_makefile b/build/bsd_makefile new file mode 100755 index 0000000..b8d8189 --- /dev/null +++ b/build/bsd_makefile @@ -0,0 +1,34 @@ +#! /bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# The build environment was provided by Sascha Schumann. + +# cwd must be top_srcdir +test -f build/bsd_makefile || exit 2 + +test -f bsd_converted && exit 0 + +tmpfile=`mktemp /tmp/bsd_makefile.XXXXXX 2>/dev/null` || tmpfile="tmp.$$" +for i in build/*.mk; do + sed 's/^include \(.*\)/.include "\1"/' $i >$tmpfile \ + && cp $tmpfile $i +done +rm -f $tmpfile + +touch bsd_converted +exit 0 diff --git a/build/build-modules-c.awk b/build/build-modules-c.awk new file mode 100644 index 0000000..68fd83b --- /dev/null +++ b/build/build-modules-c.awk @@ -0,0 +1,82 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +BEGIN { + RS = " " + # the core module must come first + modules[n++] = "core" + pmodules[pn++] = "core" +} +{ + modules[n] = $1; + pmodules[pn] = $1; + gsub("\n","",modules[n]); + gsub("\n","",pmodules[pn]); + ++n; + ++pn; +} +END { + print "/*" + print " * modules.c --- automatically generated by Apache" + print " * configuration script. DO NOT HAND EDIT!!!!!" + print " */" + print "" + print "#include \"ap_config.h\"" + print "#include \"httpd.h\"" + print "#include \"http_config.h\"" + print "" + for (i = 0; i < pn; ++i) { + printf ("extern module %s_module;\n", pmodules[i]) + } + print "" + print "/*" + print " * Modules which implicitly form the" + print " * list of activated modules on startup," + print " * i.e. these are the modules which are" + print " * initially linked into the Apache processing" + print " * [extendable under run-time via AddModule]" + print " */" + print "module *ap_prelinked_modules[] = {" + for (i = 0 ; i < n; ++i) { + printf " &%s_module,\n", modules[i] + } + print " NULL" + print "};" + print "" + print "/*" + print " * We need the symbols as strings for containers" + print " */" + print "" + print "ap_module_symbol_t ap_prelinked_module_symbols[] = {" + for (i = 0; i < n; ++i) { + printf (" {\"%s_module\", &%s_module},\n", modules[i], modules[i]) + } + print " {NULL, NULL}" + print "};" + print "" + print "/*" + print " * Modules which initially form the" + print " * list of available modules on startup," + print " * i.e. these are the modules which are" + print " * initially loaded into the Apache process" + print " * [extendable under run-time via LoadModule]" + print " */" + print "module *ap_preloaded_modules[] = {" + for (i = 0; i < pn; ++i) { + printf " &%s_module,\n", pmodules[i] + } + print " NULL" + print "};" + print "" +} diff --git a/build/buildinfo.sh b/build/buildinfo.sh new file mode 100755 index 0000000..e18d0a8 --- /dev/null +++ b/build/buildinfo.sh @@ -0,0 +1,171 @@ +#!/bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# buildinfo.sh -- Determine Build Information +# Initially written by Ralf S. Engelschall +# for the Apache's Autoconf-style Interface (APACI) + +# +# argument line handling +# +error=no +if [ $# -ne 1 -a $# -ne 2 ]; then + error=yes +fi +if [ $# -eq 2 -a "x$1" != "x-n" ]; then + error=yes +fi +if [ "x$error" = "xyes" ]; then + echo "$0:Error: invalid argument line" + echo "$0:Usage: $0 [-n] " + echo "Where can contain:" + echo " %u ...... substituted by determined username (foo)" + echo " %h ...... substituted by determined hostname (bar)" + echo " %d ...... substituted by determined domainname (.com)" + echo " %D ...... substituted by determined day (DD)" + echo " %M ...... substituted by determined month (MM)" + echo " %Y ...... substituted by determined year (YYYYY)" + echo " %m ...... substituted by determined monthname (Jan)" + exit 1 +fi +if [ $# -eq 2 ]; then + newline=no + format_string="$2" +else + newline=yes + format_string="$1" +fi + +# +# initialization +# +username='' +hostname='' +domainname='' +time_day='' +time_month='' +time_year='' +time_monthname='' + +# +# determine username +# +username="$LOGNAME" +if [ "x$username" = "x" ]; then + username="$USER" + if [ "x$username" = "x" ]; then + username="`(whoami) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ "x$username" = "x" ]; then + username="`(who am i) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ "x$username" = "x" ]; then + username='unknown' + fi + fi + fi +fi + +# +# determine hostname and domainname +# +hostname="`(uname -n) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" +if [ "x$hostname" = "x" ]; then + hostname="`(hostname) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ "x$hostname" = "x" ]; then + hostname='unknown' + fi +fi +case $hostname in + *.* ) + domainname=".`echo $hostname | cut -d. -f2-`" + hostname="`echo $hostname | cut -d. -f1`" + ;; +esac +if [ "x$domainname" = "x" ]; then + if [ -f /etc/resolv.conf ]; then + domainname="`egrep '^[ ]*domain' /etc/resolv.conf | head -1 |\ + sed -e 's/.*domain//' \ + -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ + -e 's/^\.//' -e 's/^/./' |\ + awk '{ printf("%s", $1); }'`" + if [ "x$domainname" = "x" ]; then + domainname="`egrep '^[ ]*search' /etc/resolv.conf | head -1 |\ + sed -e 's/.*search//' \ + -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ + -e 's/ .*//' -e 's/ .*//' \ + -e 's/^\.//' -e 's/^/./' |\ + awk '{ printf("%s", $1); }'`" + fi + fi +fi + +# +# determine current time +# +time_day="`date '+%d' | awk '{ printf("%s", $1); }'`" +time_month="`date '+%m' | awk '{ printf("%s", $1); }'`" +time_year="`date '+%Y' 2>/dev/null | awk '{ printf("%s", $1); }'`" +if [ "x$time_year" = "x" ]; then + time_year="`date '+%y' | awk '{ printf("%s", $1); }'`" + case $time_year in + [5-9][0-9]) time_year="19$time_year" ;; + [0-4][0-9]) time_year="20$time_year" ;; + esac +fi +case $time_month in + 1|01) time_monthname='Jan' ;; + 2|02) time_monthname='Feb' ;; + 3|03) time_monthname='Mar' ;; + 4|04) time_monthname='Apr' ;; + 5|05) time_monthname='May' ;; + 6|06) time_monthname='Jun' ;; + 7|07) time_monthname='Jul' ;; + 8|08) time_monthname='Aug' ;; + 9|09) time_monthname='Sep' ;; + 10) time_monthname='Oct' ;; + 11) time_monthname='Nov' ;; + 12) time_monthname='Dec' ;; +esac + +# +# create result string +# +if [ "x$newline" = "xyes" ]; then + echo $format_string |\ + sed -e "s;%u;$username;g" \ + -e "s;%h;$hostname;g" \ + -e "s;%d;$domainname;g" \ + -e "s;%D;$time_day;g" \ + -e "s;%M;$time_month;g" \ + -e "s;%Y;$time_year;g" \ + -e "s;%m;$time_monthname;g" +else + echo "${format_string}&" |\ + sed -e "s;%u;$username;g" \ + -e "s;%h;$hostname;g" \ + -e "s;%d;$domainname;g" \ + -e "s;%D;$time_day;g" \ + -e "s;%M;$time_month;g" \ + -e "s;%Y;$time_year;g" \ + -e "s;%m;$time_monthname;g" |\ + awk '-F&' '{ printf("%s", $1); }' +fi + diff --git a/build/config-stubs b/build/config-stubs new file mode 100755 index 0000000..3cc6991 --- /dev/null +++ b/build/config-stubs @@ -0,0 +1,27 @@ +#!/bin/sh + +# +# Find all config files (config*.m4) and map them into lines with the +# form: NUM? '0' ' ' PATH +# +# For example: +# +# 50 ./modules/generators/config5.m4 +# 0 ./modules/aaa/config.m4 +# 10 ./example/config1.m4 +# +# These lines are sorted, then the first field is removed. Thus, we +# have a set of paths sorted on the config-number (if present). All +# config files without a number are sorted before those with a number. +# + +configfiles=`find os server modules support -name "config*.m4" | \ + sed 's#\(.*/config\)\(.*\).m4#\20 \1\2.m4#' | \ + sort | \ + sed 's#.* ##'` + +for configfile in $configfiles; do + if [ -r $configfile ]; then + echo "sinclude($configfile)" + fi +done diff --git a/build/config.guess b/build/config.guess new file mode 100755 index 0000000..f6d217a --- /dev/null +++ b/build/config.guess @@ -0,0 +1,1812 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2024 Free Software Foundation, Inc. + +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2024-01-01' + +# 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT 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 . +# +# 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. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess +# +# Please send patches to . + + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system '$me' is run on. + +Options: + -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 ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2024 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 + +# Just in case it came from the environment. +GUESS= + +# 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. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039,SC3028 + { 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" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD=$driver + 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 +} + +# 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 ; 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 + +case $UNAME_SYSTEM in +Linux|GNU|GNU/*) + LIBC=unknown + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #if defined(__ANDROID__) + LIBC=android + #else + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #elif defined(__GLIBC__) + LIBC=gnu + #elif defined(__LLVM_LIBC__) + LIBC=llvm + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif + #endif + #endif + EOF + cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + eval "$cc_set_libc" + + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu + fi + ;; +esac + +# 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". + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + echo unknown)` + case $UNAME_MACHINE_ARCH in + aarch64eb) machine=aarch64_be-unknown ;; + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-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) and ABI. + case $UNAME_MACHINE_ARCH in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + 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 + # Determine ABI tags. + case $UNAME_MACHINE_ARCH in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + 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/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + GUESS=$machine-${os}${release}${abi-} + ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE + ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE + ;; + *:SecBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE + ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE + ;; + *:MidnightBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE + ;; + *:ekkoBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE + ;; + *:SolidBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE + ;; + *:OS108:*:*) + GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE + ;; + macppc:MirBSD:*:*) + GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE + ;; + *:MirBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE + ;; + *:Sortix:*:*) + GUESS=$UNAME_MACHINE-unknown-sortix + ;; + *:Twizzler:*:*) + GUESS=$UNAME_MACHINE-unknown-twizzler + ;; + *:Redox:*:*) + GUESS=$UNAME_MACHINE-unknown-redox + ;; + mips:OSF1:*.*) + GUESS=mips-dec-osf1 + ;; + alpha:OSF1:*:*) + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + trap '' 0 + 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. + OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + GUESS=$UNAME_MACHINE-dec-osf$OSF_REL + ;; + Amiga*:UNIX_System_V:4.0:*) + GUESS=m68k-unknown-sysv4 + ;; + *:[Aa]miga[Oo][Ss]:*:*) + GUESS=$UNAME_MACHINE-unknown-amigaos + ;; + *:[Mm]orph[Oo][Ss]:*:*) + GUESS=$UNAME_MACHINE-unknown-morphos + ;; + *:OS/390:*:*) + GUESS=i370-ibm-openedition + ;; + *:z/VM:*:*) + GUESS=s390-ibm-zvmoe + ;; + *:OS400:*:*) + GUESS=powerpc-ibm-os400 + ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + GUESS=arm-acorn-riscix$UNAME_RELEASE + ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + GUESS=arm-unknown-riscos + ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + GUESS=hppa1.1-hitachi-hiuxmpp + ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + case `(/bin/universe) 2>/dev/null` in + att) GUESS=pyramid-pyramid-sysv3 ;; + *) GUESS=pyramid-pyramid-bsd ;; + esac + ;; + NILE*:*:*:dcosx) + GUESS=pyramid-pyramid-svr4 + ;; + DRS?6000:unix:4.0:6*) + GUESS=sparc-icl-nx6 + ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) GUESS=sparc-icl-nx7 ;; + esac + ;; + s390x:SunOS:*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL + ;; + sun4H:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-hal-solaris2$SUN_REL + ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris2$SUN_REL + ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + GUESS=i386-pc-auroraux$UNAME_RELEASE + ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + 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 test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$SUN_ARCH-pc-solaris2$SUN_REL + ;; + 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. + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris3$SUN_REL + ;; + 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'. + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` + GUESS=sparc-sun-sunos$SUN_REL + ;; + sun3*:SunOS:*:*) + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; + 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) + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; + sun4) + GUESS=sparc-sun-sunos$UNAME_RELEASE + ;; + esac + ;; + aushp:SunOS:*:*) + GUESS=sparc-auspex-sunos$UNAME_RELEASE + ;; + # 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:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + GUESS=m68k-milan-mint$UNAME_RELEASE + ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + GUESS=m68k-hades-mint$UNAME_RELEASE + ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + GUESS=m68k-unknown-mint$UNAME_RELEASE + ;; + m68k:machten:*:*) + GUESS=m68k-apple-machten$UNAME_RELEASE + ;; + powerpc:machten:*:*) + GUESS=powerpc-apple-machten$UNAME_RELEASE + ;; + RISC*:Mach:*:*) + GUESS=mips-dec-mach_bsd4.3 + ;; + RISC*:ULTRIX:*:*) + GUESS=mips-dec-ultrix$UNAME_RELEASE + ;; + VAX*:ULTRIX*:*:*) + GUESS=vax-dec-ultrix$UNAME_RELEASE + ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + GUESS=clipper-intergraph-clix$UNAME_RELEASE + ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* 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; } + GUESS=mips-mips-riscos$UNAME_RELEASE + ;; + Motorola:PowerMAX_OS:*:*) + GUESS=powerpc-motorola-powermax + ;; + Motorola:*:4.3:PL8-*) + GUESS=powerpc-harris-powermax + ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + GUESS=powerpc-harris-powermax + ;; + Night_Hawk:Power_UNIX:*:*) + GUESS=powerpc-harris-powerunix + ;; + m88k:CX/UX:7*:*) + GUESS=m88k-harris-cxux7 + ;; + m88k:*:4*:R4*) + GUESS=m88k-motorola-sysv4 + ;; + m88k:*:3*:R3*) + GUESS=m88k-motorola-sysv3 + ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 + then + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x + then + GUESS=m88k-dg-dgux$UNAME_RELEASE + else + GUESS=m88k-dg-dguxbcs$UNAME_RELEASE + fi + else + GUESS=i586-dg-dgux$UNAME_RELEASE + fi + ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + GUESS=m88k-dolphin-sysv3 + ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + GUESS=m88k-motorola-sysv3 + ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + GUESS=m88k-tektronix-sysv3 + ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + GUESS=m68k-tektronix-bsd + ;; + *:IRIX*:*:*) + IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` + GUESS=mips-sgi-irix$IRIX_REL + ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id + ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + GUESS=i386-ibm-aix + ;; + ia64:AIX:*:*) + if test -x /usr/bin/oslevel ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE + fi + GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV + ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + + 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 + GUESS=$SYSTEM_NAME + else + GUESS=rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + GUESS=rs6000-ibm-aix3.2.4 + else + GUESS=rs6000-ibm-aix3.2 + fi + ;; + *: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 test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE + fi + GUESS=$IBM_ARCH-ibm-aix$IBM_REV + ;; + *:AIX:*:*) + GUESS=rs6000-ibm-aix + ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + GUESS=romp-ibm-bsd4.4 + ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to + ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + GUESS=rs6000-bull-bosx + ;; + DPX/2?00:B.O.S.:*:*) + GUESS=m68k-bull-sysv3 + ;; + 9000/[34]??:4.3bsd:1.*:*) + GUESS=m68k-hp-bsd + ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + GUESS=m68k-hp-bsd4.4 + ;; + 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 test -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 test "$HP_ARCH" = ""; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if test "$HP_ARCH" = hppa2.0w + then + 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 + GUESS=$HP_ARCH-hp-hpux$HPUX_REV + ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + GUESS=ia64-hp-hpux$HPUX_REV + ;; + 3050*:HI-UX:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + GUESS=unknown-hitachi-hiuxwe2 + ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + GUESS=hppa1.1-hp-bsd + ;; + 9000/8??:4.3bsd:*:*) + GUESS=hppa1.0-hp-bsd + ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + GUESS=hppa1.0-hp-mpeix + ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + GUESS=hppa1.1-hp-osf + ;; + hp8??:OSF1:*:*) + GUESS=hppa1.0-hp-osf + ;; + i*86:OSF1:*:*) + if test -x /usr/sbin/sysversion ; then + GUESS=$UNAME_MACHINE-unknown-osf1mk + else + GUESS=$UNAME_MACHINE-unknown-osf1 + fi + ;; + parisc*:Lites*:*:*) + GUESS=hppa1.1-hp-lites + ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + GUESS=c1-convex-bsd + ;; + 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*:*) + GUESS=c34-convex-bsd + ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + GUESS=c38-convex-bsd + ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + GUESS=c4-convex-bsd + ;; + CRAY*Y-MP:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=ymp-cray-unicos$CRAY_REL + ;; + 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:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=t90-cray-unicos$CRAY_REL + ;; + CRAY*T3E:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=alphaev5-cray-unicosmk$CRAY_REL + ;; + CRAY*SV1:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=sv1-cray-unicos$CRAY_REL + ;; + *:UNICOS/mp:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=craynv-cray-unicosmp$CRAY_REL + ;; + 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/ /_/'` + GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; + 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/ /_/'` + GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE + ;; + sparc*:BSD/OS:*:*) + GUESS=sparc-unknown-bsdi$UNAME_RELEASE + ;; + *:BSD/OS:*:*) + GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE + ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi + else + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf + fi + ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL + ;; + i*:CYGWIN*:*) + GUESS=$UNAME_MACHINE-pc-cygwin + ;; + *:MINGW64*:*) + GUESS=$UNAME_MACHINE-pc-mingw64 + ;; + *:MINGW*:*) + GUESS=$UNAME_MACHINE-pc-mingw32 + ;; + *:MSYS*:*) + GUESS=$UNAME_MACHINE-pc-msys + ;; + i*:PW*:*) + GUESS=$UNAME_MACHINE-pc-pw32 + ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; + *:Interix*:*) + case $UNAME_MACHINE in + x86) + GUESS=i586-pc-interix$UNAME_RELEASE + ;; + authenticamd | genuineintel | EM64T) + GUESS=x86_64-unknown-interix$UNAME_RELEASE + ;; + IA64) + GUESS=ia64-unknown-interix$UNAME_RELEASE + ;; + esac ;; + i*:UWIN*:*) + GUESS=$UNAME_MACHINE-pc-uwin + ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + GUESS=x86_64-pc-cygwin + ;; + prep*:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=powerpcle-unknown-solaris2$SUN_REL + ;; + *:GNU:*:*) + # the GNU system + GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` + GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL + ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC + ;; + x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-pc-managarm-mlibc" + ;; + *:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-unknown-managarm-mlibc" + ;; + *:Minix:*:*) + GUESS=$UNAME_MACHINE-unknown-minix + ;; + aarch64:Linux:*:*) + set_cc_for_build + CPU=$UNAME_MACHINE + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __ARM_EABI__ + #ifdef __ARM_PCS_VFP + ABI=eabihf + #else + ABI=eabi + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;; + esac + fi + GUESS=$CPU-unknown-linux-$LIBCABI + ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` 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=gnulibc1 ; fi + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi + else + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf + fi + fi + ;; + avr32*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + cris:Linux:*:*) + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + crisv32:Linux:*:*) + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + e2k:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + frv:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + hexagon:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + i*86:Linux:*:*) + GUESS=$UNAME_MACHINE-pc-linux-$LIBC + ;; + ia64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + k1om:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + kvx:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + kvx:cos:*:*) + GUESS=$UNAME_MACHINE-unknown-cos + ;; + kvx:mbr:*:*) + GUESS=$UNAME_MACHINE-unknown-mbr + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + m32r*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + m68*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` + eval "$cc_set_vars" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + openrisc*:Linux:*:*) + GUESS=or1k-unknown-linux-$LIBC + ;; + or32:Linux:*:* | or1k*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + padre:Linux:*:*) + GUESS=sparc-unknown-linux-$LIBC + ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + GUESS=hppa64-unknown-linux-$LIBC + ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; + PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; + *) GUESS=hppa-unknown-linux-$LIBC ;; + esac + ;; + ppc64:Linux:*:*) + GUESS=powerpc64-unknown-linux-$LIBC + ;; + ppc:Linux:*:*) + GUESS=powerpc-unknown-linux-$LIBC + ;; + ppc64le:Linux:*:*) + GUESS=powerpc64le-unknown-linux-$LIBC + ;; + ppcle:Linux:*:*) + GUESS=powerpcle-unknown-linux-$LIBC + ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + s390:Linux:*:* | s390x:Linux:*:*) + GUESS=$UNAME_MACHINE-ibm-linux-$LIBC + ;; + sh64*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + sh*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + tile*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + vax:Linux:*:*) + GUESS=$UNAME_MACHINE-dec-linux-$LIBC + ;; + x86_64:Linux:*:*) + set_cc_for_build + CPU=$UNAME_MACHINE + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __i386__ + ABI=x86 + #else + #ifdef __ILP32__ + ABI=x32 + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + x86) CPU=i686 ;; + x32) LIBCABI=${LIBC}x32 ;; + esac + fi + GUESS=$CPU-pc-linux-$LIBCABI + ;; + xtensa*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + 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. + GUESS=i386-sequent-sysv4 + ;; + 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. + GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION + ;; + i*86:OS/2:*:*) + # If we were able to find 'uname', then EMX Unix compatibility + # is probably installed. + GUESS=$UNAME_MACHINE-pc-os2-emx + ;; + i*86:XTS-300:*:STOP) + GUESS=$UNAME_MACHINE-unknown-stop + ;; + i*86:atheos:*:*) + GUESS=$UNAME_MACHINE-unknown-atheos + ;; + i*86:syllable:*:*) + GUESS=$UNAME_MACHINE-pc-syllable + ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + GUESS=i386-unknown-lynxos$UNAME_RELEASE + ;; + i*86:*DOS:*:*) + GUESS=$UNAME_MACHINE-pc-msdosdjgpp + ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL + else + GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL + fi + ;; + 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 + GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|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 + GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL + else + GUESS=$UNAME_MACHINE-pc-sysv32 + fi + ;; + 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 configure will decide that + # this is a cross-build. + GUESS=i586-pc-msdosdjgpp + ;; + Intel:Mach:3*:*) + GUESS=i386-pc-mach3 + ;; + paragon:*:*:*) + GUESS=i860-intel-osf1 + ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 + fi + ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + GUESS=m68010-convergent-sysv + ;; + mc68k:UNIX:SYSTEM5:3.51m) + GUESS=m68k-convergent-sysv + ;; + M680?0:D-NIX:5.3:*) + GUESS=m68k-diab-dnix + ;; + 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*:*) + GUESS=m68k-unknown-lynxos$UNAME_RELEASE + ;; + mc68030:UNIX_System_V:4.*:*) + GUESS=m68k-atari-sysv4 + ;; + TSUNAMI:LynxOS:2.*:*) + GUESS=sparc-unknown-lynxos$UNAME_RELEASE + ;; + rs6000:LynxOS:2.*:*) + GUESS=rs6000-unknown-lynxos$UNAME_RELEASE + ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + GUESS=powerpc-unknown-lynxos$UNAME_RELEASE + ;; + SM[BE]S:UNIX_SV:*:*) + GUESS=mips-dde-sysv$UNAME_RELEASE + ;; + RM*:ReliantUNIX-*:*:*) + GUESS=mips-sni-sysv4 + ;; + RM*:SINIX-*:*:*) + GUESS=mips-sni-sysv4 + ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + GUESS=$UNAME_MACHINE-sni-sysv4 + else + GUESS=ns32k-sni-sysv + fi + ;; + PENTIUM:*:4.0*:*) # Unisys 'ClearPath HMP IX 4000' SVR4/MP effort + # says + GUESS=i586-unisys-sysv4 + ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + GUESS=hppa1.1-stratus-sysv4 + ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + GUESS=i860-stratus-sysv4 + ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + GUESS=$UNAME_MACHINE-stratus-vos + ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + GUESS=hppa1.1-stratus-vos + ;; + mc68*:A/UX:*:*) + GUESS=m68k-apple-aux$UNAME_RELEASE + ;; + news*:NEWS-OS:6*:*) + GUESS=mips-sony-newsos6 + ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if test -d /usr/nec; then + GUESS=mips-nec-sysv$UNAME_RELEASE + else + GUESS=mips-unknown-sysv$UNAME_RELEASE + fi + ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + GUESS=powerpc-be-beos + ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + GUESS=powerpc-apple-beos + ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + GUESS=i586-pc-beos + ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + GUESS=i586-pc-haiku + ;; + ppc:Haiku:*:*) # Haiku running on Apple PowerPC + GUESS=powerpc-apple-haiku + ;; + *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) + GUESS=$UNAME_MACHINE-unknown-haiku + ;; + SX-4:SUPER-UX:*:*) + GUESS=sx4-nec-superux$UNAME_RELEASE + ;; + SX-5:SUPER-UX:*:*) + GUESS=sx5-nec-superux$UNAME_RELEASE + ;; + SX-6:SUPER-UX:*:*) + GUESS=sx6-nec-superux$UNAME_RELEASE + ;; + SX-7:SUPER-UX:*:*) + GUESS=sx7-nec-superux$UNAME_RELEASE + ;; + SX-8:SUPER-UX:*:*) + GUESS=sx8-nec-superux$UNAME_RELEASE + ;; + SX-8R:SUPER-UX:*:*) + GUESS=sx8r-nec-superux$UNAME_RELEASE + ;; + SX-ACE:SUPER-UX:*:*) + GUESS=sxace-nec-superux$UNAME_RELEASE + ;; + Power*:Rhapsody:*:*) + GUESS=powerpc-apple-rhapsody$UNAME_RELEASE + ;; + *:Rhapsody:*:*) + GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE + ;; + arm64:Darwin:*:*) + GUESS=aarch64-apple-darwin$UNAME_RELEASE + ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if test "$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 + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE + ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE + ;; + *:QNX:*:4*) + GUESS=i386-pc-qnx + ;; + NEO-*:NONSTOP_KERNEL:*:*) + GUESS=neo-tandem-nsk$UNAME_RELEASE + ;; + NSE-*:NONSTOP_KERNEL:*:*) + GUESS=nse-tandem-nsk$UNAME_RELEASE + ;; + NSR-*:NONSTOP_KERNEL:*:*) + GUESS=nsr-tandem-nsk$UNAME_RELEASE + ;; + NSV-*:NONSTOP_KERNEL:*:*) + GUESS=nsv-tandem-nsk$UNAME_RELEASE + ;; + NSX-*:NONSTOP_KERNEL:*:*) + GUESS=nsx-tandem-nsk$UNAME_RELEASE + ;; + *:NonStop-UX:*:*) + GUESS=mips-compaq-nonstopux + ;; + BS2000:POSIX*:*:*) + GUESS=bs2000-siemens-sysv + ;; + DS/*:UNIX_System_V:*:*) + GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE + ;; + *: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 + elif test "x${cputype-}" != x; then + UNAME_MACHINE=$cputype + fi + GUESS=$UNAME_MACHINE-unknown-plan9 + ;; + *:TOPS-10:*:*) + GUESS=pdp10-unknown-tops10 + ;; + *:TENEX:*:*) + GUESS=pdp10-unknown-tenex + ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + GUESS=pdp10-dec-tops20 + ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + GUESS=pdp10-xkl-tops20 + ;; + *:TOPS-20:*:*) + GUESS=pdp10-unknown-tops20 + ;; + *:ITS:*:*) + GUESS=pdp10-unknown-its + ;; + SEI:*:*:SEIUX) + GUESS=mips-sei-seiux$UNAME_RELEASE + ;; + *:DragonFly:*:*) + DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL + ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case $UNAME_MACHINE in + A*) GUESS=alpha-dec-vms ;; + I*) GUESS=ia64-dec-vms ;; + V*) GUESS=vax-dec-vms ;; + esac ;; + *:XENIX:*:SysV) + GUESS=i386-pc-xenix + ;; + i*86:skyos:*:*) + SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` + GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL + ;; + i*86:rdos:*:*) + GUESS=$UNAME_MACHINE-pc-rdos + ;; + i*86:Fiwix:*:*) + GUESS=$UNAME_MACHINE-pc-fiwix + ;; + *:AROS:*:*) + GUESS=$UNAME_MACHINE-unknown-aros + ;; + x86_64:VMkernel:*:*) + GUESS=$UNAME_MACHINE-unknown-esx + ;; + amd64:Isilon\ OneFS:*:*) + GUESS=x86_64-unknown-onefs + ;; + *:Unleashed:*:*) + GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE + ;; + *:Ironclad:*:*) + GUESS=$UNAME_MACHINE-unknown-ironclad + ;; +esac + +# Do we have a guess based on uname results? +if test "x$GUESS" != x; then + echo "$GUESS" + exit +fi + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (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 +#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 +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#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; } + +echo "$0: unable to guess system type" >&2 + +case $UNAME_MACHINE:$UNAME_SYSTEM in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 <&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 +fi + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/build/config.sub b/build/config.sub new file mode 100755 index 0000000..2c6a07a --- /dev/null +++ b/build/config.sub @@ -0,0 +1,1971 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2024 Free Software Foundation, Inc. + +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2024-01-01' + +# 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT 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 . +# +# 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. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# 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: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub + +# 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. + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -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 ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2024 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 ;; + + *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 + +# Split fields of configuration type +# shellcheck disable=SC2162 +saved_IFS=$IFS +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \ + | windows-* ) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + zephyr*) + basic_machine=$field1-unknown + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | 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* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # 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) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if test x"$basic_os" != x +then + +# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just +# set os. +obj= +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` + ;; + os2-emx) + kernel=os2 + os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` + ;; + nto-qnx*) + kernel=nto + os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read kernel os <&2 + fi + ;; + *) + echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 + exit 1 + ;; +esac + +case $obj in + aout* | coff* | elf* | pe*) + ;; + '') + # empty is fine + ;; + *) + echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 + exit 1 + ;; +esac + +# Here we handle the constraint that a (synthetic) cpu and os are +# valid only in combination with each other and nowhere else. +case $cpu-$os in + # The "javascript-unknown-ghcjs" triple is used by GHC; we + # accept it here in order to tolerate that, but reject any + # variations. + javascript-ghcjs) + ;; + javascript-* | *-ghcjs) + echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os-$obj in + linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \ + | linux-mlibc*- | linux-musl*- | linux-newlib*- \ + | linux-relibc*- | linux-uclibc*- ) + ;; + uclinux-uclibc*- ) + ;; + managarm-mlibc*- | managarm-kernel*- ) + ;; + windows*-msvc*-) + ;; + -dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \ + | -uclibc*- ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 + exit 1 + ;; + -kernel*- ) + echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 + exit 1 + ;; + *-kernel*- ) + echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 + exit 1 + ;; + *-msvc*- ) + echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 + exit 1 + ;; + kfreebsd*-gnu*- | kopensolaris*-gnu*-) + ;; + vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) + ;; + nto-qnx*-) + ;; + os2-emx-) + ;; + *-eabi*- | *-gnueabi*-) + ;; + none--*) + # None (no kernel, i.e. freestanding / bare metal), + # can be paired with an machine code file format + ;; + -*-) + # Blank kernel with real OS is always fine. + ;; + --*) + # Blank kernel and OS with real machine code file format is always fine. + ;; + *-*-*) + echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 + exit 1 + ;; +esac + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $cpu-$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 + ;; + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) + vendor=ibm + ;; + s390-* | s390x-*) + 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 + ;; +esac + +echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/build/config_vars.sh.in b/build/config_vars.sh.in new file mode 100644 index 0000000..6525a4e --- /dev/null +++ b/build/config_vars.sh.in @@ -0,0 +1,78 @@ +#! @SHELL@ +# -*- sh -*- +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# config_vars.sh is generated by configure, and is run by the "install-build" +# target to generate a version of config_vars.mk which is suitable to be +# installed. Such a file cannot be generated at configure-time, since it +# requires the output of the *installed* ap*-config scripts. + +# For a DESTDIR=... installation using the bundled copies of +# apr/apr-util, the installed ap?-config scripts must be found +# in the DESTDIR-relocated install tree. For a DESTDIR=... +# installation when using *external* copies of apr/apr-util, +# the absolute path must be used, not DESTDIR-relocated. + +if test -f ${DESTDIR}@APR_CONFIG@; then + APR_CONFIG=${DESTDIR}@APR_CONFIG@ + APU_CONFIG=${DESTDIR}@APU_CONFIG@ +else + APR_CONFIG=@APR_CONFIG@ + APU_CONFIG=@APU_CONFIG@ +fi + +APR_LIBTOOL="`${APR_CONFIG} --apr-libtool`" +APR_INCLUDEDIR="`${APR_CONFIG} --includedir`" +test -n "@APU_CONFIG@" && APU_INCLUDEDIR="`${APU_CONFIG} --includedir`" + +installbuilddir="@exp_installbuilddir@" + +exec sed " +/^[A-Z0-9_]*_LDADD/d +/MPM_LIB/d +/APACHECTL_ULIMIT/d +/[a-z]*_LTFLAGS/d +/^MPM_MODULES/d +/^ENABLED_MPM_MODULE/d +/^DSO_MODULES/d +/^MODULE_/d +/^PORT/d +/^SSLPORT/d +/^nonssl_/d +/^CORE_IMPLIB/d +/^rel_/d +/^abs_srcdir/d +/^BUILTIN_LIBS/d +/^[A-Z]*_SHARED_CMDS/d +/^shared_build/d +/^OS_DIR/d +/^AP_LIBS/d +/^OS_SPECIFIC_VARS/d +/^MPM_SUBDIRS/d +/^EXTRA_INCLUDES/{ + s, = , = -I\$(includedir) , + s, -I\$(top_srcdir)/[^ ]*,,g + s, -I\$(top_builddir)/[^ ]*,,g +} +/^MKINSTALLDIRS/s,\$(abs_srcdir)/build,$installbuilddir, +/^INSTALL /s,\$(abs_srcdir)/build,$installbuilddir, +/^HTTPD_LDFLAGS/d +/^UTIL_LDFLAGS/d +/^APR_INCLUDEDIR.*$/s,.*,APR_INCLUDEDIR = ${APR_INCLUDEDIR}, +/^APU_INCLUDEDIR.*$/s,.*,APU_INCLUDEDIR = ${APU_INCLUDEDIR}, +/^LIBTOOL.*$/s,/[^ ]*/libtool \(.*\),${APR_LIBTOOL} @LTFLAGS@, +" diff --git a/build/cpR_noreplace.pl b/build/cpR_noreplace.pl new file mode 100644 index 0000000..054f572 --- /dev/null +++ b/build/cpR_noreplace.pl @@ -0,0 +1,71 @@ +#!/usr/bin/perl -w +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +use strict; +use File::Basename; +use File::Copy; +use File::Find; +use File::Path qw(mkpath); + +require 5.010; + +my $srcdir; +my $destdir; + +sub process_file { + return if $_ =~ /^\./; + + my $rel_to_srcdir = substr($File::Find::name, length($srcdir)); + my $destfile = "$destdir$rel_to_srcdir"; + + if (-d $File::Find::name) { + # If the directory is empty, it won't get created. + # Otherwise it will get created when copying a file. + } + else { + if (-f $destfile) { + # Preserve it. + } + else { + # Create it. + my $dir = dirname($destfile); + if (! -e $dir) { + mkpath($dir) or die "Failed to create directory $dir: $!"; + } + copy($File::Find::name, $destfile) or die "Copy $File::Find::name->$destfile failed: $!"; + } + } +} + +$srcdir = shift; +$destdir = shift; +if (scalar(@ARGV) > 0) { + my $mode = shift; + if ($mode eq "ifdestmissing") { + # Normally the check for possible overwrite is performed on a + # file-by-file basis. If "ifdestmissing" is specified and the + # destination directory exists, bail out. + if (-d $destdir) { + print "[PRESERVING EXISTING SUBDIR $destdir]\n"; + exit(0); + } + } + else { + die "bad mode $mode"; + } +} +find(\&process_file, ($srcdir)); diff --git a/build/default.pl b/build/default.pl new file mode 100644 index 0000000..4a73b77 --- /dev/null +++ b/build/default.pl @@ -0,0 +1,496 @@ +<< +# Scandoc template file. +# +# This is an example set of templates that is designed to create several +# different kinds of index files. It generates a "master index" which intended +# for use with a frames browser; A "package index" which is the root page of +# the index, and then "package files" containing documentation for all of the +# classes within a single package. + +###################################################################### + +## For quick and superficial customization, +## simply change these variables + +$project_name = '[Apache]'; +$company_logo = ''; # change this to an image tag. +$copyright = '© 2000 [Apache Software Foundation]'; +$image_directory = "../images/"; +$bullet1_image = $image_directory . "ball1.gif"; +$bullet2_image = $image_directory . "ball2.gif"; +$bgcolor1 = "#FFFFFF"; +$bgcolor2 = "#FFFFFF"; + +###################################################################### + +## Begin generating frame index file. + +file "index.html"; +>> + + + $project_name + + + + + + <body bgcolor="$bgcolor2" stylesrc="index.html"> + <p>Some Documentation</p> + </body> + + + +<< + +###################################################################### + +## Begin generating master index file (left-hand frame). + +file "master.html"; +>> + + Master Index + + +
+

+ Master Index +

+

+ + +<< + +## For each package, generate an index entry. + +foreach $p (packages()) { + $_ = $p->url; + s/\s/%20/g; + >>$(p.name)
+

+ << + foreach $e ($p->classes()) { + $_ = $e->url; + s/\s/%20/g; + >>
  • $(e.fullname) + << + } + foreach $e ($p->globals()) { + $_ = $e->url; + s/\s/%20/g; + >>
  • $(e.fullname) + << + } + >>
  • << +} + +>> + To-Do List
    +
    +
    +

    + + +<< + +###################################################################### + +## Begin generating package index file + +file "packages.html"; +>> + + $project_name -- Packages + + + +
    $company_logo +

    Documentation for $project_name

    +
    +

    Package List

    +<< + +## For each package, generate an index entry. + +foreach $p (packages()) { + $_ = $p->url; + s/\s/%20/g; + >>$(p.name)
    + << +} + +>> +

    +


    + $copyright
    + Generated by ScanDoc $majorVersion.$minorVersion
    + Last Updated: $date
    + + + +<< + +###################################################################### + +## Generate "To-do list" + +file "to-do.html"; +>> + + $project_name -- To-Do list + + + + $company_logo + +

    To-do list for $project_name

    +<< + +if (&todolistFiles()) { + >>

    + << + foreach $f (&todolistFiles()) { + my @m = &todolistEntries( $f ); + if ($f =~ /([^\/]+)$/) { $f = $1; } + >>$f:

      + << + foreach $text (@m) { + if ($text) { + print "
    • ", &processDescription( $text ), "\n"; + } + } + >>
    + << + } +} + +>> +
    + $copyright
    + Generated by ScanDoc $majorVersion.$minorVersion
    + Last Updated: $date
    + + +<< + +###################################################################### + +## Generate individual files for each package. + +my $p; +foreach $p (packages()) { + file $p->name() . ".html"; + >> + + $project_name -- $(p.name) + + +
    + $project_name +

    +

    + +

    Package Name: $(p.name)

    + +<< + +## Generate class and member index at the top of the file. + +foreach $c ($p->classes()) { + >>

    + $(c.fullname)

    +
      + << + foreach $m ($c->members()) { + >>
    • $(m.longname) + << + } + >>
    + << +} + +>> +
    +<< + +## Generate detailed class documentation +foreach $c ($p->classes()) { + ## Output searchable keyword list + if ($c->keywords()) { + print "\n"; + } + + >>
    + +

    $(c.fullname)

    + + + + + << + + # Output author tag + if ($c->author()) { + >><< + >><< + } + + # Output package version + if ($c->version()) { + >><< + >><< + } + + # Output Source file + if ($c->sourcefile()) { + >><< + >><< + } + + # Output base class list + if ($c->baseclasses()) { + >> + + << + } + + # Output subclasses list + if ($c->subclasses()) { + >> + << + } + + # Output main class description + >> +
    +
    Author:$(c.author)
    Version:$(c.version)
    Source:$(c.sourcefile)
    Base classes:<< + my @t = (); + foreach $b ($c->baseclasses()) { + my $name = $b->name(); + if ($url = $b->url()) { + push @t, "$name"; + } + else { push @t, $name; } + } + print join( ', ', @t ); + >>
    Subclasses:<< + my @t = (); + foreach $s ($c->subclasses()) { + my $name = $s->name(); + if ($url = $s->url()) { + push @t, "$name"; + } + else { push @t, $name; } + } + print join( ', ', @t ); + >>
    +

    + << + print &processDescription( $c->description() ); + + # Output "see also" information + if ($c->seealso()) { + >>

    See Also
    + << + my @r = (); + foreach $a ($c->seealso()) { + my $name = $a->name(); + if ($url = $a->url()) { + push @r, "$name"; + } + else { push @r, $name; } + } + print join( ',', @r ); + >>

    + << + } + + # Output class member index + if ($c->members()) { + print "

    Member Index

    \n"; + print "
      "; + foreach $m ($c->members()) { + >>
    • $(m.fullname) + << + } + >>
    << + } + + # Output class member variable documentation + if ($c->membervars()) { + print "

    Class Variables

    \n"; + print "
    \n"; + foreach $m ($c->membervars()) { &variable( $m ); } + print "
    \n"; + } + + # Output class member function documentation + if ($c->memberfuncs()) { + print "

    Class Methods

    \n"; + print "
    \n"; + foreach $m ($c->memberfuncs()) { &function( $m ); } + print "
    \n"; + } +} + +# Output global variables +if ($p->globalvars()) { + >>

    Global Variables

    +
    + << + foreach $m ($p->globalvars()) { &variable( $m ); } + print "
    \n"; +} + +# Output global functions +if ($p->globalfuncs()) { + >>

    Global Functions

    +
    + << + foreach $m ($p->globalfuncs()) { &function( $m ); } + print "
    \n"; +} + +>> +
    + $copyright
    + Generated by ScanDoc $majorVersion.$minorVersion
    + Last Updated: $date
    + + +<< +} # end of foreach (packages) loop + +###################################################################### + +## Subroutine to generate documentation for a member function or global function + +sub function { + local ($f) = @_; + + if ($f->keywords()) { + >> + << + } + >> + +
    +
    + $(f.fullname); +
    + << + print &processDescription( $f->description() ); + >> +

    + << + if ($f->params()) { + >> +
    Parameters
    + + << + foreach $a ($f->params()) { + >> + << + } + >>
    + $(a.name)<< + print &processDescription( $a->description() ); + >>
    + << + } + + if ($f->returnValue()) { + >>
    Return Value +
    << + print &processDescription( $f->returnValue() ); + >>

    << + } + + if ($f->exceptions()) { + >>

    Exceptions
    + + << + foreach $a ($f->exceptions()) { + >> + << + } + >>

    + $(a.name)<< + print &processDescription( $a->description() ); + >>

    + << + } + + if ($f->seealso()) { + >>
    See Also
    + << + my @r = (); + foreach $a ($f->seealso()) { + my $name = $a->name(); + if ($url = $a->url()) { + push @r, "$name"; + } + else { push @r, $name; } + } + print join( ',', @r ); + >>

    << + } + >>

    + << +} + +###################################################################### + +## Subroutine to generate documentation for a member variable or global variable. + +sub variable { + local ($v) = @_; + + if ($v->keywords()) { + print ""; + } + + >> + +
    + $(v.fullname); +
    + <description() );>> +

    + << + if ($v->seealso()) { + >>
    See Also
    + << + $comma = 0; + foreach $a ($v->seealso()) { + if ($comma) { print ","; } + $comma = 1; + >>$(a.name) + << + } + >>

    + << + } + >>

    + << +} + +###################################################################### + +sub processDescription { + local ($_) = @_; + + s/^\s+//; # Remove whitespace from beginning + s/\s+$/\n/; # Remove whitespace from end + s/\n\n/

    \n/g; # Replace multiple CR's with paragraph markers + s:\@heading(.*)\n:

    $1

    :; # Handle heading text + + # Handle embedded image tags + s:\@caution:

    :; + s:\@warning:

    :; + s:\@bug:

    :; + s:\@tip:

    :; + + return $_; +} diff --git a/build/fastgen.sh b/build/fastgen.sh new file mode 100755 index 0000000..87bce15 --- /dev/null +++ b/build/fastgen.sh @@ -0,0 +1,89 @@ +#! /bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# The build environment was provided by Sascha Schumann. + +srcdir=$1 +shift + +mkdir_p=$1 +shift + +bsd_makefile=$1 +shift + +top_srcdir=`(cd $srcdir; pwd)` +top_builddir=`pwd` + +if test "$mkdir_p" = "yes"; then + mkdir_p="mkdir -p" +else + mkdir_p="$top_srcdir/build/mkdir.sh" +fi + +if test "$bsd_makefile" = "yes"; then + (cd $top_srcdir; ./build/bsd_makefile) + + for makefile in $@; do + echo "creating $makefile" + dir=`echo $makefile|sed 's%/*[^/][^/]*$%%'` + + if test -z "$dir"; then + real_srcdir=$top_srcdir + real_builddir=$top_builddir + dir="." + else + $mkdir_p "$dir/" + real_srcdir=$top_srcdir/$dir + real_builddir=$top_builddir/$dir + fi + cat - $top_srcdir/$makefile.in <$makefile +top_srcdir = $top_srcdir +top_builddir = $top_builddir +srcdir = $real_srcdir +builddir = $real_builddir +VPATH = $real_srcdir +EOF + + touch $dir/.deps + done +else + for makefile in $@; do + echo "creating $makefile" + dir=`echo $makefile|sed 's%/*[^/][^/]*$%%'` + + if test -z "$dir"; then + real_srcdir=$top_srcdir + real_builddir=$top_builddir + dir="." + else + $mkdir_p "$dir/" + real_srcdir=$top_srcdir/$dir + real_builddir=$top_builddir/$dir + fi + cat - $top_srcdir/$makefile.in <$makefile +top_srcdir = $top_srcdir +top_builddir = $top_builddir +srcdir = $real_srcdir +builddir = $real_builddir +VPATH = $real_srcdir +EOF + + touch $dir/.deps + done +fi diff --git a/build/find_apr.m4 b/build/find_apr.m4 new file mode 100644 index 0000000..925e523 --- /dev/null +++ b/build/find_apr.m4 @@ -0,0 +1,202 @@ +dnl -------------------------------------------------------- -*- autoconf -*- +dnl Licensed to the Apache Software Foundation (ASF) under one or more +dnl contributor license agreements. See the NOTICE file distributed with +dnl this work for additional information regarding copyright ownership. +dnl The ASF licenses this file to You under the Apache License, Version 2.0 +dnl (the "License"); you may not use this file except in compliance with +dnl the License. You may obtain a copy of the License at +dnl +dnl http://www.apache.org/licenses/LICENSE-2.0 +dnl +dnl Unless required by applicable law or agreed to in writing, software +dnl distributed under the License is distributed on an "AS IS" BASIS, +dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +dnl See the License for the specific language governing permissions and +dnl limitations under the License. + +dnl +dnl find_apr.m4 : locate the APR include files and libraries +dnl +dnl This macro file can be used by applications to find and use the APR +dnl library. It provides a standardized mechanism for using APR. It supports +dnl embedding APR into the application source, or locating an installed +dnl copy of APR. +dnl +dnl APR_FIND_APR(srcdir, builddir, implicit-install-check, acceptable-majors, +dnl detailed-check) +dnl +dnl where srcdir is the location of the bundled APR source directory, or +dnl empty if source is not bundled. +dnl +dnl where builddir is the location where the bundled APR will will be built, +dnl or empty if the build will occur in the srcdir. +dnl +dnl where implicit-install-check set to 1 indicates if there is no +dnl --with-apr option specified, we will look for installed copies. +dnl +dnl where acceptable-majors is a space separated list of acceptable major +dnl version numbers. Often only a single major version will be acceptable. +dnl If multiple versions are specified, and --with-apr=PREFIX or the +dnl implicit installed search are used, then the first (leftmost) version +dnl in the list that is found will be used. Currently defaults to [0 1]. +dnl +dnl where detailed-check is an M4 macro which sets the apr_acceptable to +dnl either "yes" or "no". The macro will be invoked for each installed +dnl copy of APR found, with the apr_config variable set appropriately. +dnl Only installed copies of APR which are considered acceptable by +dnl this macro will be considered found. If no installed copies are +dnl considered acceptable by this macro, apr_found will be set to either +dnl either "no" or "reconfig". +dnl +dnl Sets the following variables on exit: +dnl +dnl apr_found : "yes", "no", "reconfig" +dnl +dnl apr_config : If the apr-config tool exists, this refers to it. If +dnl apr_found is "reconfig", then the bundled directory +dnl should be reconfigured *before* using apr_config. +dnl +dnl Note: this macro file assumes that apr-config has been installed; it +dnl is normally considered a required part of an APR installation. +dnl +dnl If a bundled source directory is available and needs to be (re)configured, +dnl then apr_found is set to "reconfig". The caller should reconfigure the +dnl (passed-in) source directory, placing the result in the build directory, +dnl as appropriate. +dnl +dnl If apr_found is "yes" or "reconfig", then the caller should use the +dnl value of apr_config to fetch any necessary build/link information. +dnl + +AC_DEFUN([APR_FIND_APR], [ + apr_found="no" + + if test "$target_os" = "os2-emx"; then + # Scripts don't pass test -x on OS/2 + TEST_X="test -f" + else + TEST_X="test -x" + fi + + ifelse([$4], [], [ + ifdef(AC_WARNING,AC_WARNING([$0: missing argument 4 (acceptable-majors): Defaulting to APR 0.x then APR 1.x])) + acceptable_majors="0 1"], + [acceptable_majors="$4"]) + + apr_temp_acceptable_apr_config="" + for apr_temp_major in $acceptable_majors + do + case $apr_temp_major in + 0) + apr_temp_acceptable_apr_config="$apr_temp_acceptable_apr_config apr-config" + ;; + *) + apr_temp_acceptable_apr_config="$apr_temp_acceptable_apr_config apr-$apr_temp_major-config" + ;; + esac + done + + AC_MSG_CHECKING(for APR) + AC_ARG_WITH(apr, + [ --with-apr=PATH prefix for installed APR or the full path to + apr-config], + [ + if test "$withval" = "no" || test "$withval" = "yes"; then + AC_MSG_ERROR([--with-apr requires a directory or file to be provided]) + fi + + for apr_temp_apr_config_file in $apr_temp_acceptable_apr_config + do + for lookdir in "$withval/bin" "$withval" + do + if $TEST_X "$lookdir/$apr_temp_apr_config_file"; then + apr_config="$lookdir/$apr_temp_apr_config_file" + ifelse([$5], [], [], [ + apr_acceptable="yes" + $5 + if test "$apr_acceptable" != "yes"; then + AC_MSG_WARN([Found APR in $apr_config, but we think it is considered unacceptable]) + continue + fi]) + apr_found="yes" + break 2 + fi + done + done + + if test "$apr_found" != "yes" && $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then + apr_config="$withval" + ifelse([$5], [], [apr_found="yes"], [ + apr_acceptable="yes" + $5 + if test "$apr_acceptable" = "yes"; then + apr_found="yes" + fi]) + fi + + dnl if --with-apr is used, it is a fatal error for its argument + dnl to be invalid + if test "$apr_found" != "yes"; then + AC_MSG_ERROR([the --with-apr parameter is incorrect. It must specify an install prefix, a build directory, or an apr-config file.]) + fi + ],[ + dnl If we allow installed copies, check those before using bundled copy. + if test -n "$3" && test "$3" = "1"; then + for apr_temp_apr_config_file in $apr_temp_acceptable_apr_config + do + if $apr_temp_apr_config_file --help > /dev/null 2>&1 ; then + apr_config="$apr_temp_apr_config_file" + ifelse([$5], [], [], [ + apr_acceptable="yes" + $5 + if test "$apr_acceptable" != "yes"; then + AC_MSG_WARN([skipped APR at $apr_config, version not acceptable]) + continue + fi]) + apr_found="yes" + break + else + dnl look in some standard places + for lookdir in /usr /usr/local /usr/local/apr /opt/apr; do + if $TEST_X "$lookdir/bin/$apr_temp_apr_config_file"; then + apr_config="$lookdir/bin/$apr_temp_apr_config_file" + ifelse([$5], [], [], [ + apr_acceptable="yes" + $5 + if test "$apr_acceptable" != "yes"; then + AC_MSG_WARN([skipped APR at $apr_config, version not acceptable]) + continue + fi]) + apr_found="yes" + break 2 + fi + done + fi + done + fi + dnl if we have not found anything yet and have bundled source, use that + if test "$apr_found" = "no" && test -d "$1"; then + apr_temp_abs_srcdir="`cd \"$1\" && pwd`" + apr_found="reconfig" + apr_bundled_major="`sed -n '/#define.*APR_MAJOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p' \"$1/include/apr_version.h\"`" + case $apr_bundled_major in + "") + AC_MSG_ERROR([failed to find major version of bundled APR]) + ;; + 0) + apr_temp_apr_config_file="apr-config" + ;; + *) + apr_temp_apr_config_file="apr-$apr_bundled_major-config" + ;; + esac + if test -n "$2"; then + apr_config="$2/$apr_temp_apr_config_file" + else + apr_config="$1/$apr_temp_apr_config_file" + fi + fi + ]) + + AC_MSG_RESULT($apr_found) +]) diff --git a/build/find_apu.m4 b/build/find_apu.m4 new file mode 100644 index 0000000..7937e00 --- /dev/null +++ b/build/find_apu.m4 @@ -0,0 +1,211 @@ +dnl -------------------------------------------------------- -*- autoconf -*- +dnl Licensed to the Apache Software Foundation (ASF) under one or more +dnl contributor license agreements. See the NOTICE file distributed with +dnl this work for additional information regarding copyright ownership. +dnl The ASF licenses this file to You under the Apache License, Version 2.0 +dnl (the "License"); you may not use this file except in compliance with +dnl the License. You may obtain a copy of the License at +dnl +dnl http://www.apache.org/licenses/LICENSE-2.0 +dnl +dnl Unless required by applicable law or agreed to in writing, software +dnl distributed under the License is distributed on an "AS IS" BASIS, +dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +dnl See the License for the specific language governing permissions and +dnl limitations under the License. + +dnl +dnl find_apu.m4 : locate the APR-util (APU) include files and libraries +dnl +dnl This macro file can be used by applications to find and use the APU +dnl library. It provides a standardized mechanism for using APU. It supports +dnl embedding APU into the application source, or locating an installed +dnl copy of APU. +dnl +dnl APR_FIND_APU(srcdir, builddir, implicit-install-check, acceptable-majors, +dnl detailed-check) +dnl +dnl where srcdir is the location of the bundled APU source directory, or +dnl empty if source is not bundled. +dnl +dnl where builddir is the location where the bundled APU will be built, +dnl or empty if the build will occur in the srcdir. +dnl +dnl where implicit-install-check set to 1 indicates if there is no +dnl --with-apr-util option specified, we will look for installed copies. +dnl +dnl where acceptable-majors is a space separated list of acceptable major +dnl version numbers. Often only a single major version will be acceptable. +dnl If multiple versions are specified, and --with-apr-util=PREFIX or the +dnl implicit installed search are used, then the first (leftmost) version +dnl in the list that is found will be used. Currently defaults to [0 1]. +dnl +dnl where detailed-check is an M4 macro which sets the apu_acceptable to +dnl either "yes" or "no". The macro will be invoked for each installed +dnl copy of APU found, with the apu_config variable set appropriately. +dnl Only installed copies of APU which are considered acceptable by +dnl this macro will be considered found. If no installed copies are +dnl considered acceptable by this macro, apu_found will be set to either +dnl either "no" or "reconfig". +dnl +dnl Sets the following variables on exit: +dnl +dnl apu_found : "yes", "no", "reconfig" +dnl +dnl apu_config : If the apu-config tool exists, this refers to it. If +dnl apu_found is "reconfig", then the bundled directory +dnl should be reconfigured *before* using apu_config. +dnl +dnl Note: this macro file assumes that apr-config has been installed; it +dnl is normally considered a required part of an APR installation. +dnl +dnl Note: At this time, we cannot find *both* a source dir and a build dir. +dnl If both are available, the build directory should be passed to +dnl the --with-apr-util switch. +dnl +dnl Note: the installation layout is presumed to follow the standard +dnl PREFIX/lib and PREFIX/include pattern. If the APU config file +dnl is available (and can be found), then non-standard layouts are +dnl possible, since it will be described in the config file. +dnl +dnl If a bundled source directory is available and needs to be (re)configured, +dnl then apu_found is set to "reconfig". The caller should reconfigure the +dnl (passed-in) source directory, placing the result in the build directory, +dnl as appropriate. +dnl +dnl If apu_found is "yes" or "reconfig", then the caller should use the +dnl value of apu_config to fetch any necessary build/link information. +dnl + +AC_DEFUN([APR_FIND_APU], [ + apu_found="no" + + if test "$target_os" = "os2-emx"; then + # Scripts don't pass test -x on OS/2 + TEST_X="test -f" + else + TEST_X="test -x" + fi + + ifelse([$4], [], + [ + ifdef(AC_WARNING,([$0: missing argument 4 (acceptable-majors): Defaulting to APU 0.x then APU 1.x])) + acceptable_majors="0 1" + ], [acceptable_majors="$4"]) + + apu_temp_acceptable_apu_config="" + for apu_temp_major in $acceptable_majors + do + case $apu_temp_major in + 0) + apu_temp_acceptable_apu_config="$apu_temp_acceptable_apu_config apu-config" + ;; + *) + apu_temp_acceptable_apu_config="$apu_temp_acceptable_apu_config apu-$apu_temp_major-config" + ;; + esac + done + + AC_MSG_CHECKING(for APR-util) + AC_ARG_WITH(apr-util, + [ --with-apr-util=PATH prefix for installed APU or the full path to + apu-config], + [ + if test "$withval" = "no" || test "$withval" = "yes"; then + AC_MSG_ERROR([--with-apr-util requires a directory or file to be provided]) + fi + + for apu_temp_apu_config_file in $apu_temp_acceptable_apu_config + do + for lookdir in "$withval/bin" "$withval" + do + if $TEST_X "$lookdir/$apu_temp_apu_config_file"; then + apu_config="$lookdir/$apu_temp_apu_config_file" + ifelse([$5], [], [], [ + apu_acceptable="yes" + $5 + if test "$apu_acceptable" != "yes"; then + AC_MSG_WARN([Found APU in $apu_config, but it is considered unacceptable]) + continue + fi]) + apu_found="yes" + break 2 + fi + done + done + + if test "$apu_found" != "yes" && $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then + apu_config="$withval" + ifelse([$5], [], [apu_found="yes"], [ + apu_acceptable="yes" + $5 + if test "$apu_acceptable" = "yes"; then + apu_found="yes" + fi]) + fi + + dnl if --with-apr-util is used, it is a fatal error for its argument + dnl to be invalid + if test "$apu_found" != "yes"; then + AC_MSG_ERROR([the --with-apr-util parameter is incorrect. It must specify an install prefix, a build directory, or an apu-config file.]) + fi + ],[ + if test -n "$3" && test "$3" = "1"; then + for apu_temp_apu_config_file in $apu_temp_acceptable_apu_config + do + if $apu_temp_apu_config_file --help > /dev/null 2>&1 ; then + apu_config="$apu_temp_apu_config_file" + ifelse([$5], [], [], [ + apu_acceptable="yes" + $5 + if test "$apu_acceptable" != "yes"; then + AC_MSG_WARN([skipped APR-util at $apu_config, version not acceptable]) + continue + fi]) + apu_found="yes" + break + else + dnl look in some standard places (apparently not in builtin/default) + for lookdir in /usr /usr/local /usr/local/apr /opt/apr; do + if $TEST_X "$lookdir/bin/$apu_temp_apu_config_file"; then + apu_config="$lookdir/bin/$apu_temp_apu_config_file" + ifelse([$5], [], [], [ + apu_acceptable="yes" + $5 + if test "$apu_acceptable" != "yes"; then + AC_MSG_WARN([skipped APR-util at $apu_config, version not acceptable]) + continue + fi]) + apu_found="yes" + break 2 + fi + done + fi + done + fi + dnl if we have not found anything yet and have bundled source, use that + if test "$apu_found" = "no" && test -d "$1"; then + apu_temp_abs_srcdir="`cd \"$1\" && pwd`" + apu_found="reconfig" + apu_bundled_major="`sed -n '/#define.*APU_MAJOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p' \"$1/include/apu_version.h\"`" + case $apu_bundled_major in + "") + AC_MSG_ERROR([failed to find major version of bundled APU]) + ;; + 0) + apu_temp_apu_config_file="apu-config" + ;; + *) + apu_temp_apu_config_file="apu-$apu_bundled_major-config" + ;; + esac + if test -n "$2"; then + apu_config="$2/$apu_temp_apu_config_file" + else + apu_config="$1/$apu_temp_apu_config_file" + fi + fi + ]) + + AC_MSG_RESULT($apu_found) +]) diff --git a/build/get-version.sh b/build/get-version.sh new file mode 100755 index 0000000..5e8ad88 --- /dev/null +++ b/build/get-version.sh @@ -0,0 +1,59 @@ +#!/bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# extract version numbers from a header file +# +# USAGE: get-version.sh CMD VERSION_HEADER PREFIX +# where CMD is one of: all, major, libtool +# where PREFIX is the prefix to {MAJOR|MINOR|PATCH}_VERSION defines +# +# get-version.sh all returns a dotted version number +# get-version.sh major returns just the major version number +# get-version.sh libtool returns a version "libtool -version-info" format +# + +if test $# != 3; then + echo "USAGE: $0 CMD INCLUDEDIR PREFIX" + echo " where CMD is one of: all, major" + exit 1 +fi + +major_sed="/#define.*$3_MAJORVERSION/s/^.*\([0-9][0-9]*\).*$/\1/p" +minor_sed="/#define.*$3_MINORVERSION/s/^.*\([0-9][0-9]*\).*$/\1/p" +patch_sed="/#define.*$3_PATCHLEVEL/s/^[^0-9]*\([0-9][0-9a-z-]*\).*$/\1/p" +mmn_sed="/#define.*$3_MAJOR/s/^[^0-9]*\([0-9][0-9]*\).*$/\1/p" +major="`sed -n $major_sed $2`" +minor="`sed -n $minor_sed $2`" +patch="`sed -n $patch_sed $2`" +mmn="`sed -n $mmn_sed $2`" + +if test "$1" = "all"; then + echo ${major}.${minor}.${patch} +elif test "$1" = "major"; then + echo ${major} +elif test "$1" = "mmn"; then + echo ${mmn} +elif test "$1" = "epoch"; then + printf "%02d%02d%03d" ${major} ${minor} ${patch} +elif test "$1" = "libtool"; then + # Yes, ${minor}:${patch}:${minor} is correct due to libtool idiocy. + echo ${minor}:${patch}:${minor} +else + echo "ERROR: unknown version CMD ($1)" + exit 1 +fi diff --git a/build/install-bindist.sh.in b/build/install-bindist.sh.in new file mode 100755 index 0000000..f304ac7 --- /dev/null +++ b/build/install-bindist.sh.in @@ -0,0 +1,176 @@ +#!/bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# Usage: install-bindist.sh [ServerRoot] +# This script installs the Apache binary distribution and +# was automatically created by binbuild.sh. + +lmkdir() +{ + path="" + dirs=`echo $1 | sed -e 's%/% %g'` + mode=$2 + + set -- ${dirs} + + for d in ${dirs} + do + path="${path}/$d" + if test ! -d "${path}" ; then + mkdir ${path} + if test $? -ne 0 ; then + echo "Failed to create directory: ${path}" + exit 1 + fi + chmod ${mode} ${path} + fi + done +} + +lcopy() +{ + from=$1 + to=$2 + dmode=$3 + fmode=$4 + + test -d ${to} || lmkdir ${to} ${dmode} + (cd ${from} && tar -cf - *) | (cd ${to} && tar -xf -) + + if test "X${fmode}" != X ; then + find ${to} -type f -print | xargs chmod ${fmode} + fi + if test "X${dmode}" != X ; then + find ${to} -type d -print | xargs chmod ${dmode} + fi +} + +## +## determine path to (optional) Perl interpreter +## +PERL=no-perl5-on-this-system +perls='perl5 perl' +path=`echo $PATH | sed -e 's/:/ /g'` +found_perl=0 + +for dir in ${path} ; do + for pperl in ${perls} ; do + if test -f "${dir}/${pperl}" ; then + if `${dir}/${pperl} -v >/dev/null 2>&1` ; then + PERL="${dir}/${pperl}" + found_perl=1 + break + fi + fi + done + if test $found_perl = 1 ; then + break + fi +done + +if [ .$1 = . ] +then + SR=@default_dir@ +else + SR=$1 +fi +echo "Installing binary distribution for platform @os@" +echo "into directory $SR ..." +lmkdir $SR 755 +lmkdir $SR/proxy 750 +lmkdir $SR/logs 755 +lmkdir $SR/build 755 +lcopy bindist/build $SR/build 750 750 +lcopy bindist/man $SR/man 755 644 +if [ -d bindist/modules ] +then + lcopy bindist/modules $SR/modules 750 750 +fi +lcopy bindist/include $SR/include 755 644 +lcopy bindist/icons $SR/icons 755 644 +lcopy bindist/manual $SR/manual 755 644 +lcopy bindist/cgi-bin $SR/cgi-bin 750 750 +if [ -f $SR/bin/envvars ] +then + echo "[Preserving existing envvars settings.]" + cp -p $SR/bin/envvars ./envvars.orig + HAD_ENVVARS=yes +else + HAD_ENVVARS=no +fi +lcopy bindist/bin $SR/bin 750 750 +if [ $HAD_ENVVARS = yes ] +then + cp -p ./envvars.orig $SR/bin/envvars + rm ./envvars.orig +fi +lcopy bindist/lib $SR/lib 750 750 +if [ -d $SR/conf ] +then + echo "[Preserving existing configuration files.]" + cp bindist/conf/*-std.conf $SR/conf/ +else + lcopy bindist/conf $SR/conf 750 640 + sed -e "s%@default_dir@%$SR%" $SR/conf/httpd-std.conf > $SR/conf/httpd.conf +fi +if [ -d $SR/htdocs ] +then + echo "[Preserving existing htdocs directory.]" +else + lcopy bindist/htdocs $SR/htdocs 755 644 +fi +if [ -d $SR/error ] +then + echo "[Preserving existing error documents directory.]" +else + lcopy bindist/error $SR/error 755 644 +fi + +sed -e "s;^#!\@perlbin\@.*;#!$PERL;" -e "s;\@exp_installbuilddir\@;$SR/build;" \ + support/apxs.in > $SR/bin/apxs +PRE=`grep "^prefix = " bindist/build/config_vars.mk` +PRE=`echo $PRE | sed -e "s;prefix = ;;"` +sed -e "s;$PRE;$SR;" bindist/build/config_vars.mk > $SR/build/config_vars.mk +sed -e "s;^#!/.*;#!$PERL;" bindist/bin/dbmmanage > $SR/bin/dbmmanage +sed -e "s%@default_dir@%$SR%" \ + -e "s%^HTTPD=.*$%HTTPD=\"$SR/bin/httpd -d $SR\"%" bindist/bin/apachectl > $SR/bin/apachectl +sed -e "s%@default_dir@%$SR%" \ + bindist/bin/envvars-std > $SR/bin/envvars-std +if [ $HAD_ENVVARS = no ] +then + cp -p $SR/bin/envvars-std $SR/bin/envvars +fi + +echo "Ready." +echo " +--------------------------------------------------------+" +echo " | You now have successfully installed the Apache @ver@ |" +echo " | HTTP server. To verify that Apache actually works |" +echo " | correctly you should first check the (initially |" +echo " | created or preserved) configuration files: |" +echo " | |" +echo " | $SR/conf/httpd.conf" +echo " | |" +echo " | You should then be able to immediately fire up |" +echo " | Apache the first time by running: |" +echo " | |" +echo " | $SR/bin/apachectl start " +echo " | |" +echo " | Thanks for using Apache. The Apache Group |" +echo " | http://www.apache.org/ |" +echo " +--------------------------------------------------------+" +echo " " diff --git a/build/install.sh b/build/install.sh new file mode 100755 index 0000000..c5d20da --- /dev/null +++ b/build/install.sh @@ -0,0 +1,123 @@ +#!/bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# install.sh -- install a program, script or datafile +# +# Based on `install-sh' from the X Consortium's X11R5 distribution +# as of 89/12/18 which is freely available. +# Cleaned up for Apache's Autoconf-style Interface (APACI) +# by Ralf S. Engelschall + +# +# 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}" + +# +# parse argument line +# +instcmd="$mvprog" +chmodcmd="" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +ext="" +src="" +dst="" +while [ "x$1" != "x" ]; do + case $1 in + -c) instcmd="$cpprog" + 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 + ;; + -S) stripcmd="$stripprog $2" + shift; shift; continue + ;; + -e) ext="$2" + shift; shift; continue + ;; + *) if [ "x$src" = "x" ]; then + src=$1 + else + dst=$1 + fi + shift; continue + ;; + esac +done +if [ "x$src" = "x" ]; then + echo "install.sh: no input file specified" + exit 1 +fi +if [ "x$dst" = "x" ]; then + echo "install.sh: no destination specified" + exit 1 +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`" +fi + +# Add a possible extension (such as ".exe") to src and dst +src="$src$ext" +dst="$dst$ext" + +# Make a temp file name in the proper directory. +dstdir=`dirname $dst` +dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name +$instcmd $src $dsttmp + +# And set any options; do chmod last to preserve setuid bits +if [ "x$chowncmd" != "x" ]; then $chowncmd $dsttmp; fi +if [ "x$chgrpcmd" != "x" ]; then $chgrpcmd $dsttmp; fi +if [ "x$stripcmd" != "x" ]; then $stripcmd $dsttmp; fi +if [ "x$chmodcmd" != "x" ]; then $chmodcmd $dsttmp; fi + +# Now rename the file to the real destination. +$rmcmd $dst +$mvcmd $dsttmp $dst + +exit 0 + diff --git a/build/installwinconf.awk b/build/installwinconf.awk new file mode 100644 index 0000000..ae0421f --- /dev/null +++ b/build/installwinconf.awk @@ -0,0 +1,286 @@ +# +# InstallConf.awk Apache HTTP 2.x script to rewrite the @@ServerRoot@@ +# tags in httpd.conf.in to original\httpd.conf - then duplicate the +# conf files to the 'live' configuration if they don't already exist. +# +# Note that we -don't- want the ARGV file list, so no additional {} blocks +# are coded. Use explicit args (more reliable on Win32) and use the fact +# that ARGV[] params are -not- '\' escaped to process the C:\Foo\Bar Win32 +# path format. Note that awk var=path would not succeed, since it -does- +# escape backslashes in the assignment. Note also, a trailing space is +# required for paths, or the trailing quote following the backslash is +# escaped, rather than parsed. +# +BEGIN { + domainname = ARGV[1]; + servername = ARGV[2]; + serveradmin = ARGV[3]; + serverport = ARGV[4]; + serversslport = ARGV[5]; + serverroot = ARGV[6]; + sourceroot = ARGV[7]; + + delete ARGV[7]; + delete ARGV[6]; + delete ARGV[5]; + delete ARGV[4]; + delete ARGV[3]; + delete ARGV[2]; + delete ARGV[1]; + + gsub( /\\/, "/", serverroot ); + gsub( /[ \/]+$/, "", serverroot ); + tstfl = serverroot "/logs/install.log" + confroot = serverroot "/conf/"; + confdefault = confroot "original/"; + + if ( sourceroot != "docs/conf/" ) { + sourceroot = serverroot "/" sourceroot; + } + + usertree = ENVIRON["USERPROFILE"] + if ( usertree > "" ) { + gsub( /\\/, "/", usertree ); + gsub( /\/[^\/]+$/, "", usertree ); + } else { + usertree = "C:/Documents and Settings"; + } + + print "Installing Apache HTTP Server 2.x with" >tstfl; + print " DomainName = " domainname >tstfl; + print " ServerName = " servername >tstfl; + print " ServerAdmin = " serveradmin >tstfl; + print " ServerPort = " serverport >tstfl; + print " ServerSslPort = " serversslport >tstfl; + print " ServerRoot = " serverroot >tstfl; + + filelist["httpd.conf"] = "httpd.conf.in"; + filelist["httpd-autoindex.conf"] = "httpd-autoindex.conf.in"; + filelist["httpd-dav.conf"] = "httpd-dav.conf.in"; + filelist["httpd-default.conf"] = "httpd-default.conf.in"; + filelist["httpd-info.conf"] = "httpd-info.conf.in"; + filelist["httpd-languages.conf"] = "httpd-languages.conf.in"; + filelist["httpd-manual.conf"] = "httpd-manual.conf.in"; + filelist["httpd-mpm.conf"] = "httpd-mpm.conf.in"; + filelist["httpd-multilang-errordoc.conf"] = "httpd-multilang-errordoc.conf.in"; + filelist["httpd-ssl.conf"] = "httpd-ssl.conf.in"; + filelist["httpd-userdir.conf"] = "httpd-userdir.conf.in"; + filelist["httpd-vhosts.conf"] = "httpd-vhosts.conf.in"; + filelist["proxy-html.conf"] = "proxy-html.conf.in"; + + for ( conffile in filelist ) { + + if ( conffile == "httpd.conf" ) { + srcfl = sourceroot filelist[conffile]; + dstfl = confdefault conffile; + bswarning = 1; + } else { + srcfl = sourceroot "extra/" filelist[conffile]; + dstfl = confdefault "extra/" conffile; + bswarning = 0; + } + + while ( ( getline < srcfl ) > 0 ) { + + if ( bswarning && /^$/ ) { + print "#" > dstfl; + print "# NOTE: Where filenames are specified, you must use forward slashes" > dstfl; + print "# instead of backslashes (e.g., \"c:/apache\" instead of \"c:\\apache\")." > dstfl; + print "# If a drive letter is omitted, the drive on which httpd.exe is located" > dstfl; + print "# will be used by default. It is recommended that you always supply" > dstfl; + print "# an explicit drive letter in absolute paths to avoid confusion." > dstfl; + bswarning = 0; + } + if ( /@@LoadModule@@/ ) { + print "LoadModule access_compat_module modules/mod_access_compat.so" > dstfl; + print "LoadModule actions_module modules/mod_actions.so" > dstfl; + print "LoadModule alias_module modules/mod_alias.so" > dstfl; + print "LoadModule allowmethods_module modules/mod_allowmethods.so" > dstfl; + print "LoadModule asis_module modules/mod_asis.so" > dstfl; + print "LoadModule auth_basic_module modules/mod_auth_basic.so" > dstfl; + print "#LoadModule auth_digest_module modules/mod_auth_digest.so" > dstfl; + print "#LoadModule auth_form_module modules/mod_auth_form.so" > dstfl; + print "#LoadModule authn_anon_module modules/mod_authn_anon.so" > dstfl; + print "LoadModule authn_core_module modules/mod_authn_core.so" > dstfl; + print "#LoadModule authn_dbd_module modules/mod_authn_dbd.so" > dstfl; + print "#LoadModule authn_dbm_module modules/mod_authn_dbm.so" > dstfl; + print "LoadModule authn_file_module modules/mod_authn_file.so" > dstfl; + print "#LoadModule authn_socache_module modules/mod_authn_socache.so" > dstfl; + print "#LoadModule authnz_fcgi_module modules/mod_authnz_fcgi.so" > dstfl; + print "#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so" > dstfl; + print "LoadModule authz_core_module modules/mod_authz_core.so" > dstfl; + print "#LoadModule authz_dbd_module modules/mod_authz_dbd.so" > dstfl; + print "#LoadModule authz_dbm_module modules/mod_authz_dbm.so" > dstfl; + print "LoadModule authz_groupfile_module modules/mod_authz_groupfile.so" > dstfl; + print "LoadModule authz_host_module modules/mod_authz_host.so" > dstfl; + print "#LoadModule authz_owner_module modules/mod_authz_owner.so" > dstfl; + print "LoadModule authz_user_module modules/mod_authz_user.so" > dstfl; + print "LoadModule autoindex_module modules/mod_autoindex.so" > dstfl; + print "#LoadModule brotli_module modules/mod_brotli.so" > dstfl; + print "#LoadModule buffer_module modules/mod_buffer.so" > dstfl; + print "#LoadModule cache_module modules/mod_cache.so" > dstfl; + print "#LoadModule cache_disk_module modules/mod_cache_disk.so" > dstfl; + print "#LoadModule cache_socache_module modules/mod_cache_socache.so" > dstfl; + print "#LoadModule cern_meta_module modules/mod_cern_meta.so" > dstfl; + print "LoadModule cgi_module modules/mod_cgi.so" > dstfl; + print "#LoadModule charset_lite_module modules/mod_charset_lite.so" > dstfl; + print "#LoadModule data_module modules/mod_data.so" > dstfl; + print "#LoadModule dav_module modules/mod_dav.so" > dstfl; + print "#LoadModule dav_fs_module modules/mod_dav_fs.so" > dstfl; + print "#LoadModule dav_lock_module modules/mod_dav_lock.so" > dstfl; + print "#LoadModule dbd_module modules/mod_dbd.so" > dstfl; + print "#LoadModule deflate_module modules/mod_deflate.so" > dstfl; + print "LoadModule dir_module modules/mod_dir.so" > dstfl; + print "#LoadModule dumpio_module modules/mod_dumpio.so" > dstfl; + print "LoadModule env_module modules/mod_env.so" > dstfl; + print "#LoadModule expires_module modules/mod_expires.so" > dstfl; + print "#LoadModule ext_filter_module modules/mod_ext_filter.so" > dstfl; + print "#LoadModule file_cache_module modules/mod_file_cache.so" > dstfl; + print "#LoadModule filter_module modules/mod_filter.so" > dstfl; + print "#LoadModule http2_module modules/mod_http2.so" > dstfl; + print "#LoadModule headers_module modules/mod_headers.so" > dstfl; + print "#LoadModule heartbeat_module modules/mod_heartbeat.so" > dstfl; + print "#LoadModule heartmonitor_module modules/mod_heartmonitor.so" > dstfl; + print "#LoadModule ident_module modules/mod_ident.so" > dstfl; + print "#LoadModule imagemap_module modules/mod_imagemap.so" > dstfl; + print "LoadModule include_module modules/mod_include.so" > dstfl; + print "#LoadModule info_module modules/mod_info.so" > dstfl; + print "LoadModule isapi_module modules/mod_isapi.so" > dstfl; + print "#LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so" > dstfl; + print "#LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so" > dstfl; + print "#LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so" > dstfl; + print "#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so" > dstfl; + print "#LoadModule ldap_module modules/mod_ldap.so" > dstfl; + print "#LoadModule logio_module modules/mod_logio.so" > dstfl; + print "LoadModule log_config_module modules/mod_log_config.so" > dstfl; + print "#LoadModule log_debug_module modules/mod_log_debug.so" > dstfl; + print "#LoadModule log_forensic_module modules/mod_log_forensic.so" > dstfl; + print "#LoadModule lua_module modules/mod_lua.so" > dstfl; + print "#LoadModule macro_module modules/mod_macro.so" > dstfl; + print "#LoadModule md_module modules/mod_md.so" > dstfl; + print "LoadModule mime_module modules/mod_mime.so" > dstfl; + print "#LoadModule mime_magic_module modules/mod_mime_magic.so" > dstfl; + print "LoadModule negotiation_module modules/mod_negotiation.so" > dstfl; + print "#LoadModule proxy_module modules/mod_proxy.so" > dstfl; + print "#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so" > dstfl; + print "#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so" > dstfl; + print "#LoadModule proxy_connect_module modules/mod_proxy_connect.so" > dstfl; + print "#LoadModule proxy_express_module modules/mod_proxy_express.so" > dstfl; + print "#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so" > dstfl; + print "#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so" > dstfl; + print "#LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so" > dstfl; + print "#LoadModule proxy_html_module modules/mod_proxy_html.so" > dstfl; + print "#LoadModule proxy_http_module modules/mod_proxy_http.so" > dstfl; + print "#LoadModule proxy_http2_module modules/mod_proxy_http2.so" > dstfl; + print "#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so" > dstfl; + print "#LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so" > dstfl; + print "#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so" > dstfl; + print "#LoadModule ratelimit_module modules/mod_ratelimit.so" > dstfl; + print "#LoadModule reflector_module modules/mod_reflector.so" > dstfl; + print "#LoadModule remoteip_module modules/mod_remoteip.so" > dstfl; + print "#LoadModule request_module modules/mod_request.so" > dstfl; + print "#LoadModule reqtimeout_module modules/mod_reqtimeout.so" > dstfl; + print "#LoadModule rewrite_module modules/mod_rewrite.so" > dstfl; + print "#LoadModule sed_module modules/mod_sed.so" > dstfl; + print "#LoadModule session_module modules/mod_session.so" > dstfl; + print "#LoadModule session_cookie_module modules/mod_session_cookie.so" > dstfl; + print "#LoadModule session_crypto_module modules/mod_session_crypto.so" > dstfl; + print "#LoadModule session_dbd_module modules/mod_session_dbd.so" > dstfl; + print "LoadModule setenvif_module modules/mod_setenvif.so" > dstfl; + print "#LoadModule slotmem_plain_module modules/mod_slotmem_plain.so" > dstfl; + print "#LoadModule slotmem_shm_module modules/mod_slotmem_shm.so" > dstfl; + print "#LoadModule socache_dbm_module modules/mod_socache_dbm.so" > dstfl; + print "#LoadModule socache_memcache_module modules/mod_socache_memcache.so" > dstfl; + print "#LoadModule socache_redis_module modules/mod_socache_redis.so" > dstfl; + print "#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so" > dstfl; + print "#LoadModule speling_module modules/mod_speling.so" > dstfl; + print "#LoadModule ssl_module modules/mod_ssl.so" > dstfl; + print "#LoadModule status_module modules/mod_status.so" > dstfl; + print "#LoadModule substitute_module modules/mod_substitute.so" > dstfl; + print "#LoadModule unique_id_module modules/mod_unique_id.so" > dstfl; + print "#LoadModule userdir_module modules/mod_userdir.so" > dstfl; + print "#LoadModule usertrack_module modules/mod_usertrack.so" > dstfl; + print "#LoadModule version_module modules/mod_version.so" > dstfl; + print "#LoadModule vhost_alias_module modules/mod_vhost_alias.so" > dstfl; + print "#LoadModule watchdog_module modules/mod_watchdog.so" > dstfl; + print "#LoadModule xml2enc_module modules/mod_xml2enc.so" > dstfl; + continue; + } + if ( /^ServerRoot / ) { + print "Define SRVROOT \"" serverroot "\"" > dstfl; + print "" > dstfl; + } + gsub( /@@ServerRoot@@/, "\${SRVROOT}" ); + gsub( /@exp_cgidir@/, "\${SRVROOT}" "/cgi-bin" ); + gsub( /@exp_sysconfdir@/, "\${SRVROOT}" "/conf" ); + gsub( /@exp_errordir@/, "\${SRVROOT}" "/error" ); + gsub( /@exp_htdocsdir@/, "\${SRVROOT}" "/htdocs" ); + gsub( /@exp_iconsdir@/, "\${SRVROOT}" "/icons" ); + gsub( /@exp_manualdir@/, "\${SRVROOT}" "/manual" ); + gsub( /@exp_runtimedir@/, "\${SRVROOT}" "/logs" ); + if ( gsub( /@exp_logfiledir@/, "\${SRVROOT}" "/logs" ) || + gsub( /@rel_logfiledir@/, "logs" ) ) { + gsub( /_log"/, ".log\"" ) + } + gsub( /@rel_runtimedir@/, "logs" ); + gsub( /@rel_sysconfdir@/, "conf" ); + gsub( /\/home\/\*\/public_html/, \ + usertree "/*/My Documents/My Website" ); + gsub( /UserDir public_html/, "UserDir \"My Documents/My Website\"" ); + gsub( /@@ServerName@@|www.example.com/, servername ); + gsub( /@@ServerAdmin@@|you@example.com/, serveradmin ); + gsub( /@@DomainName@@|example.com/, domainname ); + gsub( /@@Port@@/, serverport ); + gsub( /@@SSLPort@@|443/, serversslport ); + print $0 > dstfl; + } + close(srcfl); + + if ( close(dstfl) >= 0 ) { + print "Rewrote " srcfl "\n to " dstfl > tstfl; + if ( sourceroot != "docs/conf/" ) { + gsub(/\//, "\\", srcfl); + if (system("del 2>NUL \"" srcfl "\"")) { + print "Failed to remove " srcfl > tstfl; + } else { + print "Successfully removed " srcfl > tstfl; + } + } + } else { + print "Failed to rewrite " srcfl "\n to " dstfl > tstfl; + } + filelist[conffile] = "extra/"; + } + + filelist["httpd.conf"] = ""; + filelist["charset.conv"] = ""; + filelist["magic"] = ""; + filelist["mime.types"] = ""; + + for ( conffile in filelist ) { + srcfl = confdefault filelist[conffile] conffile; + dstfl = confroot filelist[conffile] conffile; + if ( ( getline < dstfl ) < 0 ) { + while ( ( getline < srcfl ) > 0 ) { + print $0 > dstfl; + } + print "Duplicated " srcfl "\n to " dstfl > tstfl; + } else { + print "Existing file " dstfl " preserved" > tstfl; + } + close(srcfl); + close(dstfl); + } + + if ( sourceroot != "docs/conf/" ) { + srcfl = confdefault "installwinconf.awk"; + gsub(/\//, "\\", srcfl); + if (system("del 2>NUL \"" srcfl "\"")) { + print "Failed to remove " srcfl > tstfl; + } else { + print "Successfully removed " srcfl > tstfl; + } + } + close(tstfl); +} + diff --git a/build/instdso.sh b/build/instdso.sh new file mode 100755 index 0000000..3ca5272 --- /dev/null +++ b/build/instdso.sh @@ -0,0 +1,105 @@ +#!/bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# instdso.sh - install Apache DSO modules +# +# we use this instead of libtool --install because: +# 1) on a few platforms libtool doesn't install DSOs exactly like we'd +# want (weird names, doesn't remove DSO first) +# 2) we never want the .la files copied, so we might as well copy +# the .so files ourselves + +if test "$#" != "3"; then + echo "wrong number of arguments to instdso.sh" + echo "Usage: instdso.sh SH_LIBTOOL-value dso-name path-to-modules" + exit 1 +fi + +SH_LIBTOOL=`echo $1 | sed -e 's/^SH_LIBTOOL=//'` +DSOARCHIVE=$2 +DSOARCHIVE_BASENAME=`basename $2` +TARGETDIR=$3 +DSOBASE=`echo $DSOARCHIVE_BASENAME | sed -e 's/\.la$//'` +TARGET_NAME="$DSOBASE.so" + +SYS=`uname -s` + +if test "$SYS" = "AIX" +then + # on AIX, shared libraries remain in storage even when + # all processes using them have exited; standard practice + # prior to installing a shared library is to rm -f first + CMD="rm -f $TARGETDIR/$TARGET_NAME" + echo $CMD + $CMD || exit $? +fi + +case $SYS in + SunOS|HP-UX) + INSTALL_CMD=cp + ;; + *) + type install >/dev/null 2>&1 && INSTALL_CMD=install || INSTALL_CMD=cp + ;; +esac + +CMD="$SH_LIBTOOL --mode=install $INSTALL_CMD $DSOARCHIVE $TARGETDIR/" +echo $CMD +$CMD || exit $? + +if test "$SYS" = "OS/2" +then + # on OS/2, aplibtool --install doesn't copy the .la files & we can't + # rename DLLs to have a .so extension or they won't load so none of the + # steps below make sense. + exit 0 +fi + +if test -s "$TARGETDIR/$DSOARCHIVE_BASENAME" +then + DLNAME=`sed -n "/^dlname=/{s/.*='\([^']*\)'/\1/;p;}" $TARGETDIR/$DSOARCHIVE_BASENAME` + LIBRARY_NAMES=`sed -n "/^library_names/{s/library_names='\([^']*\)'/\1/;p;}" $TARGETDIR/$DSOARCHIVE_BASENAME` + LIBRARY_NAMES=`echo $LIBRARY_NAMES | sed -e "s/ *$DLNAME//g"` +fi + +if test -z "$DLNAME" +then + echo "Warning! dlname not found in $TARGETDIR/$DSOARCHIVE_BASENAME." + echo "Assuming installing a .so rather than a libtool archive." + exit 0 +fi + +if test -n "$LIBRARY_NAMES" +then + for f in $LIBRARY_NAMES + do + rm -f $TARGETDIR/$f + done +fi + +if test "$DLNAME" != "$TARGET_NAME" +then + mv $TARGETDIR/$DLNAME $TARGETDIR/$TARGET_NAME +fi + +rm -f $TARGETDIR/$DSOARCHIVE_BASENAME +rm -f $TARGETDIR/$DSOBASE.a +rm -f $TARGETDIR/lib$DSOBASE.a +rm -f $TARGETDIR/lib$TARGET_NAME + +exit 0 diff --git a/build/library.mk b/build/library.mk new file mode 100644 index 0000000..f2c2e15 --- /dev/null +++ b/build/library.mk @@ -0,0 +1,22 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# The build environment was provided by Sascha Schumann. + +LTLIBRARY_OBJECTS = $(LTLIBRARY_SOURCES:.c=.lo) $(LTLIBRARY_OBJECTS_X) + +$(LTLIBRARY_NAME): $(LTLIBRARY_OBJECTS) $(LTLIBRARY_DEPENDENCIES) + $(LINK) -static $(LTLIBRARY_LDFLAGS) $(LTLIBRARY_OBJECTS) $(LTLIBRARY_LIBADD) diff --git a/build/ltlib.mk b/build/ltlib.mk new file mode 100644 index 0000000..3b87dd3 --- /dev/null +++ b/build/ltlib.mk @@ -0,0 +1,23 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# The build environment was provided by Sascha Schumann. + +TARGETS = $(LTLIBRARY_NAME) + +include $(top_builddir)/build/rules.mk +include $(top_srcdir)/build/library.mk + diff --git a/build/ltmain.sh b/build/ltmain.sh new file mode 100644 index 0000000..def0a43 --- /dev/null +++ b/build/ltmain.sh @@ -0,0 +1,11375 @@ +#! /usr/bin/env sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2019-02-19.15 + +# libtool (GNU libtool) 2.5.3 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2019, 2021-2024 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. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT 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 . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.5.3 +package_revision=2.5.3 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2019-02-19.15; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Copyright (C) 2004-2019, 2021, 2023-2024 Bootstrap Authors +# +# This file is dual licensed under the terms of the MIT license +# , and GPL version 2 or later +# . You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. + +# Please report bugs or propose patches to: +# + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done +# These NLS vars are set unconditionally (bootstrap issue #24). Unset those +# in case the environment reset is needed later and the $save_* variant is not +# defined (see the code above). +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# func_unset VAR +# -------------- +# Portably unset VAR. +# In some shells, an 'unset VAR' statement leaves a non-zero return +# status if VAR is already unset, which might be problematic if the +# statement is used at the end of a function (thus poisoning its return +# value) or when 'set -e' is active (causing even a spurious abort of +# the script in this case). +func_unset () +{ + { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } +} + + +# Make sure CDPATH doesn't cause `cd` commands to output the target dir. +func_unset CDPATH + +# Make sure ${,E,F}GREP behave sanely. +func_unset GREP_OPTIONS + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + +# require_check_ifs_backslash +# --------------------------- +# Check if we can use backslash as IFS='\' separator, and set +# $check_ifs_backshlash_broken to ':' or 'false'. +require_check_ifs_backslash=func_require_check_ifs_backslash +func_require_check_ifs_backslash () +{ + _G_save_IFS=$IFS + IFS='\' + _G_check_ifs_backshlash='a\\b' + for _G_i in $_G_check_ifs_backshlash + do + case $_G_i in + a) + check_ifs_backshlash_broken=false + ;; + '') + break + ;; + *) + check_ifs_backshlash_broken=: + break + ;; + esac + done + IFS=$_G_save_IFS + require_check_ifs_backslash=: +} + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_arg pretty "$2" + eval "$1+=\\ \$func_quote_arg_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_arg pretty "$2" + eval "$1=\$$1\\ \$func_quote_arg_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_portable EVAL ARG +# ---------------------------- +# Internal function to portably implement func_quote_arg. Note that we still +# keep attention to performance here so we as much as possible try to avoid +# calling sed binary (so far O(N) complexity as long as func_append is O(1)). +func_quote_portable () +{ + $debug_cmd + + $require_check_ifs_backslash + + func_quote_portable_result=$2 + + # one-time-loop (easy break) + while true + do + if $1; then + func_quote_portable_result=`$ECHO "$2" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` + break + fi + + # Quote for eval. + case $func_quote_portable_result in + *[\\\`\"\$]*) + # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string + # contains the shell wildcard characters. + case $check_ifs_backshlash_broken$func_quote_portable_result in + :*|*[\[\*\?]*) + func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ + | $SED "$sed_quote_subst"` + break + ;; + esac + + func_quote_portable_old_IFS=$IFS + for _G_char in '\' '`' '"' '$' + do + # STATE($1) PREV($2) SEPARATOR($3) + set start "" "" + func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy + IFS=$_G_char + for _G_part in $func_quote_portable_result + do + case $1 in + quote) + func_append func_quote_portable_result "$3$2" + set quote "$_G_part" "\\$_G_char" + ;; + start) + set first "" "" + func_quote_portable_result= + ;; + first) + set quote "$_G_part" "" + ;; + esac + done + done + IFS=$func_quote_portable_old_IFS + ;; + *) ;; + esac + break + done + + func_quote_portable_unquoted_result=$func_quote_portable_result + case $func_quote_portable_result in + # double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # many bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_portable_result=\"$func_quote_portable_result\" + ;; + esac +} + + +# func_quotefast_eval ARG +# ----------------------- +# Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', +# but optimized for speed. Result is stored in $func_quotefast_eval. +if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then + printf -v _GL_test_printf_tilde %q '~' + if test '\~' = "$_GL_test_printf_tilde"; then + func_quotefast_eval () + { + printf -v func_quotefast_eval_result %q "$1" + } + else + # Broken older Bash implementations. Make those faster too if possible. + func_quotefast_eval () + { + case $1 in + '~'*) + func_quote_portable false "$1" + func_quotefast_eval_result=$func_quote_portable_result + ;; + *) + printf -v func_quotefast_eval_result %q "$1" + ;; + esac + } + fi +else + func_quotefast_eval () + { + func_quote_portable false "$1" + func_quotefast_eval_result=$func_quote_portable_result + } +fi + + +# func_quote_arg MODEs ARG +# ------------------------ +# Quote one ARG to be evaled later. MODEs argument may contain zero or more +# specifiers listed below separated by ',' character. This function returns two +# values: +# i) func_quote_arg_result +# double-quoted (when needed), suitable for a subsequent eval +# ii) func_quote_arg_unquoted_result +# has all characters that are still active within double +# quotes backslashified. Available only if 'unquoted' is specified. +# +# Available modes: +# ---------------- +# 'eval' (default) +# - escape shell special characters +# 'expand' +# - the same as 'eval'; but do not quote variable references +# 'pretty' +# - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might +# be used later in func_quote to get output like: 'echo "a b"' instead +# of 'echo a\ b'. This is slower than default on some shells. +# 'unquoted' +# - produce also $func_quote_arg_unquoted_result which does not contain +# wrapping double-quotes. +# +# Examples for 'func_quote_arg pretty,unquoted string': +# +# string | *_result | *_unquoted_result +# ------------+-----------------------+------------------- +# " | \" | \" +# a b | "a b" | a b +# "a b" | "\"a b\"" | \"a b\" +# * | "*" | * +# z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" +# +# Examples for 'func_quote_arg pretty,unquoted,expand string': +# +# string | *_result | *_unquoted_result +# --------------+---------------------+-------------------- +# z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" +func_quote_arg () +{ + _G_quote_expand=false + case ,$1, in + *,expand,*) + _G_quote_expand=: + ;; + esac + + case ,$1, in + *,pretty,*|*,expand,*|*,unquoted,*) + func_quote_portable $_G_quote_expand "$2" + func_quote_arg_result=$func_quote_portable_result + func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result + ;; + *) + # Faster quote-for-eval for some shells. + func_quotefast_eval "$2" + func_quote_arg_result=$func_quotefast_eval_result + ;; + esac +} + + +# func_quote MODEs ARGs... +# ------------------------ +# Quote all ARGs to be evaled later and join them into single command. See +# func_quote_arg's description for more info. +func_quote () +{ + $debug_cmd + _G_func_quote_mode=$1 ; shift + func_quote_result= + while test 0 -lt $#; do + func_quote_arg "$_G_func_quote_mode" "$1" + if test -n "$func_quote_result"; then + func_append func_quote_result " $func_quote_arg_result" + else + func_append func_quote_result "$func_quote_arg_result" + fi + shift + done +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_arg pretty,expand "$_G_cmd" + eval "func_notquiet $func_quote_arg_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_arg expand,pretty "$_G_cmd" + eval "func_echo $func_quote_arg_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Copyright (C) 2010-2019, 2021, 2023-2024 Bootstrap Authors +# +# This file is dual licensed under the terms of the MIT license +# , and GPL version 2 or later +# . You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. + +# Please report bugs or propose patches to: +# + +# Set a version string for this script. +scriptversion=2019-02-19.15; # UTC + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# Copyright'. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug in processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# in the main code. A hook is just a list of function names that can be +# run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of hook functions to be called by +# FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_propagate_result FUNC_NAME_A FUNC_NAME_B +# --------------------------------------------- +# If the *_result variable of FUNC_NAME_A _is set_, assign its value to +# *_result variable of FUNC_NAME_B. +func_propagate_result () +{ + $debug_cmd + + func_propagate_result_result=: + if eval "test \"\${${1}_result+set}\" = set" + then + eval "${2}_result=\$${1}_result" + else + func_propagate_result_result=false + fi +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It's assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook functions." ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + func_unset "${_G_hook}_result" + eval $_G_hook '${1+"$@"}' + func_propagate_result $_G_hook func_run_hooks + if $func_propagate_result_result; then + eval set dummy "$func_run_hooks_result"; shift + fi + done +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list from your hook function. You may remove +# or edit any options that you action, and then pass back the remaining +# unprocessed options in '_result', escaped +# suitably for 'eval'. +# +# The '_result' variable is automatically unset +# before your hook gets called; for best performance, only set the +# *_result variable when necessary (i.e. don't call the 'func_quote' +# function unnecessarily because it can be an expensive operation on some +# machines). +# +# Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# # No change in '$@' (ignored completely by this hook). Leave +# # my_options_prep_result variable intact. +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# args_changed=false +# +# # Note that, for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: +# args_changed=: +# ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# args_changed=: +# ;; +# *) # Make sure the first unrecognised option "$_G_opt" +# # is added back to "$@" in case we need it later, +# # if $args_changed was set to 'true'. +# set dummy "$_G_opt" ${1+"$@"}; shift; break ;; +# esac +# done +# +# # Only call 'func_quote' here if we processed at least one argument. +# if $args_changed; then +# func_quote eval ${1+"$@"} +# my_silent_option_result=$func_quote_result +# fi +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll also need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options_finish [ARG]... +# ---------------------------- +# Finishing the option parse loop (call 'func_options' hooks ATM). +func_options_finish () +{ + $debug_cmd + + func_run_hooks func_options ${1+"$@"} + func_propagate_result func_run_hooks func_options_finish +} + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + _G_options_quoted=false + + for my_func in options_prep parse_options validate_options options_finish + do + func_unset func_${my_func}_result + func_unset func_run_hooks_result + eval func_$my_func '${1+"$@"}' + func_propagate_result func_$my_func func_options + if $func_propagate_result_result; then + eval set dummy "$func_options_result"; shift + _G_options_quoted=: + fi + done + + $_G_options_quoted || { + # As we (func_options) are top-level options-parser function and + # nobody quoted "$@" for us yet, we need to do it explicitly for + # caller. + func_quote eval ${1+"$@"} + func_options_result=$func_quote_result + } +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propagate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + func_propagate_result func_run_hooks func_options_prep +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + _G_parse_options_requote=false + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + func_propagate_result func_run_hooks func_parse_options + if $func_propagate_result_result; then + eval set dummy "$func_parse_options_result"; shift + # Even though we may have changed "$@", we passed the "$@" array + # down into the hook and it quoted it for us (because we are in + # this if-branch). No need to quote it again. + _G_parse_options_requote=false + fi + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + # We expect that one of the options parsed in this function matches + # and thus we remove _G_opt from "$@" and need to re-quote. + _G_match_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" >&2 + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + if test $# = 0 && func_missing_arg $_G_opt; then + _G_parse_options_requote=: + break + fi + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) _G_parse_options_requote=: ; break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift + _G_match_parse_options=false + break + ;; + esac + + if $_G_match_parse_options; then + _G_parse_options_requote=: + fi + done + + if $_G_parse_options_requote; then + # save modified positional parameters for caller + func_quote eval ${1+"$@"} + func_parse_options_result=$func_quote_result + fi +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + func_propagate_result func_run_hooks func_validate_options + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables +# after splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + if test "x$func_split_equals_lhs" = "x$1"; then + func_split_equals_rhs= + fi + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs=" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +# The version message is extracted from the calling file's header +# comments, with leading '# ' stripped: +# 1. First display the progname and version +# 2. Followed by the header comment line matching /^# Written by / +# 3. Then a blank line followed by the first following line matching +# /^# Copyright / +# 4. Immediately followed by any lines between the previous matches, +# except lines preceding the intervening completely blank line. +# For example, see the header comments of this file. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /^# Written by /!b + s|^# ||; p; n + + :fwd2blnk + /./ { + n + b fwd2blnk + } + p; n + + :holdwrnt + s|^# || + s|^# *$|| + /^Copyright /!{ + /./H + n + b holdwrnt + } + + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + G + s|\(\n\)\n*|\1|g + p; q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.5.3' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --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 + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + 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. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.5.3 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + _G_rc_lt_options_prep=: + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + *) + _G_rc_lt_options_prep=false + ;; + esac + + if $_G_rc_lt_options_prep; then + # Pass back the list of options. + func_quote eval ${1+"$@"} + libtool_options_prep_result=$func_quote_result + fi +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + _G_rc_lt_parse_options=false + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_match_lt_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"} ; shift + _G_match_lt_parse_options=false + break + ;; + esac + $_G_match_lt_parse_options && _G_rc_lt_parse_options=: + done + + if $_G_rc_lt_parse_options; then + # save modified positional parameters for caller + func_quote eval ${1+"$@"} + libtool_parse_options_result=$func_quote_result + fi +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host_os in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + cygwin* | mingw* | windows* | pw32* | cegcc* | solaris2* | os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote eval ${1+"$@"} + libtool_validate_options_result=$func_quote_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, windows, cygwin, or some other w32 environment. Relies on a +# correctly configured wine environment available, with the winepath program +# in $build's $PATH. Assumes ARG has no leading or trailing path separator +# characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_arg pretty "$libobj" + test "X$libobj" != "X$func_quote_arg_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | windows* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + 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 yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; 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." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_arg pretty "$srcfile" + qsrcfile=$func_quote_arg_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + 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." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + 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." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build 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, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [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 + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG + -Xcompiler FLAG pass FLAG directly to the compiler + +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: $progname [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: $progname [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: $progname [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 following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [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 + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -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-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -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 + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wa,FLAG + -Xassembler FLAG pass linker-specific FLAG directly to the assembler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +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: $progname [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." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + 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 + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # 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 $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + 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 the '-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" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_arg pretty "$nonopt" + install_prog="$func_quote_arg_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_arg pretty "$arg" + func_append install_prog "$func_quote_arg_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_arg pretty "$arg" + func_append install_prog " $func_quote_arg_result" + if test -n "$arg2"; then + func_quote_arg pretty "$arg2" + fi + func_append install_shared_prog " $func_quote_arg_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_arg pretty "$install_override_mode" + func_append install_shared_prog " -m $func_quote_arg_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + 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 + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | windows* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append 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 + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw* | *windows*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_arg expand,pretty "$relink_command" + eval "func_echo $func_quote_arg_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *windows* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *windows* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *windows* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + case $host in + i[3456]86-*-mingw32*) + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + ;; + *) + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/__nm_//' >> '$nlist'" + ;; + esac + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # 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" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + 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/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + 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*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *windows* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + 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 "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw/windows +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw/windows-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# 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. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + func_quote_arg pretty "$ECHO" + qECHO=$func_quote_arg_result + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=$qECHO + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw* | *-*-windows* | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED '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 \"\$file\" | $SED '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 \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw/windows when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + 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 "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $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 "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # 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 \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${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\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#if defined _WIN32 && !defined __GNUC__ +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +_CRTIMP int __cdecl _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw* | windows*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that 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 + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + temp_rpath_tail= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + rpath_arg= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_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 + func_quote_arg pretty,unquoted "$arg" + qarg=$func_quote_arg_unquoted_result + func_append libtool_args " $func_quote_arg_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "argument to -rpath is not absolute: $arg" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xassembler) + func_append compiler_flags " -Xassembler $qarg" + prev= + func_append compile_command " -Xassembler $qarg" + func_append finalize_command " -Xassembler $qarg" + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + 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 + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + # Solaris ld rejects as of 11.4. Refer to Oracle bug 22985199. + -pthread) + case $host in + *solaris2*) ;; + *) + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + ;; + esac + continue + ;; + -mt|-mthreads|-kthread|-Kthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-fopenmp=*|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "argument ($arg) to '-R' is not an absolute path: $dir" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_arg pretty "$flag" + func_append arg " $func_quote_arg_result" + func_append compiler_flags " $func_quote_arg_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_arg pretty "$flag" + func_append arg " $wl$func_quote_arg_result" + func_append compiler_flags " $wl$func_quote_arg_result" + func_append linker_flags " $func_quote_arg_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xassembler) + prev=xassembler + continue + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -specs=* GCC specs files + # -stdlib=* select c++ std lib with clang + # -fdiagnostics-color* simply affects output + # -frecord-gcc-switches used to verify flags were respected + # -fsanitize=* Clang/GCC memory and address sanitizer + # -fno-sanitize* Clang/GCC memory and address sanitizer + # -shared-libsan Link with shared sanitizer runtimes (Clang) + # -static-libsan Link with static sanitizer runtimes (Clang) + # -no-canonical-prefixes Do not expand any symbolic links + # -fuse-ld=* Linker select flags for GCC + # -static-* direct GCC to link specific libraries statically + # -fcilkplus Cilk Plus language extension features for C/C++ + # -rtlib=* select c runtime lib with clang + # --unwindlib=* select unwinder library with clang + # -f{file|debug|macro|profile}-prefix-map=* needed for lto linking + # -Wa,* Pass flags directly to the assembler + # -Werror, -Werror=* Report (specified) warnings as errors + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-no-canonical-prefixes| \ + -stdlib=*|-rtlib=*|--unwindlib=*| \ + -specs=*|-fsanitize=*|-fno-sanitize*|-shared-libsan|-static-libsan| \ + -ffile-prefix-map=*|-fdebug-prefix-map=*|-fmacro-prefix-map=*|-fprofile-prefix-map=*| \ + -fdiagnostics-color*|-frecord-gcc-switches| \ + -fuse-ld=*|-static-*|-fcilkplus|-Wa,*|-Werror|-Werror=*) + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + if test -n "$rpath_arg"; then + func_append finalize_rpath " ${arg##*,}" + unset rpath_arg + else + case $arg in + -Wl,-rpath,*) + func_append finalize_rpath " ${arg##*,}";; + -Wl,-rpath) + rpath_arg=1;; + *) + func_append compile_command " $arg" + func_append finalize_command " $arg" + esac + fi + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-fopenmp=*|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + func_warning "Linking the shared library $output against the static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + func_warning "Trying to link with static lib archive $deplib." + func_warning "I have the capability to make that library automatically link in when" + func_warning "you link to this library. But I can only do this if you have a" + func_warning "shared version of the library, which you do not appear to have" + func_warning "because the file extensions .$libext of this argument makes me believe" + func_warning "that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *windows* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) case $absdir in + "$progdir/"*) func_append temp_rpath "$absdir:" ;; + *) func_append temp_rpath_tail "$absdir:" ;; + esac + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) case $absdir in + "$progdir/"*) func_append compile_rpath " $absdir" ;; + esac + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host_os in + cygwin* | mingw* | windows* | cegcc* | os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + func_warning "Linking the executable $output against the loadable module" + else + func_warning "Linking the shared library $output against the loadable module" + fi + func_warning "$linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) case $absdir in + "$progdir/"*) func_append compile_rpath " $absdir" ;; + esac + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host_os in + cygwin* | mingw* | windows* | cegcc* | os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + func_warning "lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + func_warning "And there doesn't seem to be a static archive available" + func_warning "The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$lt_sysroot$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$lt_sysroot$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # 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 unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + func_warning "This system cannot link to static lib archive $lib." + func_warning "I have the capability to make that library automatically link in when" + func_warning "you link to this library. But I can only do this if you have a" + func_warning "shared version of the library, which you do not appear to have." + if test yes = "$module"; then + func_warning "But as you try to build a module library, libtool will still create " + func_warning "a static module, that should work as long as the dlopening application" + func_warning "is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + func_warning "However, this would only work if libtool was able to extract symbol" + func_warning "lists from a program, using 'nm' or equivalent, but libtool could" + func_warning "not find such a program. So, this module is probably useless." + func_warning "'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + + func_append temp_rpath "$temp_rpath_tail" + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: new_libs="$deplib $new_libs" + for deplib in $tmp_libs; do + if $opt_preserve_dup_deps; then + new_libs="$deplib $new_libs" + else + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. And if not possible for portability + # reasons, then --preserve-dup-deps should be used. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + fi + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | $SED 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + func_warning "Linking the shared library $output against the non-libtool objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|midnightbsd-elf|osf|qnx|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|sco|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf | midnightbsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # 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 behavior. + newdeplibs=$deplibs + ;; + file_magic*) + set dummy $deplibs_check_method; shift + file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + if test -n "$file_magic_glob"; then + libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` + else + libnameglob=$libname + fi + test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + if test yes = "$want_nocaseglob"; then + shopt -s nocaseglob + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + 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 "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + func_warning "Linker path does not have real file for library $a_deplib." + func_warning "I have the capability to make that library automatically link in when" + func_warning "you link to this library. But I can only do this if you have a" + func_warning "shared version of the library, which you do not appear to have" + func_warning "because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + func_warning "with $libname but no candidates were found. (...for file magic test)" + else + func_warning "with $libname and none of the candidates passed a file format test" + func_warning "using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + func_warning "Linker path does not have real file for library $a_deplib." + func_warning "I have the capability to make that library automatically link in when" + func_warning "you link to this library. But I can only do this if you have a" + func_warning "shared version of the library, which you do not appear to have" + func_warning "because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + func_warning "with $libname but no candidates were found. (...for regex pattern test)" + else + func_warning "with $libname and none of the candidates passed a file format test" + func_warning "using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + func_warning "Inter-library dependencies are not supported in this platform." + else + func_warning "Inter-library dependencies are not known to be supported." + fi + func_warning "All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + func_warning "libtool could not satisfy all declared inter-library" + func_warning "dependencies of module $libname. Therefore, libtool will create" + func_warning "a static module, that should work as long as the dlopening" + func_warning "application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + func_warning "However, this would only work if libtool was able to extract symbol" + func_warning "lists from a program, using 'nm' or equivalent, but libtool could" + func_warning "not find such a program. So, this module is probably useless." + func_warning "'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; 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." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # 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 yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + 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"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append 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 "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | windows* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_arg expand,pretty "$cmd" + eval "func_echo $func_quote_arg_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_arg expand,pretty "$cmd" + eval "func_echo $func_quote_arg_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_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 yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_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= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${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" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + 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 "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append 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"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + 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"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append 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 + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* | *windows* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + 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 + func_append 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 + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_arg pretty "$var_value" + relink_command="$var=$func_quote_arg_result; export $var; $relink_command" + fi + done + func_quote eval cd "`pwd`" + func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)" + relink_command=$func_quote_arg_unquoted_result + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* | windows* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_arg pretty,unquoted "$var_value" + relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + func_quote eval cd "`pwd`" + relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + func_quote_arg pretty,unquoted "$relink_command" + relink_command=$func_quote_arg_unquoted_result + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *windows*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/build/make_exports.awk b/build/make_exports.awk new file mode 100644 index 0000000..1cf0568 --- /dev/null +++ b/build/make_exports.awk @@ -0,0 +1,162 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +BEGIN { + printf("/*\n") + printf(" * THIS FILE WAS AUTOGENERATED BY make_exports.awk\n") + printf(" *\n") + printf(" * This is an ugly hack that needs to be here, so\n") + printf(" * that libtool will link all of the APR functions\n") + printf(" * into server regardless of whether the base server\n") + printf(" * uses them.\n") + printf(" */\n") + printf("\n") + + for (i = 1; i < ARGC; i++) { + file = ARGV[i] + sub("([^/]*[/])*", "", file) + printf("#include \"%s\"\n", file) + } + + printf("\n") + printf("const void *ap_ugly_hack = NULL;\n") + printf("\n") + + TYPE_NORMAL = 0 + TYPE_HEADER = 1 + + stackptr = 0 +} + +function push(line) { + stack[stackptr] = line + stackptr++ +} + +function do_output() { + printf("/*\n") + printf(" * %s\n", FILENAME) + printf(" */\n") + + for (i = 0; i < stackptr; i++) { + printf("%s\n", stack[i]) + } + + stackptr = 0 + + printf("\n"); +} + +function enter_scope(type) { + scope++ + scope_type[scope] = type + scope_stack[scope] = stackptr + delete scope_used[scope] +} + +function leave_scope() { + used = scope_used[scope] + + if (!used) + stackptr = scope_stack[scope] + + scope-- + if (used) { + scope_used[scope] = 1 + + if (!scope) + do_output() + } +} + +function add_symbol(symbol) { + if (!index(symbol, "#")) { + push("const void *ap_hack_" symbol " = (const void *)" symbol ";") + scope_used[scope] = 1 + } +} + +/^[ \t]*AP[RU]?_(CORE_)?DECLARE[^(]*[(][^)]*[)]([^ ]* )*[^(]+[(]/ { + sub("[ \t]*AP[RU]?_(CORE_)?DECLARE[^(]*[(][^)]*[)][ \t]*", "") + sub("[(].*", "") + sub("([^ ]* (^([ \t]*[(])))+", "") + + add_symbol($0) + next +} + +/^[ \t]*AP_DECLARE_HOOK[^(]*[(][^)]*/ { + split($0, args, ",") + symbol = args[2] + sub("^[ \t]+", "", symbol) + sub("[ \t]+$", "", symbol) + + add_symbol("ap_hook_" symbol) + add_symbol("ap_hook_get_" symbol) + add_symbol("ap_run_" symbol) + next +} + +/^[ \t]*APR_POOL_DECLARE_ACCESSOR[^(]*[(][^)]*[)]/ { + sub("[ \t]*APR_POOL_DECLARE_ACCESSOR[^(]*[(]", "", $0) + sub("[)].*$", "", $0) + add_symbol("apr_" $0 "_pool_get") + next +} + +/^[ \t]*APR_DECLARE_INHERIT_SET[^(]*[(][^)]*[)]/ { + sub("[ \t]*APR_DECLARE_INHERIT_SET[^(]*[(]", "", $0) + sub("[)].*$", "", $0) + add_symbol("apr_" $0 "_inherit_set") + next +} + +/^[ \t]*APR_DECLARE_INHERIT_UNSET[^(]*[(][^)]*[)]/ { + sub("[ \t]*APR_DECLARE_INHERIT_UNSET[^(]*[(]", "", $0) + sub("[)].*$", "", $0) + add_symbol("apr_" $0 "_inherit_unset") + next +} + +/^#[ \t]*if(ndef| !defined[(])([^_]*_)*H/ { + enter_scope(TYPE_HEADER) + next +} + +/^#[ \t]*if([n]?def)? / { + enter_scope(TYPE_NORMAL) + push($0) + next +} + +/^#[ \t]*endif/ { + if (scope_type[scope] == TYPE_NORMAL) + push($0) + + leave_scope() + next +} + +/^#[ \t]*else/ { + push($0) + next +} + +/^#[ \t]*elif/ { + push($0) + next +} + + diff --git a/build/make_nw_export.awk b/build/make_nw_export.awk new file mode 100644 index 0000000..8a5338c --- /dev/null +++ b/build/make_nw_export.awk @@ -0,0 +1,118 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Based on apr's make_export.awk, which is +# based on Ryan Bloom's make_export.pl +# + +BEGIN { +} + +function add_symbol(sym_name) { + sub(" ", "", sym_name) + exports[++idx] = sym_name +} + +# List of functions that we don't support, yet?? +#/ap_some_name/{next} +/ap_mpm_pod_/{next} + +/^[ \t]*(AP|DAV|CACHE)([RU]|_CORE)?_DECLARE[^(]*[(][^)]*[)]([^ ]* )*[^(]+[(]/ { + sub("[ \t]*(AP|DAV|CACHE)([RU]|_CORE)?_DECLARE[^(]*[(][^)]*[)][ \t]*", "") + sub("[(].*", "") + sub("([^ ]* (^([ \t]*[(])))+", "") + add_symbol($0) + next +} + +/^[ \t]*AP_DECLARE_HOOK[^(]*[(][^)]*/ { + split($0, args, ",") + symbol = args[2] + sub("^[ \t]+", "", symbol) + sub("[ \t]+$", "", symbol) + add_symbol("ap_hook_" symbol) + add_symbol("ap_hook_get_" symbol) + add_symbol("ap_run_" symbol) + next +} + +/^[ \t]*AP[RU]?_DECLARE_EXTERNAL_HOOK[^(]*[(][^)]*/ { + split($0, args, ",") + prefix = args[1] + sub("^.*[(]", "", prefix) + symbol = args[4] + sub("^[ \t]+", "", symbol) + sub("[ \t]+$", "", symbol) + add_symbol(prefix "_hook_" symbol) + add_symbol(prefix "_hook_get_" symbol) + add_symbol(prefix "_run_" symbol) + next +} + +/^[ \t]*APR_POOL_DECLARE_ACCESSOR[^(]*[(][^)]*[)]/ { + sub("[ \t]*APR_POOL_DECLARE_ACCESSOR[^(]*[(]", "", $0) + sub("[)].*$", "", $0) + add_symbol("apr_" $0 "_pool_get") + next +} + +/^[ \t]*APR_DECLARE_INHERIT_SET[^(]*[(][^)]*[)]/ { + sub("[ \t]*APR_DECLARE_INHERIT_SET[^(]*[(]", "", $0) + sub("[)].*$", "", $0) + add_symbol("apr_" $0 "_inherit_set") + next +} + +/^[ \t]*APR_DECLARE_INHERIT_UNSET[^(]*[(][^)]*[)]/ { + sub("[ \t]*APR_DECLARE_INHERIT_UNSET[^(]*[(]", "", $0) + sub("[)].*$", "", $0) + add_symbol("apr_" $0 "_inherit_unset") + next +} + +/^[ \t]*(extern[ \t]+)?AP[RU]?_DECLARE_DATA .*;/ { + gsub(/[*;\n\r]/, "") + gsub(/\[.*\]/, "") + add_symbol($NF) +} + + +END { + printf("Added %d symbols to export list.\n", idx) > "/dev/stderr" + # sort symbols with shell sort + increment = int(idx / 2) + while (increment > 0) { + for (i = increment+1; i <= idx; i++) { + j = i + temp = exports[i] + while ((j >= increment+1) && (exports[j-increment] > temp)) { + exports[j] = exports[j-increment] + j -= increment + } + exports[j] = temp + } + if (increment == 2) + increment = 1 + else + increment = int(increment*5/11) + } + # print the array + printf(" (%s)\n", EXPPREFIX) + while (x < idx - 1) { + printf(" %s,\n", exports[++x]) + } + printf(" %s\n", exports[++x]) +} + diff --git a/build/make_var_export.awk b/build/make_var_export.awk new file mode 100644 index 0000000..b28e20e --- /dev/null +++ b/build/make_var_export.awk @@ -0,0 +1,75 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# Based on apr's make_export.awk, which is +# based on Ryan Bloom's make_export.pl + +/^#[ \t]*if(def)? (AP[RU]?_|!?defined).*/ { + if (old_filename != FILENAME) { + if (old_filename != "") printf("%s", line) + macro_no = 0 + found = 0 + count = 0 + old_filename = FILENAME + line = "" + } + macro_stack[macro_no++] = macro + macro = substr($0, length($1)+2) + count++ + line = line "#ifdef " macro "\n" + next +} + +/^#[ \t]*endif/ { + if (count > 0) { + count-- + line = line "#endif /* " macro " */\n" + macro = macro_stack[--macro_no] + } + if (count == 0) { + if (found != 0) { + printf("%s", line) + } + line = "" + } + next +} + +function add_symbol (sym_name) { + if (count) { + found++ + } + for (i = 0; i < count; i++) { + line = line "\t" + } + line = line sym_name "\n" + + if (count == 0) { + printf("%s", line) + line = "" + } +} + +/^[ \t]*(extern[ \t]+)?AP[RU]?_DECLARE_DATA .*;$/ { + varname = $NF; + gsub( /[*;]/, "", varname); + gsub( /\[.*\]/, "", varname); + add_symbol(varname); +} + +END { + printf("%s", line) +} diff --git a/build/mkconfNW.awk b/build/mkconfNW.awk new file mode 100644 index 0000000..c0028ce --- /dev/null +++ b/build/mkconfNW.awk @@ -0,0 +1,161 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +BEGIN { + A["ServerRoot"] = "\${SRVROOT}" + A["Port"] = PORT + A["SSLPort"] = SSLPORT + A["cgidir"] = "cgi-bin" + A["logfiledir"] = "logs" + A["htdocsdir"] = "htdocs" + A["sysconfdir"] = "conf" + A["iconsdir"] = "icons" + A["manualdir"] = "manual" + A["runtimedir"] = "logs" + A["errordir"] = "error" + A["proxycachedir"] = "proxy" + + B["htdocsdir"] = A["ServerRoot"]"/"A["htdocsdir"] + B["iconsdir"] = A["ServerRoot"]"/"A["iconsdir"] + B["manualdir"] = A["ServerRoot"]"/"A["manualdir"] + B["errordir"] = A["ServerRoot"]"/"A["errordir"] + B["proxycachedir"] = A["ServerRoot"]"/"A["proxycachedir"] + B["cgidir"] = A["ServerRoot"]"/"A["cgidir"] + B["logfiledir"] = A["logfiledir"] + B["sysconfdir"] = A["sysconfdir"] + B["runtimedir"] = A["runtimedir"] +} + +/^ServerRoot / { + print "Define SRVROOT \"SYS:/" BDIR "\"" + print "" +} +/@@LoadModule@@/ { + print "#LoadModule access_compat_module modules/accesscompat.nlm" + print "#LoadModule actions_module modules/actions.nlm" + print "#LoadModule allowmethods_module modules/allowmethods.nlm" + print "#LoadModule auth_basic_module modules/authbasc.nlm" + print "#LoadModule auth_digest_module modules/authdigt.nlm" + print "#LoadModule authn_anon_module modules/authnano.nlm" + print "#LoadModule authn_dbd_module modules/authndbd.nlm" + print "#LoadModule authn_dbm_module modules/authndbm.nlm" + print "#LoadModule authn_file_module modules/authnfil.nlm" + print "#LoadModule authz_dbd_module modules/authzdbd.nlm" + print "#LoadModule authz_dbm_module modules/authzdbm.nlm" + print "#LoadModule authz_groupfile_module modules/authzgrp.nlm" + print "#LoadModule authz_user_module modules/authzusr.nlm" + print "#LoadModule authnz_ldap_module modules/authnzldap.nlm" + print "#LoadModule ldap_module modules/utilldap.nlm" + print "#LoadModule asis_module modules/mod_asis.nlm" + print "LoadModule autoindex_module modules/autoindex.nlm" + print "#LoadModule buffer_module modules/modbuffer.nlm" + print "#LoadModule cern_meta_module modules/cernmeta.nlm" + print "LoadModule cgi_module modules/mod_cgi.nlm" + print "#LoadModule data_module modules/mod_data.nlm" + print "#LoadModule dav_module modules/mod_dav.nlm" + print "#LoadModule dav_fs_module modules/moddavfs.nlm" + print "#LoadModule dav_lock_module modules/moddavlk.nlm" + print "#LoadModule expires_module modules/expires.nlm" + print "#LoadModule filter_module modules/mod_filter.nlm" + print "#LoadModule ext_filter_module modules/extfiltr.nlm" + print "#LoadModule file_cache_module modules/filecach.nlm" + print "#LoadModule headers_module modules/headers.nlm" + print "#LoadModule ident_module modules/modident.nlm" + print "#LoadModule imagemap_module modules/imagemap.nlm" + print "#LoadModule info_module modules/info.nlm" + print "#LoadModule log_forensic_module modules/forensic.nlm" + print "#LoadModule logio_module modules/modlogio.nlm" + print "#LoadModule mime_magic_module modules/mimemagi.nlm" + print "#LoadModule proxy_module modules/proxy.nlm" + print "#LoadModule proxy_connect_module modules/proxycon.nlm" + print "#LoadModule proxy_http_module modules/proxyhtp.nlm" + print "#LoadModule proxy_ftp_module modules/proxyftp.nlm" + print "#LoadModule rewrite_module modules/rewrite.nlm" + print "#LoadModule speling_module modules/speling.nlm" + print "#LoadModule status_module modules/status.nlm" + print "#LoadModule unique_id_module modules/uniqueid.nlm" + print "#LoadModule usertrack_module modules/usertrk.nlm" + print "#LoadModule version_module modules/modversion.nlm" + print "#LoadModule userdir_module modules/userdir.nlm" + print "#LoadModule vhost_alias_module modules/vhost.nlm" + if (MODSSL) { + print "#LoadModule socache_dbm_module modules/socachedbm.nlm" + print "#LoadModule socache_shmcb_module modules/socacheshmcb.nlm" + print "#LoadModule ssl_module modules/mod_ssl.nlm" + } + print "" + next +} + +match ($0,/^#SSLSessionCache +"dbm:/) { + sub(/^#/, "") +} + +match ($0,/^SSLSessionCache +"shmcb:/) { + sub(/^SSLSessionCache/, "#SSLSessionCache") +} + +match ($0,/^# Mutex +default +file:@rel_runtimedir@/) { + sub(/file:@rel_runtimedir@/, "default") +} + +match ($0,/@@.*@@/) { + s=substr($0,RSTART+2,RLENGTH-4) + sub(/@@.*@@/,A[s],$0) +} + +match ($0,/@rel_.*@/) { + s=substr($0,RSTART+5,RLENGTH-6) + sub(/@rel_.*@/,A[s],$0) +} + +match ($0,/@exp_.*@/) { + s=substr($0,RSTART+5,RLENGTH-6) + sub(/@exp_.*@/,B[s],$0) +} + +match ($0,/@nonssl_.*@/) { + s=substr($0,RSTART+8,RLENGTH-9) + sub(/@nonssl_.*@/,B[s],$0) +} + +match ($0,/^$/) { + print "#" + print "# CGIMapExtension: Technique for locating the interpreter for CGI scripts." + print "# The special interpreter path \"OS\" can be used for NLM CGIs." + print "#" + print "#CGIMapExtension OS .cgi" + print "CGIMapExtension SYS:/perl/Perlcgi/perlcgi.nlm .pl" + print "" +} + +{ + print +} + +END { + if ((ARGV[1] ~ /httpd.conf.in/) && !BSDSKT) { + print "" + print "#" + print "# SecureListen: Allows you to securely bind Apache to specific IP addresses " + print "# and/or ports (mod_nwssl)." + print "#" + print "# Change this to SecureListen on specific IP addresses as shown below to " + print "# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)" + print "#" + print "#SecureListen "SSLPORT" \"SSL CertificateDNS\"" + } + print "" +} diff --git a/build/mkdep.perl b/build/mkdep.perl new file mode 100644 index 0000000..7f776d8 --- /dev/null +++ b/build/mkdep.perl @@ -0,0 +1,90 @@ +#!/usr/bin/perl +# +# Created: Thu Aug 15 11:57:33 1996 too +# Last modified: Mon Dec 27 09:23:56 1999 too +# +# Copyright (c) 1996-1999 Tomi Ollila. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +die "Usage: mkdep CPP-command [CPP options] file1 [file2...]\n" + if ($#ARGV < 1); + +$cmdl = shift(@ARGV); + +$cmdl = "$cmdl " . shift (@ARGV) while ($ARGV[0] =~ /^-[A-Z]/); + +while ($file = shift(@ARGV)) +{ + $file =~ s/\.o$/.c/; + + open(F, "$cmdl $file|"); + + &parseout; + + close(F); +} + + +sub initinit +{ + %used = (); + $of = $file; + $of =~ s/\.c$/.lo/; + $str = "$of:\t$file"; + $len = length $str; +} + +sub initstr +{ + $str = "\t"; + $len = length $str; +} + +sub parseout +{ + &initinit; + while () + { + s/\\\\/\//g; + next unless (/^# [0-9]* "(.*\.h)"/); + + next if ($1 =~ /^\//); + + next if $used{$1}; + + $used{$1} = 1; + + $nlen = length($1) + 1; + + if ($len + $nlen > 72) + { + print $str, "\\\n"; + &initstr; + $str = $str . $1; + } + else { $str = $str . " " . $1; } + + $len += $nlen; + + } + print $str, "\n"; +} diff --git a/build/mkdir.sh b/build/mkdir.sh new file mode 100755 index 0000000..e2d5bb6 --- /dev/null +++ b/build/mkdir.sh @@ -0,0 +1,48 @@ +#!/bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# mkdir.sh -- make directory hierarchy +# +# Based on `mkinstalldirs' from Noah Friedman +# as of 1994-03-25, which was placed in the Public Domain. +# Cleaned up for Apache's Autoconf-style Interface (APACI) +# by Ralf S. Engelschall + +umask 022 +errstatus=0 +for file in ${1+"$@"} ; do + set fnord `echo ":$file" |\ + sed -e 's/^:\//%/' -e 's/^://' -e 's/\// /g' -e 's/^%/\//'` + shift + pathcomp= + for d in ${1+"$@"}; do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + ?: ) pathcomp="$pathcomp/" + continue ;; + esac + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" 1>&2 + mkdir "$pathcomp" || errstatus=$? + fi + pathcomp="$pathcomp/" + done +done +exit $errstatus + diff --git a/build/nw_export.inc b/build/nw_export.inc new file mode 100644 index 0000000..f0a26f5 --- /dev/null +++ b/build/nw_export.inc @@ -0,0 +1,67 @@ +/* Must include ap_config.h first so that we can redefine + the standard prototypes macros after it messes with + them. */ +#include "ap_config.h" + +/* Define all of the standard prototype macros as themselves + so that httpd.h will not mess with them. This allows + them to pass untouched so that the AWK script can pick + them out of the preprocessed result file. */ +#undef AP_DECLARE +#define AP_DECLARE AP_DECLARE +#undef AP_CORE_DECLARE +#define AP_CORE_DECLARE AP_CORE_DECLARE +#undef AP_DECLARE_NONSTD +#define AP_DECLARE_NONSTD AP_DECLARE_NONSTD +#undef AP_CORE_DECLARE_NONSTD +#define AP_CORE_DECLARE_NONSTD AP_CORE_DECLARE_NONSTD +#undef AP_DECLARE_HOOK +#define AP_DECLARE_HOOK AP_DECLARE_HOOK +#undef AP_DECLARE_DATA +#define AP_DECLARE_DATA AP_DECLARE_DATA +#undef APR_DECLARE_OPTIONAL_FN +#define APR_DECLARE_OPTIONAL_FN APR_DECLARE_OPTIONAL_FN +#undef APR_DECLARE_EXTERNAL_HOOK +#define APR_DECLARE_EXTERNAL_HOOK APR_DECLARE_EXTERNAL_HOOK +#undef APACHE_OS_H + +#include "httpd.h" + +/* Preprocess all of the standard HTTPD headers. */ +#include "ap_compat.h" +#include "ap_listen.h" +#include "ap_mmn.h" +#include "ap_mpm.h" +#include "ap_provider.h" +#include "ap_release.h" +#include "ap_expr.h" +#include "http_config.h" +#include "http_connection.h" +#include "http_core.h" +#include "http_log.h" +#include "http_main.h" +#include "http_protocol.h" +#include "http_request.h" +#include "http_ssl.h" +#include "http_vhost.h" +#include "mpm_common.h" +#include "ap_regex.h" +#include "scoreboard.h" +#include "util_cfgtree.h" +#include "util_charset.h" +#include "util_cookies.h" +#include "util_ebcdic.h" +#include "util_fcgi.h" +#include "util_filter.h" +/*#include "util_ldap.h"*/ +#include "util_md5.h" +#include "util_mutex.h" +#include "util_script.h" +#include "util_time.h" +#include "util_varbuf.h" +#include "util_xml.h" + +#include "mod_core.h" +#include "mod_auth.h" +#include "mod_watchdog.h" + diff --git a/build/nw_ver.awk b/build/nw_ver.awk new file mode 100644 index 0000000..22c7bc4 --- /dev/null +++ b/build/nw_ver.awk @@ -0,0 +1,62 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +BEGIN { + # fetch Apache version numbers from input file and write them to STDOUT + + while ((getline < ARGV[1]) > 0) { + if (match ($0, /^#define AP_SERVER_COPYRIGHT \\/)) { + if (((getline < ARGV[1]) > 0) && (split($0, c, "\"") == 3)) { + copyright_str = c[2]; + } + } + else if (match ($0, /^#define AP_SERVER_MAJORVERSION_NUMBER /)) { + ver_major = $3; + } + else if (match ($0, /^#define AP_SERVER_MINORVERSION_NUMBER /)) { + ver_minor = $3; + } + else if (match ($0, /^#define AP_SERVER_PATCHLEVEL_NUMBER/)) { + ver_patch = $3; + } + else if (match ($0, /^#define AP_SERVER_DEVBUILD_BOOLEAN/)) { + ver_devbuild = $3; + } + } + + if (ver_devbuild) { + ver_dev = "-dev" + if (ARGV[2]) { + while ((getline < ARGV[2]) > 0) { + if (match ($0, /^\/repos\/asf\/!svn\/ver\/[0-9]+\/httpd\/httpd\/(trunk|branches\/[0-9]\.[0-9]\.x)$/)) { + gsub(/^\/repos\/asf\/!svn\/ver\/|\/httpd\/httpd\/(trunk|branches\/[0-9]\.[0-9]\.x)$/, "", $0) + ver_dev = svn_rev = "-r" $0 + } + } + } + } + + ver_nlm = ver_major "," ver_minor "," ver_patch; + ver_str = ver_major "." ver_minor "." ver_patch ver_dev; + + print "VERSION = " ver_nlm ""; + print "VERSION_STR = " ver_str ""; + print "VERSION_MAJMIN = " ver_major ver_minor ""; + print "COPYRIGHT_STR = " copyright_str ""; + print "SVN_REVISION = " svn_rev ""; + +} + + diff --git a/build/pkg/README b/build/pkg/README new file mode 100644 index 0000000..147c1f1 --- /dev/null +++ b/build/pkg/README @@ -0,0 +1,16 @@ +The script in this directory will attempt to build a Solaris package +out of a source tree for httpd. + +To build a package, make sure you are in the root of the source tree, +and run: + +build/pkg/buildpkg.sh + +A Solaris package called httpd---local.gz will be +created in the root of the source tree. + +By default, the script will attempt to find a system installed version of +APR and APR-util v1. You may override the location of apr or apr-util like so: + +build/pkg/buildpkg.sh --with-apr=some/other/path --with-apr-util=some/other/path + diff --git a/build/pkg/buildpkg.sh b/build/pkg/buildpkg.sh new file mode 100755 index 0000000..0281240 --- /dev/null +++ b/build/pkg/buildpkg.sh @@ -0,0 +1,94 @@ +#!/bin/sh +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# + +# buildpkg.sh: This script builds a Solaris PKG from the source tree +# provided. + +LAYOUT=Apache +PREFIX=/usr/local/apache2 +TEMPDIR=/var/tmp/$USER/httpd-root +rm -rf $TEMPDIR + +apr_config=`which apr-1-config` +apu_config=`which apu-1-config` + +while test $# -gt 0 +do + # Normalize + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + case "$1" in + --with-apr=*) + apr_config=$optarg + ;; + esac + + case "$1" in + --with-apr-util=*) + apu_config=$optarg + ;; + esac + + shift +done + +if [ ! -f "$apr_config" -a ! -f "$apr_config/configure.in" ]; then + echo "The apr source directory / apr-1-config could not be found" + echo "Usage: buildpkg [--with-apr=[dir|file]] [--with-apr-util=[dir|file]]" + exit 1 +fi + +if [ ! -f "$apu_config" -a ! -f "$apu_config/configure.in" ]; then + echo "The apu source directory / apu-1-config could not be found" + echo "Usage: buildpkg [--with-apr=[dir|file]] [--with-apr-util=[dir|file]]" + exit 1 +fi + +./configure --enable-layout=$LAYOUT \ + --with-apr=$apr_config \ + --with-apr-util=$apu_config \ + --enable-mods-shared=all \ + --with-devrandom \ + --with-ldap --enable-ldap --enable-authnz-ldap \ + --enable-cache --enable-disk-cache --enable-mem-cache \ + --enable-ssl --with-ssl \ + --enable-deflate --enable-cgid \ + --enable-proxy --enable-proxy-connect \ + --enable-proxy-http --enable-proxy-ftp + +make +make install DESTDIR=$TEMPDIR +. build/pkg/pkginfo +cp build/pkg/pkginfo $TEMPDIR$PREFIX + +current=`pwd` +cd $TEMPDIR$PREFIX +echo "i pkginfo=./pkginfo" > prototype +find . -print | grep -v ./prototype | grep -v ./pkginfo | pkgproto | awk '{print $1" "$2" "$3" "$4" root bin"}' >> prototype +mkdir $TEMPDIR/pkg +pkgmk -r $TEMPDIR$PREFIX -d $TEMPDIR/pkg + +cd $current +pkgtrans -s $TEMPDIR/pkg $current/$NAME-$VERSION-$ARCH-local +gzip $current/$NAME-$VERSION-$ARCH-local + +rm -rf $TEMPDIR + diff --git a/build/pkg/pkginfo.in b/build/pkg/pkginfo.in new file mode 100644 index 0000000..928dad4 --- /dev/null +++ b/build/pkg/pkginfo.in @@ -0,0 +1,11 @@ +PKG="ASFhttpd" +NAME="httpd" +ARCH="@target_cpu@" +VERSION="@HTTPD_VERSION@" +CATEGORY="application" +VENDOR="Apache Software Foundation" +EMAIL="dev@httpd.apache.org" +PSTAMP="dev@httpd.apache.org" +BASEDIR="@prefix@" +CLASSES="none" + diff --git a/build/program.mk b/build/program.mk new file mode 100644 index 0000000..565b51f --- /dev/null +++ b/build/program.mk @@ -0,0 +1,23 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# The build environment was provided by Sascha Schumann. + +PROGRAM_OBJECTS = $(PROGRAM_SOURCES:.c=.lo) + +$(PROGRAM_NAME): $(PROGRAM_DEPENDENCIES) $(PROGRAM_OBJECTS) + $(PROGRAM_PRELINK) + $(LINK) $(PROGRAM_LDFLAGS) $(PROGRAM_OBJECTS) $(PROGRAM_LDADD) diff --git a/build/rpm/htcacheclean.init b/build/rpm/htcacheclean.init new file mode 100755 index 0000000..5aa10ab --- /dev/null +++ b/build/rpm/htcacheclean.init @@ -0,0 +1,100 @@ +#!/bin/bash +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# htcacheclean Startup script for the Apache cache cleaner +# +# chkconfig: - 85 15 +# description: The Apache htcacheclean daemon maintains and prunes the +# size of the mod_cache_disk cache directory. +# processname: htcacheclean +# pidfile: /var/log/httpd/htcacheclean.pid +# config: /etc/sysconfig/htcacheclean +# +### BEGIN INIT INFO +# Provides: htcacheclean +# Required-Start: $local_fs $remote_fs $network +# Required-Stop: $local_fs $remote_fs $network +# Should-Start: httpd +# Short-Description: start and stop Apache htcacheclean +# Description: The Apache htcacheclean daemon maintains a mod_cache_disk +### END INIT INFO + +# Source function library. +. /etc/rc.d/init.d/functions + +# What were we called? Multiple instances of the same daemon can be +# created by creating suitably named symlinks to this startup script +prog=$(basename $0 | sed -e 's/^[SK][0-9][0-9]//') + +if [ -f /etc/sysconfig/${prog} ]; then + . /etc/sysconfig/${prog} +fi + +# Path to htcacheclean, server binary, and short-form for messages. +htcacheclean=${HTTPD-/usr/sbin/htcacheclean} +lockfile=${LOCKFILE-/var/lock/subsys/${prog}} +pidfile=/var/run/${prog}.pid +interval=${INTERVAL-10} +cachepath=${CACHEPATH-/var/cache/httpd/cache-root} +limit=${LIMIT-100M} +RETVAL=0 + +start() { + echo -n $"Starting $prog: " + daemon --pidfile=${pidfile} $htcacheclean -d "$interval" -p "$cachepath" -l "$limit" -P "$pidfile" $OPTIONS + RETVAL=$? + echo + [ $RETVAL = 0 ] && touch ${lockfile} + return $RETVAL +} +stop() { + echo -n $"Stopping $prog: " + killproc -p ${pidfile} $htcacheclean + RETVAL=$? + echo + [ $RETVAL = 0 ] && rm -f ${lockfile} +} + +# See how we were called. +case "$1" in + start) + start + ;; + stop) + stop + ;; + status) + status -p ${pidfile} $htcacheclean + RETVAL=$? + ;; + restart) + stop + start + ;; + condrestart) + if status -p ${pidfile} $htcacheclean >&/dev/null; then + stop + start + fi + ;; + *) + echo $"Usage: $prog {start|stop|restart|condrestart|status|help}" + exit 1 +esac + +exit $RETVAL diff --git a/build/rpm/httpd.init b/build/rpm/httpd.init new file mode 100755 index 0000000..c8c6759 --- /dev/null +++ b/build/rpm/httpd.init @@ -0,0 +1,155 @@ +#!/bin/bash +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# httpd Startup script for the Apache Web Server +# +# chkconfig: - 85 15 +# description: The Apache HTTP Server is an efficient and extensible \ +# server implementing the current HTTP standards. +# processname: httpd +# pidfile: /var/run/httpd.pid +# config: /etc/sysconfig/httpd +# +### BEGIN INIT INFO +# Provides: httpd +# Required-Start: $local_fs $remote_fs $network $named +# Required-Stop: $local_fs $remote_fs $network +# Should-Start: distcache +# Short-Description: start and stop Apache HTTP Server +# Description: The Apache HTTP Server is an extensible server +# implementing the current HTTP standards. +### END INIT INFO + +# Source function library. +. /etc/rc.d/init.d/functions + +# What were we called? Multiple instances of the same daemon can be +# created by creating suitably named symlinks to this startup script +prog=$(basename $0 | sed -e 's/^[SK][0-9][0-9]//') + +if [ -f /etc/sysconfig/${prog} ]; then + . /etc/sysconfig/${prog} +fi + +# Start httpd in the C locale by default. +HTTPD_LANG=${HTTPD_LANG-"C"} + +# This will prevent initlog from swallowing up a pass-phrase prompt if +# mod_ssl needs a pass-phrase from the user. +INITLOG_ARGS="" + +# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server +# with the thread-based "worker" MPM; BE WARNED that some modules may not +# work correctly with a thread-based MPM; notably PHP will refuse to start. + +httpd=${HTTPD-/usr/sbin/httpd} +pidfile=${PIDFILE-/var/run/${prog}.pid} +lockfile=${LOCKFILE-/var/lock/subsys/${prog}} +RETVAL=0 + +# check for 1.3 configuration +check13 () { + CONFFILE=/etc/httpd/conf/httpd.conf + GONE="(ServerType|BindAddress|Port|AddModule|ClearModuleList|" + GONE="${GONE}AgentLog|RefererLog|RefererIgnore|FancyIndexing|" + GONE="${GONE}AccessConfig|ResourceConfig)" + if grep -Eiq "^[[:space:]]*($GONE)" $CONFFILE; then + echo + echo 1>&2 " Apache 1.3 configuration directives found" + echo 1>&2 " please read @docdir@/migration.html" + failure "Apache 1.3 config directives test" + echo + exit 1 + fi +} + +# The semantics of these two functions differ from the way apachectl does +# things -- attempting to start while running is a failure, and shutdown +# when not running is also a failure. So we just do it the way init scripts +# are expected to behave here. +start() { + echo -n $"Starting $prog: " + check13 || exit 1 + LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS + RETVAL=$? + echo + [ $RETVAL = 0 ] && touch ${lockfile} + return $RETVAL +} +stop() { + echo -n $"Stopping $prog: " + killproc -p ${pidfile} -d 10 $httpd + RETVAL=$? + echo + [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} +} +reload() { + echo -n $"Reloading $prog: " + check13 || exit 1 + killproc -p ${pidfile} $httpd -HUP + RETVAL=$? + echo +} + +# See how we were called. +case "$1" in + start) + start + ;; + stop) + stop + ;; + status) + if ! test -f ${pidfile}; then + echo $prog is stopped + RETVAL=3 + else + status -p ${pidfile} $httpd + RETVAL=$? + fi + ;; + restart) + stop + start + ;; + condrestart) + if test -f ${pidfile} && status -p ${pidfile} $httpd >&/dev/null; then + stop + start + fi + ;; + reload) + reload + ;; + configtest) + LANG=$HTTPD_LANG $httpd $OPTIONS -t + RETVAL=$? + ;; + graceful) + echo -n $"Gracefully restarting $prog: " + LANG=$HTTPD_LANG $httpd $OPTIONS -k $@ + RETVAL=$? + echo + ;; + *) + echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|graceful|help|configtest}" + exit 1 +esac + +exit $RETVAL + diff --git a/build/rpm/httpd.logrotate b/build/rpm/httpd.logrotate new file mode 100644 index 0000000..1a03e85 --- /dev/null +++ b/build/rpm/httpd.logrotate @@ -0,0 +1,8 @@ +/var/log/httpd/*log { + missingok + notifempty + sharedscripts + postrotate + /sbin/service httpd graceful 2> /dev/null || true + endscript +} diff --git a/build/rpm/httpd.spec.in b/build/rpm/httpd.spec.in new file mode 100644 index 0000000..c85881d --- /dev/null +++ b/build/rpm/httpd.spec.in @@ -0,0 +1,494 @@ +%define contentdir /var/www +%define suexec_caller apache +%define mmn APACHE_MMN + +Summary: Apache HTTP Server +Name: httpd +Version: APACHE_VERSION +Release: APACHE_RELEASE +URL: http://httpd.apache.org/ +Vendor: Apache Software Foundation +Source0: http://www.apache.org/dist/httpd/httpd-%{version}.tar.bz2 +License: Apache License, Version 2.0 +Group: System Environment/Daemons +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root +BuildRequires: autoconf, perl, pkgconfig, findutils +BuildRequires: zlib-devel, libselinux-devel, libuuid-devel +BuildRequires: apr-devel >= 1.4.0, apr-util-devel >= 1.4.0, pcre-devel >= 5.0 +Requires: initscripts >= 8.36, /etc/mime.types +Obsoletes: httpd-suexec +Requires(pre): /usr/sbin/useradd +Requires(post): chkconfig +Provides: webserver +Provides: mod_dav = %{version}-%{release}, httpd-suexec = %{version}-%{release} +Provides: httpd-mmn = %{mmn} + +%description +Apache is a powerful, full-featured, efficient, and freely-available +Web server. Apache is also the most popular Web server on the +Internet. + +%package devel +Group: Development/Libraries +Summary: Development tools for the Apache HTTP server. +Obsoletes: secureweb-devel, apache-devel +Requires: apr-devel, apr-util-devel, pkgconfig, libtool +Requires: httpd = %{version}-%{release} + +%description devel +The httpd-devel package contains the APXS binary and other files +that you need to build Dynamic Shared Objects (DSOs) for the +Apache HTTP Server. + +If you are installing the Apache HTTP server and you want to be +able to compile or develop additional modules for Apache, you need +to install this package. + +%package manual +Group: Documentation +Summary: Documentation for the Apache HTTP server. +Requires: httpd = :%{version}-%{release} +Obsoletes: secureweb-manual, apache-manual + +%description manual +The httpd-manual package contains the complete manual and +reference guide for the Apache HTTP server. The information can +also be found at http://httpd.apache.org/docs/. + +%package tools +Group: System Environment/Daemons +Summary: Tools for use with the Apache HTTP Server + +%description tools +The httpd-tools package contains tools which can be used with +the Apache HTTP Server. + +%package -n mod_authnz_ldap +Group: System Environment/Daemons +Summary: LDAP modules for the Apache HTTP server +BuildRequires: openldap-devel +Requires: httpd = %{version}-%{release}, httpd-mmn = %{mmn}, apr-util-ldap + +%description -n mod_authnz_ldap +The mod_authnz_ldap module for the Apache HTTP server provides +authentication and authorization against an LDAP server, while +mod_ldap provides an LDAP cache. + +%package -n mod_lua +Group: System Environment/Daemons +Summary: Lua language module for the Apache HTTP server +BuildRequires: lua-devel +Requires: httpd = %{version}-%{release}, httpd-mmn = %{mmn} + +%description -n mod_lua +The mod_lua module for the Apache HTTP server allows the server to be +extended with scripts written in the Lua programming language. + +%package -n mod_proxy_html +Group: System Environment/Daemons +Summary: Proxy HTML filter modules for the Apache HTTP server +Epoch: 1 +BuildRequires: libxml2-devel +Requires: httpd = 0:%{version}-%{release}, httpd-mmn = %{mmn} + +%description -n mod_proxy_html +The mod_proxy_html module for the Apache HTTP server provides +a filter to rewrite HTML links within web content when used within +a reverse proxy environment. The mod_xml2enc module provides +enhanced charset/internationalisation support for mod_proxy_html. + +%package -n mod_ssl +Group: System Environment/Daemons +Summary: SSL/TLS module for the Apache HTTP server +Epoch: 1 +BuildRequires: openssl-devel +Requires(post): openssl, /bin/cat +Requires(pre): httpd +Requires: httpd = 0:%{version}-%{release}, httpd-mmn = %{mmn} + +%description -n mod_ssl +The mod_ssl module provides strong cryptography for the Apache Web +server via the Secure Sockets Layer (SSL) and Transport Layer +Security (TLS) protocols. + +%prep +%setup -q + +# Safety check: prevent build if defined MMN does not equal upstream MMN. +vmmn=`echo MODULE_MAGIC_NUMBER_MAJOR | cpp -include include/ap_mmn.h | sed -n ' +/^2/p'` +if test "x${vmmn}" != "x%{mmn}"; then + : Error: Upstream MMN is now ${vmmn}, packaged MMN is %{mmn}. + : Update the mmn macro and rebuild. + exit 1 +fi + +%build +# forcibly prevent use of bundled apr, apr-util, pcre +rm -rf srclib/{apr,apr-util,pcre} + +%configure \ + --enable-layout=RPM \ + --libdir=%{_libdir} \ + --sysconfdir=%{_sysconfdir}/httpd/conf \ + --includedir=%{_includedir}/httpd \ + --libexecdir=%{_libdir}/httpd/modules \ + --datadir=%{contentdir} \ + --with-installbuilddir=%{_libdir}/httpd/build \ + --enable-mpms-shared=all \ + --with-apr=%{_prefix} --with-apr-util=%{_prefix} \ + --enable-suexec --with-suexec \ + --with-suexec-caller=%{suexec_caller} \ + --with-suexec-docroot=%{contentdir} \ + --with-suexec-logfile=%{_localstatedir}/log/httpd/suexec.log \ + --with-suexec-bin=%{_sbindir}/suexec \ + --with-suexec-uidmin=500 --with-suexec-gidmin=100 \ + --enable-pie \ + --with-pcre \ + --enable-mods-shared=all \ + --enable-ssl --with-ssl --enable-bucketeer \ + --enable-case-filter --enable-case-filter-in \ + --disable-imagemap + +make %{?_smp_mflags} + +%install +rm -rf $RPM_BUILD_ROOT +make DESTDIR=$RPM_BUILD_ROOT install + +# for holding mod_dav lock database +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/dav + +# create a prototype session cache +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/cache/mod_ssl +touch $RPM_BUILD_ROOT%{_localstatedir}/cache/mod_ssl/scache.{dir,pag,sem} + +# Make the MMN accessible to module packages +echo %{mmn} > $RPM_BUILD_ROOT%{_includedir}/httpd/.mmn + +# Set up /var directories +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/log/httpd +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/cache/httpd/cache-root + +# symlinks for /etc/httpd +ln -s ../..%{_localstatedir}/log/httpd $RPM_BUILD_ROOT/etc/httpd/logs +ln -s ../..%{_localstatedir}/run $RPM_BUILD_ROOT/etc/httpd/run +ln -s ../..%{_libdir}/httpd/modules $RPM_BUILD_ROOT/etc/httpd/modules +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf.d + +# install SYSV init stuff +mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d +install -m755 ./build/rpm/httpd.init \ + $RPM_BUILD_ROOT/etc/rc.d/init.d/httpd +install -m755 ./build/rpm/htcacheclean.init \ + $RPM_BUILD_ROOT/etc/rc.d/init.d/htcacheclean + +# install log rotation stuff +mkdir -p $RPM_BUILD_ROOT/etc/logrotate.d +install -m644 ./build/rpm/httpd.logrotate \ + $RPM_BUILD_ROOT/etc/logrotate.d/httpd + +# Remove unpackaged files +rm -rf $RPM_BUILD_ROOT%{_libdir}/httpd/modules/*.exp \ + $RPM_BUILD_ROOT%{contentdir}/cgi-bin/* + +# Make suexec a+rw so it can be stripped. %%files lists real permissions +chmod 755 $RPM_BUILD_ROOT%{_sbindir}/suexec + +%pre +# Add the "apache" user +/usr/sbin/useradd -c "Apache" -u 48 \ + -s /sbin/nologin -r -d %{contentdir} apache 2> /dev/null || : + +%post +# Register the httpd service +/sbin/chkconfig --add httpd +/sbin/chkconfig --add htcacheclean + +%preun +if [ $1 = 0 ]; then + /sbin/service httpd stop > /dev/null 2>&1 + /sbin/service htcacheclean stop > /dev/null 2>&1 + /sbin/chkconfig --del httpd + /sbin/chkconfig --del htcacheclean +fi + +%post -n mod_ssl +umask 077 + +if [ ! -f %{_sysconfdir}/httpd/conf/server.key ] ; then +%{_bindir}/openssl genrsa -rand /proc/apm:/proc/cpuinfo:/proc/dma:/proc/filesystems:/proc/interrupts:/proc/ioports:/proc/pci:/proc/rtc:/proc/uptime 1024 > %{_sysconfdir}/httpd/conf/server.key 2> /dev/null +fi + +FQDN=`hostname` +if [ "x${FQDN}" = "x" ]; then + FQDN=localhost.localdomain +fi + +if [ ! -f %{_sysconfdir}/httpd/conf/server.crt ] ; then +cat << EOF | %{_bindir}/openssl req -new -key %{_sysconfdir}/httpd/conf/server.key -x509 -days 365 -out %{_sysconfdir}/httpd/conf/server.crt 2>/dev/null +-- +SomeState +SomeCity +SomeOrganization +SomeOrganizationalUnit +${FQDN} +root@${FQDN} +EOF +fi + +%check +# Check the built modules are all PIC +if readelf -d $RPM_BUILD_ROOT%{_libdir}/httpd/modules/*.so | grep TEXTREL; then + : modules contain non-relocatable code + exit 1 +fi + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root) + +%doc ABOUT_APACHE README CHANGES LICENSE NOTICE + +%dir %{_sysconfdir}/httpd +%{_sysconfdir}/httpd/modules +%{_sysconfdir}/httpd/logs +%{_sysconfdir}/httpd/run +%dir %{_sysconfdir}/httpd/conf +%dir %{_sysconfdir}/httpd/conf.d +%config(noreplace) %{_sysconfdir}/httpd/conf/httpd.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/magic +%config(noreplace) %{_sysconfdir}/httpd/conf/mime.types +%config(noreplace) %{_sysconfdir}/httpd/conf/extra/httpd-autoindex.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/extra/httpd-dav.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/extra/httpd-default.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/extra/httpd-info.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/extra/httpd-languages.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/extra/httpd-manual.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/extra/httpd-mpm.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/extra/httpd-multilang-errordoc.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/extra/httpd-userdir.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/extra/httpd-vhosts.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/extra/proxy-html.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/original/extra/httpd-autoindex.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/original/extra/httpd-dav.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/original/extra/httpd-default.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/original/extra/httpd-info.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/original/extra/httpd-languages.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/original/extra/httpd-manual.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/original/extra/httpd-mpm.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/original/extra/httpd-multilang-errordoc.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/original/extra/httpd-userdir.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/original/extra/httpd-vhosts.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/original/extra/proxy-html.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/original/httpd.conf + +%config %{_sysconfdir}/logrotate.d/httpd +%config %{_sysconfdir}/rc.d/init.d/httpd +%config %{_sysconfdir}/rc.d/init.d/htcacheclean + +%{_sbindir}/fcgistarter +%{_sbindir}/htcacheclean +%{_sbindir}/httpd +%{_sbindir}/apachectl +%attr(4510,root,%{suexec_caller}) %{_sbindir}/suexec + +%dir %{_libdir}/httpd +%dir %{_libdir}/httpd/modules +%{_libdir}/httpd/modules/mod_access_compat.so +%{_libdir}/httpd/modules/mod_actions.so +%{_libdir}/httpd/modules/mod_alias.so +%{_libdir}/httpd/modules/mod_allowmethods.so +%{_libdir}/httpd/modules/mod_asis.so +%{_libdir}/httpd/modules/mod_auth_basic.so +%{_libdir}/httpd/modules/mod_auth_digest.so +%{_libdir}/httpd/modules/mod_auth_form.so +%{_libdir}/httpd/modules/mod_authn_anon.so +%{_libdir}/httpd/modules/mod_authn_core.so +%{_libdir}/httpd/modules/mod_authn_dbd.so +%{_libdir}/httpd/modules/mod_authn_dbm.so +%{_libdir}/httpd/modules/mod_authn_file.so +%{_libdir}/httpd/modules/mod_authn_socache.so +%{_libdir}/httpd/modules/mod_authz_core.so +%{_libdir}/httpd/modules/mod_authz_dbd.so +%{_libdir}/httpd/modules/mod_authz_dbm.so +%{_libdir}/httpd/modules/mod_authz_groupfile.so +%{_libdir}/httpd/modules/mod_authz_host.so +%{_libdir}/httpd/modules/mod_authz_owner.so +%{_libdir}/httpd/modules/mod_authz_user.so +%{_libdir}/httpd/modules/mod_autoindex.so +%{_libdir}/httpd/modules/mod_bucketeer.so +%{_libdir}/httpd/modules/mod_buffer.so +%{_libdir}/httpd/modules/mod_cache_disk.so +%{_libdir}/httpd/modules/mod_cache_socache.so +%{_libdir}/httpd/modules/mod_cache.so +%{_libdir}/httpd/modules/mod_case_filter.so +%{_libdir}/httpd/modules/mod_case_filter_in.so +%{_libdir}/httpd/modules/mod_cgid.so +%{_libdir}/httpd/modules/mod_charset_lite.so +%{_libdir}/httpd/modules/mod_data.so +%{_libdir}/httpd/modules/mod_dav_fs.so +%{_libdir}/httpd/modules/mod_dav_lock.so +%{_libdir}/httpd/modules/mod_dav.so +%{_libdir}/httpd/modules/mod_dbd.so +%{_libdir}/httpd/modules/mod_deflate.so +%{_libdir}/httpd/modules/mod_dialup.so +%{_libdir}/httpd/modules/mod_dir.so +%{_libdir}/httpd/modules/mod_dumpio.so +%{_libdir}/httpd/modules/mod_echo.so +%{_libdir}/httpd/modules/mod_env.so +%{_libdir}/httpd/modules/mod_expires.so +%{_libdir}/httpd/modules/mod_ext_filter.so +%{_libdir}/httpd/modules/mod_file_cache.so +%{_libdir}/httpd/modules/mod_filter.so +%{_libdir}/httpd/modules/mod_headers.so +%{_libdir}/httpd/modules/mod_heartbeat.so +%{_libdir}/httpd/modules/mod_heartmonitor.so +%{_libdir}/httpd/modules/mod_include.so +%{_libdir}/httpd/modules/mod_info.so +%{_libdir}/httpd/modules/mod_lbmethod_bybusyness.so +%{_libdir}/httpd/modules/mod_lbmethod_byrequests.so +%{_libdir}/httpd/modules/mod_lbmethod_bytraffic.so +%{_libdir}/httpd/modules/mod_lbmethod_heartbeat.so +%{_libdir}/httpd/modules/mod_log_config.so +%{_libdir}/httpd/modules/mod_log_debug.so +%{_libdir}/httpd/modules/mod_log_forensic.so +%{_libdir}/httpd/modules/mod_logio.so +%{_libdir}/httpd/modules/mod_macro.so +%{_libdir}/httpd/modules/mod_mime_magic.so +%{_libdir}/httpd/modules/mod_mime.so +%{_libdir}/httpd/modules/mod_mpm_event.so +%{_libdir}/httpd/modules/mod_mpm_prefork.so +%{_libdir}/httpd/modules/mod_mpm_worker.so +%{_libdir}/httpd/modules/mod_negotiation.so +%{_libdir}/httpd/modules/mod_proxy_ajp.so +%{_libdir}/httpd/modules/mod_proxy_balancer.so +%{_libdir}/httpd/modules/mod_proxy_connect.so +%{_libdir}/httpd/modules/mod_proxy_express.so +%{_libdir}/httpd/modules/mod_proxy_fcgi.so +%{_libdir}/httpd/modules/mod_proxy_fdpass.so +%{_libdir}/httpd/modules/mod_proxy_ftp.so +%{_libdir}/httpd/modules/mod_proxy_http.so +%{_libdir}/httpd/modules/mod_proxy_scgi.so +%{_libdir}/httpd/modules/mod_proxy_uwsgi.so +%{_libdir}/httpd/modules/mod_proxy_wstunnel.so +%{_libdir}/httpd/modules/mod_proxy_hcheck.so +%{_libdir}/httpd/modules/mod_proxy.so +%{_libdir}/httpd/modules/mod_ratelimit.so +%{_libdir}/httpd/modules/mod_reflector.so +%{_libdir}/httpd/modules/mod_remoteip.so +%{_libdir}/httpd/modules/mod_reqtimeout.so +%{_libdir}/httpd/modules/mod_request.so +%{_libdir}/httpd/modules/mod_rewrite.so +%{_libdir}/httpd/modules/mod_sed.so +%{_libdir}/httpd/modules/mod_session_cookie.so +%{_libdir}/httpd/modules/mod_session_crypto.so +%{_libdir}/httpd/modules/mod_session_dbd.so +%{_libdir}/httpd/modules/mod_session.so +%{_libdir}/httpd/modules/mod_setenvif.so +%{_libdir}/httpd/modules/mod_slotmem_plain.so +%{_libdir}/httpd/modules/mod_slotmem_shm.so +%{_libdir}/httpd/modules/mod_socache_dbm.so +%{_libdir}/httpd/modules/mod_socache_memcache.so +%{_libdir}/httpd/modules/mod_socache_redis.so +%{_libdir}/httpd/modules/mod_socache_shmcb.so +%{_libdir}/httpd/modules/mod_speling.so +%{_libdir}/httpd/modules/mod_status.so +%{_libdir}/httpd/modules/mod_substitute.so +%{_libdir}/httpd/modules/mod_suexec.so +%{_libdir}/httpd/modules/mod_unique_id.so +%{_libdir}/httpd/modules/mod_unixd.so +%{_libdir}/httpd/modules/mod_userdir.so +%{_libdir}/httpd/modules/mod_usertrack.so +%{_libdir}/httpd/modules/mod_version.so +%{_libdir}/httpd/modules/mod_vhost_alias.so +%{_libdir}/httpd/modules/mod_watchdog.so + +%dir %{contentdir} +%dir %{contentdir}/cgi-bin +%dir %{contentdir}/html +%dir %{contentdir}/icons +%dir %{contentdir}/error +%dir %{contentdir}/error/include +%{contentdir}/icons/* +%{contentdir}/error/README +%{contentdir}/html/index.html +%config(noreplace) %{contentdir}/error/*.var +%config(noreplace) %{contentdir}/error/include/*.html + +%attr(0700,root,root) %dir %{_localstatedir}/log/httpd + +%attr(0700,apache,apache) %dir %{_localstatedir}/lib/dav +%attr(0700,apache,apache) %dir %{_localstatedir}/cache/httpd/cache-root + +%{_mandir}/man1/* +%{_mandir}/man8/suexec* +%{_mandir}/man8/apachectl.8* +%{_mandir}/man8/httpd.8* +%{_mandir}/man8/htcacheclean.8* +%{_mandir}/man8/fcgistarter.8* + +%files manual +%defattr(-,root,root) +%{contentdir}/manual +%{contentdir}/error/README + +%files tools +%defattr(-,root,root) +%{_bindir}/ab +%{_bindir}/htdbm +%{_bindir}/htdigest +%{_bindir}/htpasswd +%{_bindir}/logresolve +%{_bindir}/httxt2dbm +%{_sbindir}/rotatelogs +%{_mandir}/man1/htdbm.1* +%{_mandir}/man1/htdigest.1* +%{_mandir}/man1/htpasswd.1* +%{_mandir}/man1/httxt2dbm.1* +%{_mandir}/man1/ab.1* +%{_mandir}/man1/logresolve.1* +%{_mandir}/man8/rotatelogs.8* +%doc LICENSE NOTICE + +%files -n mod_authnz_ldap +%defattr(-,root,root) +%{_libdir}/httpd/modules/mod_ldap.so +%{_libdir}/httpd/modules/mod_authnz_ldap.so + +%files -n mod_lua +%defattr(-,root,root) +%{_libdir}/httpd/modules/mod_lua.so + +%files -n mod_proxy_html +%defattr(-,root,root) +%{_libdir}/httpd/modules/mod_proxy_html.so +%{_libdir}/httpd/modules/mod_xml2enc.so + +%files -n mod_ssl +%defattr(-,root,root) +%{_libdir}/httpd/modules/mod_ssl.so +%config(noreplace) %{_sysconfdir}/httpd/conf/original/extra/httpd-ssl.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/extra/httpd-ssl.conf +%attr(0700,apache,root) %dir %{_localstatedir}/cache/mod_ssl +%attr(0600,apache,root) %ghost %{_localstatedir}/cache/mod_ssl/scache.dir +%attr(0600,apache,root) %ghost %{_localstatedir}/cache/mod_ssl/scache.pag +%attr(0600,apache,root) %ghost %{_localstatedir}/cache/mod_ssl/scache.sem + +%files devel +%defattr(-,root,root) +%{_includedir}/httpd +%{_bindir}/apxs +%{_sbindir}/checkgid +%{_bindir}/dbmmanage +%{_sbindir}/envvars* +%{_mandir}/man1/dbmmanage.1* +%{_mandir}/man1/apxs.1* +%dir %{_libdir}/httpd/build +%{_libdir}/httpd/build/*.mk +%{_libdir}/httpd/build/instdso.sh +%{_libdir}/httpd/build/config.nice +%{_libdir}/httpd/build/mkdir.sh + diff --git a/build/rules.mk.in b/build/rules.mk.in new file mode 100644 index 0000000..a1804fa --- /dev/null +++ b/build/rules.mk.in @@ -0,0 +1,245 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# The build environment was originally provided by Sascha Schumann. + +@ap_make_include@ @ap_make_delimiter@$(top_builddir)/build/config_vars.mk@ap_make_delimiter@ + +# Combine all of the flags together in the proper order so that +# the user-defined flags can always override the configure ones, if needed. +# Note that includes are listed after the flags because -I options have +# left-to-right precedence and CPPFLAGS may include user-defined overrides. +# The "MOD_" prefixed variable are provided to allow modules to insert their +# (per-subdirectory) settings through definitions in modules.mk, with highest +# precedence. +# +ALL_CFLAGS = $(MOD_CFLAGS) $(EXTRA_CFLAGS) $(NOTEST_CFLAGS) $(CFLAGS) +ALL_CPPFLAGS = $(DEFS) $(INTERNAL_CPPFLAGS) $(MOD_CPPFLAGS) $(EXTRA_CPPFLAGS) $(NOTEST_CPPFLAGS) $(CPPFLAGS) +ALL_CXXFLAGS = $(MOD_CXXFLAGS) $(EXTRA_CXXFLAGS) $(NOTEST_CXXFLAGS) $(CXXFLAGS) +ALL_LDFLAGS = $(MOD_LDFLAGS) $(EXTRA_LDFLAGS) $(NOTEST_LDFLAGS) $(LDFLAGS) +ALL_LIBS = $(MOD_LIBS) $(EXTRA_LIBS) $(NOTEST_LIBS) $(LIBS) +ALL_INCLUDES = $(MOD_INCLUDES) $(INCLUDES) $(EXTRA_INCLUDES) + +# Compile commands + +BASE_CC = $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(ALL_INCLUDES) +BASE_CXX = $(CXX) $(ALL_CXXFLAGS) $(ALL_CPPFLAGS) $(ALL_INCLUDES) + +COMPILE = $(BASE_CC) $(PICFLAGS) +CXX_COMPILE = $(BASE_CXX) $(PICFLAGS) + +SH_COMPILE = $(LIBTOOL) --mode=compile $(BASE_CC) $(SHLTCFLAGS) -c $< && touch $@ +SH_CXX_COMPILE = $(LIBTOOL) --mode=compile $(BASE_CXX) $(SHLTCFLAGS) -c $< && touch $@ + +LT_COMPILE = $(LIBTOOL) --mode=compile $(COMPILE) $(LTCFLAGS) -c $< && touch $@ +LT_CXX_COMPILE = $(LIBTOOL) --mode=compile $(CXX_COMPILE) $(LTCFLAGS) -c $< && touch $@ + +# Link-related commands + +LINK = $(LIBTOOL) --mode=link $(CC) $(ALL_CFLAGS) $(PILDFLAGS) $(LT_LDFLAGS) $(ALL_LDFLAGS) -o $@ +SH_LINK = $(SH_LIBTOOL) --mode=link $(CC) $(ALL_CFLAGS) $(LT_LDFLAGS) $(ALL_LDFLAGS) $(SH_LDFLAGS) $(CORE_IMPLIB) $(SH_LIBS) -o $@ +MOD_LINK = $(LIBTOOL) --mode=link $(CC) $(ALL_CFLAGS) -static $(LT_LDFLAGS) $(ALL_LDFLAGS) -o $@ + +# Cross compile commands + +# Helper programs + +INSTALL_DATA = $(INSTALL) -m 644 +INSTALL_PROGRAM = $(INSTALL) -m 755 $(INSTALL_PROG_FLAGS) + +# +# Standard build rules +# +all: all-recursive +depend: depend-recursive +clean: clean-recursive +distclean: distclean-recursive +extraclean: extraclean-recursive +install: install-recursive +shared-build: shared-build-recursive + +all-recursive install-recursive depend-recursive: + @otarget=`echo $@|sed s/-recursive//`; \ + list=' $(BUILD_SUBDIRS) $(SUBDIRS)'; \ + for i in $$list; do \ + if test -d "$$i"; then \ + target="$$otarget"; \ + echo "Making $$target in $$i"; \ + if test "$$i" = "."; then \ + made_local=yes; \ + target="local-$$target"; \ + fi; \ + (cd $$i && $(MAKE) $$target) || exit 1; \ + fi; \ + done; \ + if test "$$otarget" = "all" && test -z '$(TARGETS)'; then \ + made_local=yes; \ + fi; \ + if test "$$made_local" != "yes"; then \ + $(MAKE) "local-$$otarget" || exit 1; \ + fi + +clean-recursive distclean-recursive extraclean-recursive: + @otarget=`echo $@|sed s/-recursive//`; \ + list='$(CLEAN_SUBDIRS) $(SUBDIRS)'; \ + for i in $$list; do \ + if test -d "$$i"; then \ + target="$$otarget"; \ + echo "Making $$target in $$i"; \ + if test "$$i" = "."; then \ + made_local=yes; \ + target="local-$$target"; \ + fi; \ + (cd $$i && $(MAKE) $$target); \ + fi; \ + done; \ + if test "$$otarget" = "all" && test -z '$(TARGETS)'; then \ + made_local=yes; \ + fi; \ + if test "$$made_local" != "yes"; then \ + $(MAKE) "local-$$otarget"; \ + fi + +shared-build-recursive: + @if test `pwd` = "$(top_builddir)"; then \ + $(PRE_SHARED_CMDS) ; \ + fi; \ + list='$(SUBDIRS)'; for i in $$list; do \ + target="shared-build"; \ + if test "$$i" = "."; then \ + made_local=yes; \ + target="local-shared-build"; \ + fi; \ + if test "$$i" != "srclib"; then \ + (cd $$i && $(MAKE) $$target) || exit 1; \ + fi; \ + done; \ + if test -f 'modules.mk'; then \ + if test -n '$(SHARED_TARGETS)'; then \ + echo "Building shared: $(SHARED_TARGETS)"; \ + if test "$$made_local" != "yes"; then \ + $(MAKE) "local-shared-build" || exit 1; \ + fi; \ + fi; \ + fi; \ + if test `pwd` = "$(top_builddir)"; then \ + $(POST_SHARED_CMDS) ; \ + fi + +local-all: $(TARGETS) + +local-shared-build: $(SHARED_TARGETS) + +local-depend: x-local-depend + @if test -n "`ls $(srcdir)/*.c 2> /dev/null`"; then \ + rm -f .deps; \ + list='$(srcdir)/*.c'; \ + for i in $$list; do \ + $(MKDEP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) $$i | sed 's/\.o:/.lo:/' >> .deps; \ + done; \ + sed 's/\.lo:/.slo:/' < .deps > .deps.$$; \ + cat .deps.$$ >> .deps; \ + rm -f .deps.$$; \ + fi + +local-clean: x-local-clean + rm -f *.o *.lo *.slo *.obj *.a *.la $(CLEAN_TARGETS) $(TARGETS) + rm -rf .libs + +local-distclean: local-clean x-local-distclean + rm -f .deps Makefile $(DISTCLEAN_TARGETS) + +local-extraclean: local-distclean x-local-extraclean + @if test -n "$(EXTRACLEAN_TARGETS)"; then \ + echo "rm -f $(EXTRACLEAN_TARGETS)"; \ + rm -f $(EXTRACLEAN_TARGETS) ; \ + fi + +program-install: $(TARGETS) $(SHARED_TARGETS) + @if test -n '$(bin_PROGRAMS)'; then \ + test -d $(DESTDIR)$(bindir) || $(MKINSTALLDIRS) $(DESTDIR)$(bindir); \ + list='$(bin_PROGRAMS)'; for i in $$list; do \ + $(INSTALL_PROGRAM) $$i $(DESTDIR)$(bindir); \ + done; \ + fi + @if test -n '$(sbin_PROGRAMS)'; then \ + test -d $(DESTDIR)$(sbindir) || $(MKINSTALLDIRS) $(DESTDIR)$(sbindir); \ + list='$(sbin_PROGRAMS)'; for i in $$list; do \ + $(INSTALL_PROGRAM) $$i $(DESTDIR)$(sbindir); \ + done; \ + fi + +local-install: program-install $(INSTALL_TARGETS) + +# to be filled in by the actual Makefile if extra commands are needed +x-local-depend x-local-clean x-local-distclean x-local-extraclean: + +# +# Implicit rules for creating outputs from input files +# +CXX_SUFFIX = cpp +SHLIB_SUFFIX = so + +.SUFFIXES: +.SUFFIXES: .S .c .$(CXX_SUFFIX) .lo .o .s .y .l .slo .def .la + +.c.o: + $(COMPILE) -c $< + +.s.o: + $(COMPILE) -c $< + +.c.lo: + $(LT_COMPILE) + +.s.lo: + $(LT_COMPILE) + +.c.slo: + $(SH_COMPILE) + +.$(CXX_SUFFIX).lo: + $(LT_CXX_COMPILE) + +.$(CXX_SUFFIX).slo: + $(SH_CXX_COMPILE) + +.y.c: + $(YACC) $(YFLAGS) $< && mv y.tab.c $*.c + if test -f y.tab.h; then \ + if cmp -s y.tab.h $*.h; then rm -f y.tab.h; else mv y.tab.h $*.h; fi; \ + else :; fi + +.l.c: + $(LEX) $(LFLAGS) $< && mv $(LEX_OUTPUT_ROOT).c $@ + +# Makes an import library from a def file +.def.la: + $(LIBTOOL) --mode=compile $(MK_IMPLIB) -o $@ $< + +# +# Dependencies +# +@ap_make_include@ @ap_make_delimiter@$(builddir)/.deps@ap_make_delimiter@ + +.PHONY: all all-recursive install-recursive local-all $(PHONY_TARGETS) \ + shared-build shared-build-recursive local-shared-build \ + depend depend-recursive local-depend x-local-depend \ + clean clean-recursive local-clean x-local-clean \ + distclean distclean-recursive local-distclean x-local-distclean \ + extraclean extraclean-recursive local-extraclean x-local-extraclean \ + install local-install docs $(INSTALL_TARGETS) + diff --git a/build/special.mk b/build/special.mk new file mode 100644 index 0000000..38e7a86 --- /dev/null +++ b/build/special.mk @@ -0,0 +1,36 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# The build environment was provided by Sascha Schumann. + +all: all-recursive + +include $(builddir)/modules.mk + +TARGETS = $(static) +SHARED_TARGETS = $(shared) +INSTALL_TARGETS = install-modules-$(INSTALL_DSO) + +include $(top_builddir)/build/rules.mk + +install-modules-yes: $(SHARED_TARGETS) + @$(MKINSTALLDIRS) $(DESTDIR)$(libexecdir) + @list='$(shared)'; for i in $$list; do \ + $(top_srcdir)/build/instdso.sh SH_LIBTOOL='$(SH_LIBTOOL)' $$i $(DESTDIR)$(libexecdir); \ + done + +install-modules-no: + diff --git a/build/sysv_makefile b/build/sysv_makefile new file mode 100755 index 0000000..ea1d438 --- /dev/null +++ b/build/sysv_makefile @@ -0,0 +1,34 @@ +#! /bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# The build environment was provided by Sascha Schumann. + +# cwd must be top_srcdir +test -f build/sysv_makefile || exit 2 + +test -f bsd_converted || exit 1 + +tmpfile=`mktemp /tmp/sysv_makefile.XXXXXX 2>/dev/null` || tmpfile="tmp.$$" +for i in build/*.mk; do + sed 's/^\.include "\(.*\)"/include \1/' $i >$tmpfile \ + && cp $tmpfile $i +done +rm -f $tmpfile + +rm bsd_converted +exit 0 diff --git a/build/win32/apache.ico b/build/win32/apache.ico new file mode 100644 index 0000000000000000000000000000000000000000..bfb4f63ab622055cb72c4dae0b5e92d26ae69293 GIT binary patch literal 1078 zcmcIju};G<5PfNjzyl;ZLo=cN148YPHBuKO_?iYWFw)gSz9dT!18avebg)1XR-S9KOj6Gk zv(uF?DA~qy)uqsq?SBu?ZfF0LSxo!ltk!;7(v2^M`Y@jj)s>+aX)7CtJXpN@_u>m5 z^6Q(<(`Ut<|5q3t@_x~ge#?Xw=j8oxE*N!X0zt6dH?Na%a#iS#N zIAsQ@2yB>iMCD06QF?h^cc7uFX{Q>vdCQyb&RrKzZe8u-UP=OmJHp+!58k;4g7/dev/null|sed -e 's/^[^0-9]*//;s/[a-z]* *$//;q'` +case "$ac_version" in +# versions older than 2.50 are denied by AC_PREREQ +2.5*) + echo WARNING: You are using an outdated version of autoconf. + echo WARNING: This may lead to less than optimal performance of httpd. + echo WARNING: You should use autoconf 2.60 or newer. + sleep 1 + ;; +esac + +# set a couple of defaults for where we should be looking for our support libs. +# can be overridden with --with-apr=[dir] and --with-apr-util=[dir] + +apr_src_dir="srclib/apr ../apr" +apu_src_dir="" + +while test $# -gt 0 +do + # Normalize + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + case "$1" in + --with-apr=*) + apr_src_dir=$optarg + ;; + + --with-apr-util=*) + apu_src_dir=$optarg + ;; + + -h|--help) + cat <= 1.12 and be + using a distribution that includes both find_apr.m4 and find_apu.m4 in the + --installbuilddir pointed to by apr-config. + +Environment variables used by buildconf: + AUTOCONF autoconf executable name [autoconf] + AUTOMAKE automake executable name [automake] + AUTOHEADER autoheader executable name [autoheader] +EOF + exit + ;; + + *) + echo "unknown option $1 (try --help for usage)" + exit 1 + ;; + esac + + shift +done + +# +# Check to be sure that we have the srclib dependencies checked-out, or that a +# working apr-config installation has been specified. +# + +should_exit=0 +apr_config= # path to apr-config (empty if using a source directory) +apr_found=0 +apu_found=0 +apr_major_version=2 + +for dir in $apr_src_dir +do + if [ -f "${dir}/build/apr_common.m4" ]; then + echo "found apr source: ${dir}" + apr_src_dir=$dir + apr_found=1 + break + elif which "${dir}" >/dev/null 2>&1; then + # We're using apr-config. Do a sanity check. + apr_config=`which "${dir}"` + echo "testing apr-config executable: ${apr_config}" + + version=`"${apr_config}" --version` + version=`echo "${version}" | sed -n '/^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$/p'` + + if [ -z "${version}" ]; then + echo "apr-config gave us an invalid --version" + apr_config= + continue + fi + + echo "using apr-config version ${version}" + apr_major_version=${version} # we'll make a real "major version" later + apr_src_dir=`"${apr_config}" --installbuilddir` + apr_found=1 + break + fi +done + +if [ $apr_found -lt 1 ]; then + echo "" + echo "You don't have a copy of the apr source in srclib/apr. " + echo "Please get the source using the following instructions," + echo "or specify the location of the source with " + echo "--with-apr=[path to apr] :" + echo "" + echo " svn co http://svn.apache.org/repos/asf/apr/apr/trunk srclib/apr" + echo "" + should_exit=1 +elif [ -n "${apr_config}" ]; then + apr_major_version=`echo "${apr_major_version}" | sed 's/\..*//'` +else + apr_major_version=`grep "#define APR_MAJOR_VERSION" \ + $apr_src_dir/include/apr_version.h | sed 's/[^0-9]//g'` +fi + +# Find APR-util. Note: if we're using apr-config, we can completely skip this, +# even if APR is version 1. That's because we only end up caring about +# find_apu.m4, which is not actually installed in the standard APR-util +# distribution to begin with. +if [ -z "${apr_config}" -a $apr_major_version -lt 2 ] ; then + if test -z "$apu_src_dir"; then + apu_src_dir=`echo $apr_src_dir | sed -e 's#/apr#/apr-util#g;'` + apu_src_dir="$apu_src_dir `echo $apr_src_dir | sed -e 's#/apr#/aprutil#;g'`" + apu_src_dir="$apu_src_dir srclib/apr-util ../apr-util" + fi + + for dir in $apu_src_dir + do + if [ -f "${dir}/Makefile.in" ]; then + echo "found apr-util source: ${dir}" + apu_src_dir=$dir + apu_found=1 + break + fi + done + + if [ $apu_found -lt 1 ]; then + echo "" + echo "You don't have a copy of the apr-util source in srclib/apr-util. " + echo "Please get one the source using the following instructions, " + echo "or specify the location of the source with " + echo "--with-apr-util=[path to apr-util]:" + echo "" + echo " svn co http://svn.apache.org/repos/asf/apr/apr-util/branches/1.5.x srclib/apr-util" + echo "" + should_exit=1 + fi +fi + +if [ $should_exit -gt 0 ]; then + exit 1 +fi + +# These are temporary until Roy finishes the other build changes +# +touch .deps +rm -f aclocal.m4 +rm -f generated_lists + +# Remove autoconf 2.5x cache directories +rm -rf autom4te*.cache + +case "`uname`" in +*BSD/OS*) + ./build/bsd_makefile;; +esac +# +# end temporary stuff + +apr_configure="$apr_src_dir/configure" +if [ $apr_major_version -lt 2 ] ; then + aprutil_configure="$apu_src_dir/configure" +fi +config_h_in="include/ap_config_auto.h.in" + +cross_compile_warning="warning: AC_TRY_RUN called without default to allow cross compiling" + +if [ "$apr_src_dir" = "srclib/apr" ]; then + echo rebuilding $apr_configure + (cd srclib/apr && ./buildconf) || { + echo "./buildconf failed for apr" + exit 1 + } + rm -f srclib/apr/apr.spec +fi + +apr_src_dir=`cd $apr_src_dir && pwd` + +if [ $apr_major_version -lt 2 ] ; then + if [ "$apu_src_dir" = "srclib/apr-util" ]; then + echo rebuilding $aprutil_configure + (cd srclib/apr-util && ./buildconf --with-apr=$apr_src_dir) || { + echo "./buildconf failed for apr-util" + exit 1 + } + rm -f srclib/apr-util/apr-util.spec + fi + + apu_src_dir=`cd $apu_src_dir && pwd` +fi + +echo copying build files +if [ -n "${apr_config}" ]; then + # If we're using apr-config, we switch things up a little bit: + # - use automake's config.* scripts instead of APR's + # - use the included PrintPath instead of copying from APR + # - assume find_apu.m4 is also in APR's --installbuilddir + + # Figure out where to copy config.* from. + automake=${AUTOMAKE:-automake} + am_libdir=`"${automake}" --print-libdir` + cp "${am_libdir}/config.guess" "${am_libdir}/config.sub" build + + # Remember that in this case, $apr_src_dir points to the build directory. + cp "$apr_src_dir/apr_common.m4" "$apr_src_dir/find_apr.m4" build + if [ $apr_major_version -lt 2 ] ; then + cp "$apr_src_dir/find_apu.m4" build + fi +else + cp $apr_src_dir/build/config.guess $apr_src_dir/build/config.sub \ + $apr_src_dir/build/PrintPath $apr_src_dir/build/apr_common.m4 \ + $apr_src_dir/build/find_apr.m4 build + if [ $apr_major_version -lt 2 ] ; then + cp $apu_src_dir/build/find_apu.m4 build + fi +fi + +# Remove any libtool files so one can switch between libtool 1.3 +# and libtool 1.4 by simply rerunning the buildconf script. +(cd build ; rm -f ltconfig ltmain.sh) + +if [ -z "${apr_config}" ]; then + # Optionally copy libtool-1.3.x files + if [ -f $apr_src_dir/build/ltconfig ]; then + cp $apr_src_dir/build/ltconfig build + fi + if [ -f $apr_src_dir/build/ltmain.sh ]; then + cp $apr_src_dir/build/ltmain.sh build + fi +fi + +echo rebuilding $config_h_in +rm -f $config_h_in +${AUTOHEADER:-autoheader} 2>&1 | grep -v "$cross_compile_warning" + +echo rebuilding configure +rm -f config.cache +${AUTOCONF:-autoconf} 2>&1 | grep -v "$cross_compile_warning" + +# Remove autoconf 2.5x cache directories +rm -rf autom4te*.cache + +if [ -f `which cut` ]; then + echo rebuilding rpm spec file + ( VMMN=`build/get-version.sh mmn include/ap_mmn.h MODULE_MAGIC_NUMBER` + EPOCH=`build/get-version.sh epoch include/ap_release.h AP_SERVER` + REVISION=`build/get-version.sh all include/ap_release.h AP_SERVER` + VERSION=`echo $REVISION | cut -d- -s -f1` + RELEASE=`echo $REVISION | cut -d- -s -f2` + if [ "x$VERSION" = "x" ]; then + VERSION=$REVISION + RELEASE=1 + fi + cat ./build/rpm/httpd.spec.in | \ + sed -e "s/APACHE_VERSION/$VERSION/" \ + -e "s/APACHE_RELEASE/$RELEASE/" \ + -e "s/APACHE_MMN/$VMMN/" \ + -e "s/APACHE_EPOCH/$EPOCH/" \ + > httpd.spec ) +fi + +# ensure that the ap_expr expression parser sources are never regenerated +# when running make +echo fixing timestamps for ap_expr sources +cd server +touch util_expr_parse.y util_expr_scan.l +sleep 1 +touch util_expr_parse.c util_expr_parse.h util_expr_scan.c +cd .. + +exit 0 diff --git a/config.layout b/config.layout new file mode 100644 index 0000000..a29351e --- /dev/null +++ b/config.layout @@ -0,0 +1,421 @@ +## +## config.layout -- Pre-defined Installation Path Layouts +## +## Hints: +## - layouts can be loaded with configure's --enable-layout=ID option +## - when no --enable-layout option is given, the default layout is `Apache' +## - a trailing plus character (`+') on paths is replaced with a +## `/' suffix where is currently hardcoded to 'apache2'. +## (This may become a configurable parameter at some point.) +## + +# Classical Apache path layout. + + prefix: /usr/local/apache2 + exec_prefix: ${prefix} + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/bin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/modules + mandir: ${prefix}/man + sysconfdir: ${prefix}/conf + datadir: ${prefix} + installbuilddir: ${datadir}/build + errordir: ${datadir}/error + iconsdir: ${datadir}/icons + htdocsdir: ${datadir}/htdocs + manualdir: ${datadir}/manual + cgidir: ${datadir}/cgi-bin + includedir: ${prefix}/include + localstatedir: ${prefix} + runtimedir: ${localstatedir}/logs + logfiledir: ${localstatedir}/logs + proxycachedir: ${localstatedir}/proxy + + +# GNU standards conforming path layout. +# See FSF's GNU project `make-stds' document for details. + + prefix: /usr/local + exec_prefix: ${prefix} + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/libexec + mandir: ${prefix}/man + sysconfdir: ${prefix}/etc+ + datadir: ${prefix}/share+ + installbuilddir: ${datadir}/build + errordir: ${datadir}/error + iconsdir: ${datadir}/icons + htdocsdir: ${datadir}/htdocs + manualdir: ${datadir}/manual + cgidir: ${datadir}/cgi-bin + includedir: ${prefix}/include+ + localstatedir: ${prefix}/var+ + runtimedir: ${localstatedir}/run + logfiledir: ${localstatedir}/log + proxycachedir: ${localstatedir}/proxy + + +# Mac OS X Server (Rhapsody) + + prefix: /Local/Library/WebServer + exec_prefix: /usr + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + libdir: ${exec_prefix}/lib + libexecdir: /System/Library/Apache/Modules + mandir: ${exec_prefix}/share/man + sysconfdir: ${prefix}/Configuration + datadir: ${prefix} + installbuilddir: /System/Library/Apache/Build + errordir: /System/Library/Apache/Error + iconsdir: /System/Library/Apache/Icons + manualdir: /System/Library/Apache/Manual + htdocsdir: ${datadir}/Documents + cgidir: ${datadir}/CGI-Executables + includedir: /System/Library/Frameworks/Apache.framework/Versions/2.0/Headers + localstatedir: /var + runtimedir: ${prefix}/Logs + logfiledir: ${prefix}/Logs + proxycachedir: ${prefix}/ProxyCache + + +# Darwin/Mac OS Layout + + prefix: /usr + exec_prefix: ${prefix} + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/libexec+ + mandir: ${prefix}/share/man + datadir: /Library/WebServer + sysconfdir: /etc+ + installbuilddir: ${prefix}/share/httpd/build + errordir: ${prefix}/share/httpd/error + iconsdir: ${prefix}/share/httpd/icons + htdocsdir: ${datadir}/Documents + manualdir: ${datadir}/share/httpd/manual + cgidir: ${datadir}/CGI-Executables + includedir: ${prefix}/include+ + localstatedir: /var + runtimedir: ${localstatedir}/run + logfiledir: ${localstatedir}/log+ + proxycachedir: ${runtimedir}/proxy + + +# Red Hat Linux 7.x layout + + prefix: /usr + exec_prefix: ${prefix} + bindir: ${prefix}/bin + sbindir: ${prefix}/sbin + libdir: ${prefix}/lib + libexecdir: ${prefix}/lib/apache + mandir: ${prefix}/man + sysconfdir: /etc/httpd/conf + datadir: /var/www + installbuilddir: ${datadir}/build + errordir: ${datadir}/error + iconsdir: ${datadir}/icons + htdocsdir: ${datadir}/html + manualdir: ${datadir}/manual + cgidir: ${datadir}/cgi-bin + includedir: ${prefix}/include/apache + localstatedir: /var + runtimedir: ${localstatedir}/run + logfiledir: ${localstatedir}/log/httpd + proxycachedir: ${localstatedir}/cache/httpd + + +# Layout used in Fedora httpd packaging. + + prefix: /usr + localstatedir: /var + exec_prefix: ${prefix} + bindir: ${prefix}/bin + sbindir: ${prefix}/sbin + libdir: ${prefix}/lib + libexecdir: ${prefix}/libexec + mandir: ${prefix}/man + sysconfdir: /etc/httpd/conf + datadir: ${prefix}/share/httpd + installbuilddir: ${libdir}/httpd/build + errordir: ${datadir}/error + iconsdir: ${datadir}/icons + htdocsdir: ${localstatedir}/www/html + manualdir: ${datadir}/manual + cgidir: ${localstatedir}/www/cgi-bin + includedir: ${prefix}/include/httpd + runtimedir: /run/httpd + logfiledir: ${localstatedir}/log/httpd + proxycachedir: ${localstatedir}/cache/httpd/proxy + + +# According to the /opt filesystem conventions + + prefix: /opt/apache + exec_prefix: ${prefix} + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/libexec + mandir: ${prefix}/man + sysconfdir: /etc${prefix} + datadir: ${prefix}/share + installbuilddir: ${datadir}/build + errordir: ${datadir}/error + iconsdir: ${datadir}/icons + htdocsdir: ${datadir}/htdocs + manualdir: ${datadir}/manual + cgidir: ${datadir}/cgi-bin + includedir: ${prefix}/include + localstatedir: /var${prefix} + runtimedir: ${localstatedir}/run + logfiledir: ${localstatedir}/logs + proxycachedir: ${localstatedir}/proxy + + +# SuSE 6.x layout + + prefix: /usr + exec_prefix: ${prefix} + bindir: ${prefix}/bin + sbindir: ${prefix}/sbin + libdir: ${prefix}/lib + libexecdir: ${prefix}/lib/apache + mandir: ${prefix}/share/man + sysconfdir: /etc/httpd + datadir: /usr/local/httpd + installbuilddir: ${datadir}/build + errordir: ${datadir}/error + iconsdir: ${datadir}/icons + htdocsdir: ${datadir}/htdocs + manualdir: ${datadir}/manual + cgidir: ${datadir}/cgi-bin + includedir: ${prefix}/include/apache + localstatedir: /var/lib/httpd + runtimedir: /var/run + logfiledir: /var/log/httpd + proxycachedir: /var/cache/httpd + + +# BSD/OS layout + + prefix: /var/www + exec_prefix: /usr/contrib + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/bin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/libexec/apache + mandir: ${exec_prefix}/man + sysconfdir: ${prefix}/conf + datadir: ${prefix} + installbuilddir: ${datadir}/build + errordir: ${datadir}/error + iconsdir: ${datadir}/icons + htdocsdir: ${datadir}/htdocs + manualdir: ${datadir}/manual + cgidir: ${datadir}/cgi-bin + includedir: ${exec_prefix}/include/apache + localstatedir: /var + runtimedir: ${localstatedir}/run + logfiledir: ${localstatedir}/log/httpd + proxycachedir: ${localstatedir}/proxy + + +# Solaris 8 Layout + + prefix: /usr/apache + exec_prefix: ${prefix} + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/bin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/libexec + mandir: ${exec_prefix}/man + sysconfdir: /etc/apache + datadir: /var/apache + installbuilddir: ${datadir}/build + errordir: ${datadir}/error + iconsdir: ${datadir}/icons + htdocsdir: ${datadir}/htdocs + manualdir: ${datadir}/manual + cgidir: ${datadir}/cgi-bin + includedir: ${exec_prefix}/include + localstatedir: ${prefix} + runtimedir: /var/run + logfiledir: ${datadir}/logs + proxycachedir: ${datadir}/proxy + + +# OpenBSD Layout + + prefix: /var/www + exec_prefix: /usr + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/lib/apache/modules + mandir: ${exec_prefix}/share/man + sysconfdir: ${prefix}/conf + datadir: ${prefix} + installbuilddir: ${prefix}/build + errordir: ${prefix}/error + iconsdir: ${prefix}/icons + htdocsdir: ${prefix}/htdocs + manualdir: ${datadir}/manual + cgidir: ${prefix}/cgi-bin + includedir: ${exec_prefix}/lib/apache/include + localstatedir: ${prefix} + runtimedir: ${prefix}/logs + logfiledir: ${prefix}/logs + proxycachedir: ${prefix}/proxy + + +# FreeBSD Layout + + prefix: /usr/local + exec_prefix: ${prefix} + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/libexec/apache2 + mandir: ${prefix}/man + sysconfdir: ${prefix}/etc/apache2 + datadir: ${prefix}/www + installbuilddir: ${prefix}/share/apache2/build + errordir: ${datadir}/error + iconsdir: ${datadir}/icons + htdocsdir: ${datadir}/data + manualdir: ${prefix}/share/doc/apache2 + cgidir: ${datadir}/cgi-bin + includedir: ${prefix}/include/apache2 + localstatedir: /var + runtimedir: ${localstatedir}/run + logfiledir: ${localstatedir}/log + proxycachedir: ${datadir}/proxy + + +# Debian layout + + prefix: + exec_prefix: ${prefix}/usr + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/lib/apache2/modules + mandir: ${exec_prefix}/share/man + sysconfdir: ${prefix}/etc/apache2 + datadir: ${exec_prefix}/share/apache2 + iconsdir: ${datadir}/icons + htdocsdir: ${prefix}/usr/share/apache2/default-site/htdocs + manualdir: ${htdocsdir}/manual + cgidir: ${prefix}/usr/lib/cgi-bin + includedir: ${exec_prefix}/include/apache2 + localstatedir: ${prefix}/var/lock/apache2 + runtimedir: ${prefix}/var/run/apache2 + logfiledir: ${prefix}/var/log/apache2 + proxycachedir: ${prefix}/var/cache/apache2/proxy + infodir: ${exec_prefix}/share/info + installbuilddir: ${prefix}/usr/share/apache2/build + errordir: ${datadir}/error + + +# Generic RPM layout + + prefix: /usr + exec_prefix: ${prefix} + bindir: ${prefix}/bin + sbindir: ${prefix}/sbin + libdir: ${prefix}/lib + libexecdir: ${libdir}/httpd/modules + mandir: ${prefix}/share/man + sysconfdir: /etc/httpd/conf + installbuilddir: ${libdir}/httpd/build + includedir: ${prefix}/include/httpd + localstatedir: /var + datadir: ${localstatedir}/www + errordir: ${datadir}/error + iconsdir: ${datadir}/icons + htdocsdir: ${datadir}/html + manualdir: ${datadir}/manual + cgidir: ${datadir}/cgi-bin + runtimedir: ${localstatedir}/run + logfiledir: ${localstatedir}/log/httpd + proxycachedir: ${localstatedir}/cache/httpd/cache-root + + +# AIX layout + + prefix: /opt/httpd + exec_prefix: /opt/httpd + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/libexec + mandir: /usr/share/man + sysconfdir: /etc/httpd + datadir: /var/httpd + installbuilddir: ${datadir}/build + errordir: ${datadir}/error + htdocsdir: ${datadir}/htdocs + cgidir: ${datadir}/cgi-bin + iconsdir: ${prefix}/icons + manualdir: ${prefix}/manual + includedir: ${prefix}/include + localstatedir: /var/httpd + runtimedir: ${localstatedir}/run + logfiledir: ${localstatedir}/logs + proxycachedir: ${localstatedir}/proxy + + +# FHS layout + + prefix: /usr + exec_prefix: ${prefix} + bindir: ${prefix}/bin + sbindir: ${prefix}/sbin + libdir: ${prefix}/lib/httpd + libexecdir: ${prefix}/lib/httpd/modules + installbuilddir: ${prefix}/lib/httpd/build + mandir: ${prefix}/man + sysconfdir: /etc/httpd + datadir: /srv/httpd + iconsdir: ${datadir}/icons + htdocsdir: ${datadir}/htdocs + manualdir: ${htdocsdir}/manual + cgidir: ${datadir}/cgi-bin + errordir: ${datadir}/error + includedir: ${prefix}/include/httpd + localstatedir: /var + runtimedir: ${localstatedir}/run/httpd + logfiledir: ${localstatedir}/log/httpd + proxycachedir: ${localstatedir}/cache/httpd + + +# OpenWrt layout + + prefix: /usr + exec_prefix: ${prefix} + bindir: ${prefix}/bin + sbindir: ${prefix}/sbin + libdir: ${prefix}/lib + libexecdir: ${prefix}/lib+ + mandir: ${prefix}/share/man + sysconfdir: /etc+ + datadir: ${prefix}/share+ + installbuilddir: ${datadir}/build + errordir: ${datadir}/error + iconsdir: ${datadir}/icons + htdocsdir: ${datadir}/htdocs + manualdir: /usr/share/doc/apache2/manual + cgidir: ${datadir}/cgi-bin + includedir: ${prefix}/include+ + localstatedir: /var + runtimedir: ${localstatedir}/run+ + logfiledir: ${localstatedir}/log+ + proxycachedir: ${localstatedir}/cache/apache2 + + diff --git a/configure b/configure new file mode 100755 index 0000000..a304517 --- /dev/null +++ b/configure @@ -0,0 +1,43609 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.72. +# +# +# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, +# Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else case e in #( + e) case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as 'sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed 'exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else case e in #( + e) case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : + +else case e in #( + e) exitcode=1; echo positional parameters were not saved. ;; +esac +fi +test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null +then : + as_have_required=yes +else case e in #( + e) as_have_required=no ;; +esac +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : + +else case e in #( + e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$as_shell as_have_required=yes + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : + break 2 +fi +fi + done;; + esac + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else case e in #( + e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi ;; +esac +fi + + + if test "x$CONFIG_SHELL" != x +then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed 'exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." + else + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi ;; +esac +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else case e in #( + e) as_fn_append () + { + eval $1=\$$1\$2 + } ;; +esac +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else case e in #( + e) as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } ;; +esac +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + t clear + :clear + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. + # In both cases, we have to default to 'cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated + +# Sed expression to map a string onto a valid variable name. +as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed '$as_sed_sh'" # deprecated + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='' +PACKAGE_TARNAME='' +PACKAGE_VERSION='' +PACKAGE_STRING='' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +ac_unique_file="ABOUT_APACHE" +enable_option_checking=no +ac_default_prefix=/usr/local/apache2 +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_STDIO_H +# include +#endif +#ifdef HAVE_STDLIB_H +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_header_c_list= +ac_subst_vars='LTLIBOBJS +LIBOBJS +ap_make_delimiter +ap_make_include +perlbin +APU_CONFIG +APU_VERSION +APU_INCLUDEDIR +APU_BINDIR +APR_CONFIG +APR_VERSION +APR_INCLUDEDIR +APR_BINDIR +LOAD_ALL_MODULES +ENABLED_DSO_MODULES +DSO_MODULES +ENABLED_MPM_MODULE +MPM_MODULES +INSTALL_PROG_FLAGS +MK_IMPLIB +SH_LIBTOOL +SH_LIBS +CORE_IMPLIB +CORE_IMPLIB_FILE +SSLPORT +PORT +MODULE_CLEANDIRS +MODULE_DIRS +LIBTOOL +INTERNAL_CPPFLAGS +NOTEST_LIBS +NOTEST_LDFLAGS +NOTEST_CXXFLAGS +NOTEST_CFLAGS +NOTEST_CPPFLAGS +INCLUDES +UTIL_LDFLAGS +HTTPD_LDFLAGS +SH_LDFLAGS +LT_LDFLAGS +LTFLAGS +CXXFLAGS +CXX +other_targets +proxycachedir +runtimedir +installbuilddir +iconsdir +errordir +manualdir +htdocsdir +logfiledir +cgidir +abs_srcdir +HTTPD_MMN +HTTPD_VERSION +EXTRA_INCLUDES +EXTRA_LIBS +EXTRA_LDFLAGS +EXTRA_CXXFLAGS +EXTRA_CFLAGS +EXTRA_CPPFLAGS +AP_CLEAN_SRCLIB_DIRS +AP_BUILD_SRCLIB_DIRS +AP_LIBS +INSTALL_SUEXEC +shared_build +POST_SHARED_CMDS +PRE_SHARED_CMDS +MOD_SO_ENABLED +OS_SPECIFIC_VARS +SHLIBPATH_VAR +BUILTIN_LIBS +OS_DIR +OS +progname +MOD_REWRITE_LDADD +MOD_ALIAS_LDADD +MOD_USERDIR_LDADD +MOD_SPELING_LDADD +MOD_ACTIONS_LDADD +MOD_IMAGEMAP_LDADD +MOD_DIR_LDADD +MOD_NEGOTIATION_LDADD +MOD_VHOST_ALIAS_LDADD +MOD_DAV_LOCK_LDADD +MOD_DAV_FS_LDADD +MOD_CGI_LDADD +MOD_CGID_LDADD +MOD_SUEXEC_LDADD +MOD_INFO_LDADD +MOD_ASIS_LDADD +MOD_AUTOINDEX_LDADD +MOD_STATUS_LDADD +MOD_DAV_LDADD +MOD_HEARTMONITOR_LDADD +MOD_HEARTBEAT_LDADD +MOD_SYSTEMD_LDADD +MOD_PRIVILEGES_LDADD +MOD_UNIXD_LDADD +MOD_MPM_EVENT_LDADD +MPM_LIB +MPM_SUBDIRS +MOD_LBMETHOD_HEARTBEAT_LDADD +MOD_LBMETHOD_BYBUSYNESS_LDADD +MOD_LBMETHOD_BYTRAFFIC_LDADD +MOD_LBMETHOD_BYREQUESTS_LDADD +MOD_MD_LDADD +MOD_PROXY_HTTP2_LDADD +MOD_HTTP2_LDADD +APACHECTL_ULIMIT +NONPORTABLE_SUPPORT +fcgistarter_LTFLAGS +httxt2dbm_LTFLAGS +htcacheclean_LTFLAGS +checkgid_LTFLAGS +ab_LTFLAGS +htdbm_LTFLAGS +logresolve_LTFLAGS +rotatelogs_LTFLAGS +htdigest_LTFLAGS +htpasswd_LTFLAGS +MOD_DIALUP_LDADD +MOD_OPTIONAL_FN_EXPORT_LDADD +MOD_OPTIONAL_FN_IMPORT_LDADD +MOD_OPTIONAL_HOOK_IMPORT_LDADD +MOD_OPTIONAL_HOOK_EXPORT_LDADD +MOD_SSL_LDADD +ab_LIBS +ab_CFLAGS +MOD_SLOTMEM_PLAIN_LDADD +MOD_SLOTMEM_SHM_LDADD +MOD_SESSION_DBD_LDADD +MOD_SESSION_CRYPTO_LDADD +MOD_SESSION_COOKIE_LDADD +MOD_SESSION_LDADD +MOD_PROXY_HCHECK_LDADD +MOD_PROXY_EXPRESS_LDADD +MOD_PROXY_BALANCER_LDADD +MOD_PROXY_AJP_LDADD +MOD_PROXY_WSTUNNEL_LDADD +MOD_PROXY_FDPASS_LDADD +MOD_PROXY_UWSGI_LDADD +MOD_PROXY_SCGI_LDADD +MOD_PROXY_FCGI_LDADD +MOD_PROXY_HTTP_LDADD +MOD_PROXY_FTP_LDADD +MOD_PROXY_CONNECT_LDADD +MOD_PROXY_LDADD +MOD_REMOTEIP_LDADD +MOD_VERSION_LDADD +MOD_SETENVIF_LDADD +MOD_UNIQUE_ID_LDADD +MOD_USERTRACK_LDADD +MOD_IDENT_LDADD +MOD_HEADERS_LDADD +MOD_EXPIRES_LDADD +MOD_CERN_META_LDADD +MOD_MIME_MAGIC_LDADD +MOD_ENV_LDADD +MOD_LUA_LDADD +LUA_CFLAGS +LUA_LIBS +MOD_LOGIO_LDADD +MOD_LOG_FORENSIC_LDADD +MOD_LOG_DEBUG_LDADD +MOD_LOG_CONFIG_LDADD +MOD_LDAP_LDADD +MOD_MIME_LDADD +MOD_HTTP_LDADD +MOD_BROTLI_LDADD +MOD_PROXY_HTML_LDADD +MOD_XML2ENC_LDADD +MOD_DEFLATE_LDADD +MOD_CHARSET_LITE_LDADD +MOD_SED_LDADD +MOD_SUBSTITUTE_LDADD +MOD_REFLECTOR_LDADD +MOD_FILTER_LDADD +MOD_INCLUDE_LDADD +MOD_REQUEST_LDADD +MOD_EXT_FILTER_LDADD +MOD_REQTIMEOUT_LDADD +MOD_RATELIMIT_LDADD +MOD_DATA_LDADD +MOD_BUFFER_LDADD +MOD_EXAMPLE_IPC_LDADD +MOD_CASE_FILTER_IN_LDADD +MOD_CASE_FILTER_LDADD +MOD_EXAMPLE_HOOKS_LDADD +MOD_ECHO_LDADD +MOD_DUMPIO_LDADD +MOD_BUCKETEER_LDADD +MOD_DBD_LDADD +MOD_MACRO_LDADD +MOD_WATCHDOG_LDADD +MOD_SO_LDADD +INSTALL_DSO +MOD_SOCACHE_DC_LDADD +MOD_SOCACHE_REDIS_LDADD +MOD_SOCACHE_MEMCACHE_LDADD +MOD_SOCACHE_DBM_LDADD +MOD_SOCACHE_SHMCB_LDADD +MOD_CACHE_SOCACHE_LDADD +MOD_CACHE_DISK_LDADD +MOD_CACHE_LDADD +MOD_FILE_CACHE_LDADD +MOD_ISAPI_LDADD +MOD_ALLOWMETHODS_LDADD +MOD_AUTH_DIGEST_LDADD +MOD_AUTH_FORM_LDADD +MOD_AUTH_BASIC_LDADD +MOD_ACCESS_COMPAT_LDADD +MOD_AUTHNZ_FCGI_LDADD +MOD_AUTHNZ_LDAP_LDADD +MOD_AUTHZ_CORE_LDADD +MOD_AUTHZ_DBD_LDADD +MOD_AUTHZ_OWNER_LDADD +MOD_AUTHZ_DBM_LDADD +MOD_AUTHZ_USER_LDADD +MOD_AUTHZ_GROUPFILE_LDADD +MOD_AUTHZ_HOST_LDADD +MOD_AUTHN_CORE_LDADD +MOD_AUTHN_SOCACHE_LDADD +MOD_AUTHN_DBD_LDADD +MOD_AUTHN_ANON_LDADD +MOD_AUTHN_DBM_LDADD +MOD_AUTHN_FILE_LDADD +PILDFLAGS +PICFLAGS +DTRACE +CRYPT_LIBS +MATH_LIBS +MKDEP +INSTALL +MKINSTALLDIRS +LYNX_PATH +RANLIB +LN_S +AWK +SVN +RSYNC +PKGCONFIG +RM +LTCFLAGS +SHLTCFLAGS +PCRE_LIBS +ac_ct_PCRE_CONFIG +PCRE_CONFIG +CPP +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +target_os +target_vendor +target_cpu +target +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +EGREP +GREP +rel_proxycachedir +exp_proxycachedir +rel_logfiledir +exp_logfiledir +rel_runtimedir +exp_runtimedir +rel_localstatedir +exp_localstatedir +rel_includedir +exp_includedir +rel_cgidir +exp_cgidir +rel_manualdir +exp_manualdir +rel_htdocsdir +exp_htdocsdir +rel_iconsdir +exp_iconsdir +rel_errordir +exp_errordir +rel_installbuilddir +exp_installbuilddir +rel_datadir +exp_datadir +rel_sysconfdir +exp_sysconfdir +rel_mandir +exp_mandir +rel_libexecdir +exp_libexecdir +rel_libdir +exp_libdir +rel_sbindir +exp_sbindir +rel_bindir +exp_bindir +rel_exec_prefix +exp_exec_prefix +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_layout +with_included_apr +with_apr +with_apr_util +with_pcre +with_port +with_sslport +enable_dtrace +enable_hook_probes +enable_exception_hook +enable_load_all_modules +enable_maintainer_mode +enable_debugger_mode +enable_pie +enable_modules +enable_mods_shared +enable_mods_static +enable_authn_file +enable_authn_dbm +enable_authn_anon +enable_authn_dbd +enable_authn_socache +enable_authn_core +enable_authz_host +enable_authz_groupfile +enable_authz_user +enable_authz_dbm +enable_authz_owner +enable_authz_dbd +enable_authz_core +enable_authnz_ldap +enable_authnz_fcgi +enable_access_compat +enable_auth_basic +enable_auth_form +enable_auth_digest +enable_allowmethods +enable_isapi +enable_file_cache +enable_cache +enable_cache_disk +enable_cache_socache +enable_socache_shmcb +enable_socache_dbm +enable_socache_memcache +enable_socache_redis +enable_socache_dc +with_distcache +enable_so +enable_watchdog +enable_macro +enable_dbd +enable_bucketeer +enable_dumpio +enable_echo +enable_example_hooks +enable_case_filter +enable_case_filter_in +enable_example_ipc +enable_buffer +enable_data +enable_ratelimit +enable_reqtimeout +enable_ext_filter +enable_request +enable_include +enable_filter +enable_reflector +enable_substitute +enable_sed +enable_charset_lite +enable_deflate +with_z +enable_xml2enc +with_libxml2 +enable_proxy_html +enable_brotli +with_brotli +enable_http +enable_mime +enable_ldap +enable_log_config +enable_log_debug +enable_log_forensic +enable_logio +enable_lua +with_lua +enable_luajit +enable_env +enable_mime_magic +enable_cern_meta +enable_expires +enable_headers +enable_ident +enable_usertrack +enable_unique_id +enable_setenvif +enable_version +enable_remoteip +enable_proxy +enable_proxy_connect +enable_proxy_ftp +enable_proxy_http +enable_proxy_fcgi +enable_proxy_scgi +enable_proxy_uwsgi +enable_proxy_fdpass +enable_proxy_wstunnel +enable_proxy_ajp +enable_proxy_balancer +enable_proxy_express +enable_proxy_hcheck +enable_session +enable_session_cookie +enable_session_crypto +enable_session_dbd +enable_slotmem_shm +enable_slotmem_plain +enable_ssl +with_ssl +enable_ssl_staticlib_deps +enable_optional_hook_export +enable_optional_hook_import +enable_optional_fn_import +enable_optional_fn_export +enable_dialup +enable_static_support +enable_static_htpasswd +enable_static_htdigest +enable_static_rotatelogs +enable_static_logresolve +enable_static_htdbm +enable_static_ab +enable_static_checkgid +enable_static_htcacheclean +enable_static_httxt2dbm +enable_static_fcgistarter +enable_http2 +with_nghttp2 +enable_nghttp2_staticlib_deps +enable_proxy_http2 +enable_md +with_jansson +enable_jansson_staticlib_deps +with_curl +enable_curl_staticlib_deps +enable_lbmethod_byrequests +enable_lbmethod_bytraffic +enable_lbmethod_bybusyness +enable_lbmethod_heartbeat +with_mpm +enable_mpms_shared +enable_unixd +enable_privileges +enable_systemd +enable_heartbeat +enable_heartmonitor +enable_dav +enable_status +enable_autoindex +enable_asis +enable_info +enable_suexec +enable_cgid +enable_cgi +enable_cgid_fdpassing +enable_dav_fs +enable_dav_lock +with_module +enable_vhost_alias +enable_negotiation +enable_dir +enable_imagemap +enable_actions +enable_speling +enable_userdir +enable_alias +enable_rewrite +with_program_name +with_suexec_bin +with_suexec_caller +with_suexec_userdir +with_suexec_docroot +with_suexec_uidmin +with_suexec_gidmin +with_suexec_logfile +with_suexec_syslog +with_suexec_safepath +with_suexec_umask +enable_suexec_capabilities +enable_v4_mapped +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +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=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -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_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$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 ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: '$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: '$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$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 | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$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 ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + 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 | -n) + 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 ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -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_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: '$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: '$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=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 ;; + + -*) as_fn_error $? "unrecognized option: '$ac_option' +Try '$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: '$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: '$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# 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 the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + 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 + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +'configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print 'checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for '--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or '..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, 'make install' will install all the files in +'$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify +an installation prefix other than '$ac_default_prefix' using '--prefix', +for instance '--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-layout=LAYOUT + --enable-dtrace Enable DTrace probes + --enable-hook-probes Enable APR hook probes + --enable-exception-hook Enable fatal exception hook + --enable-load-all-modules + Load all modules + --enable-maintainer-mode + Turn on debugging and compile time warnings and load + all compiled modules + --enable-debugger-mode Turn on debugging and compile time warnings and turn + off optimization + --enable-pie Build httpd as a Position Independent Executable + --enable-modules=MODULE-LIST + Space-separated list of modules to enable | "all" | + "most" | "few" | "none" | "reallyall" + --enable-mods-shared=MODULE-LIST + Space-separated list of shared modules to enable | + "all" | "most" | "few" | "reallyall" + --enable-mods-static=MODULE-LIST + Space-separated list of static modules to enable | + "all" | "most" | "few" | "reallyall" + --disable-authn-file file-based authentication control + --enable-authn-dbm DBM-based authentication control + --enable-authn-anon anonymous user authentication control + --enable-authn-dbd SQL-based authentication control + --enable-authn-socache Cached authentication control + --disable-authn-core core authentication module + --disable-authz-host host-based authorization control + --disable-authz-groupfile + 'require group' authorization control + --disable-authz-user 'require user' authorization control + --enable-authz-dbm DBM-based authorization control + --enable-authz-owner 'require file-owner' authorization control + --enable-authz-dbd SQL based authorization and Login/Session support + --disable-authz-core core authorization provider vector module + --enable-authnz-ldap LDAP based authentication + --enable-authnz-fcgi FastCGI authorizer-based authentication and + authorization + --disable-access-compat mod_access compatibility + --disable-auth-basic basic authentication + --enable-auth-form form authentication + --enable-auth-digest RFC2617 Digest authentication + --enable-allowmethods restrict allowed HTTP methods + --enable-isapi isapi extension support + --enable-file-cache File cache + --enable-cache dynamic file caching. At least one storage + management module (e.g. mod_cache_disk) is also + necessary. + --enable-cache-disk disk caching module + --enable-cache-socache shared object caching module + --enable-socache-shmcb shmcb small object cache provider + --enable-socache-dbm dbm small object cache provider + --enable-socache-memcache + memcache small object cache provider + --enable-socache-redis redis small object cache provider + --enable-socache-dc distcache small object cache provider + --enable-so DSO capability. This module will be automatically + enabled unless you build all modules statically. + --enable-watchdog Watchdog module + --enable-macro Define and use macros in configuration files + --enable-dbd Apache DBD Framework + --enable-bucketeer buckets manipulation filter. Useful only for + developers and testing purposes. + --enable-dumpio I/O dump filter + --enable-echo ECHO server + --enable-example-hooks Example hook callback handler module + --enable-case-filter Example uppercase conversion filter + --enable-case-filter-in Example uppercase conversion input filter + --enable-example-ipc Example of shared memory and mutex usage + --enable-buffer Filter Buffering + --enable-data RFC2397 data encoder + --enable-ratelimit Output Bandwidth Limiting + --disable-reqtimeout Limit time waiting for request from client + --enable-ext-filter external filter module + --enable-request Request Body Filtering + --enable-include Server Side Includes + --disable-filter Smart Filtering + --enable-reflector Reflect request through the output filter stack + --enable-substitute response content rewrite-like filtering + --enable-sed filter request and/or response bodies through sed + --disable-charset-lite character set translation. Enabled by default only + on EBCDIC systems. + --enable-charset-lite character set translation. Enabled by default only + on EBCDIC systems. + --enable-deflate Deflate transfer encoding support + --enable-xml2enc i18n support for markup filters + --enable-proxy-html Fix HTML Links in a Reverse Proxy + --enable-brotli Brotli compression support + --enable-http HTTP protocol handling. The http module is a basic + one that enables the server to function as an HTTP + server. It is only useful to disable it if you want + to use another protocol module instead. Don't + disable this module unless you are really sure what + you are doing. Note: This module will always be + linked statically. + --disable-mime mapping of file-extension to MIME. Disabling this + module is normally not recommended. + --enable-ldap LDAP caching and connection pooling services + --disable-log-config logging configuration. You won't be able to log + requests to the server without this module. + --enable-log-debug configurable debug logging + --enable-log-forensic forensic logging + --enable-logio input and output logging + --enable-lua Apache Lua Framework + --enable-luajit Enable LuaJit Support + --disable-env clearing/setting of ENV vars + --enable-mime-magic automagically determining MIME type + --enable-cern-meta CERN-type meta files + --enable-expires Expires header control + --disable-headers HTTP header control + --enable-ident RFC 1413 identity check + --enable-usertrack user-session tracking + --enable-unique-id per-request unique ids + --disable-setenvif basing ENV vars on headers + --disable-version determining httpd version in config files + --enable-remoteip translate header contents to an apparent client + remote_ip + --enable-proxy Apache proxy module + --enable-proxy-connect Apache proxy CONNECT module. Requires + --enable-proxy. + --enable-proxy-ftp Apache proxy FTP module. Requires --enable-proxy. + --enable-proxy-http Apache proxy HTTP module. Requires --enable-proxy. + --enable-proxy-fcgi Apache proxy FastCGI module. Requires + --enable-proxy. + --enable-proxy-scgi Apache proxy SCGI module. Requires --enable-proxy. + --enable-proxy-uwsgi Apache proxy UWSGI module. Requires --enable-proxy. + --enable-proxy-fdpass Apache proxy to Unix Daemon Socket module. Requires + --enable-proxy. + --enable-proxy-wstunnel Apache proxy Websocket Tunnel module. Requires + --enable-proxy. + --enable-proxy-ajp Apache proxy AJP module. Requires --enable-proxy. + --enable-proxy-balancer Apache proxy BALANCER module. Requires + --enable-proxy. + --enable-proxy-express mass reverse-proxy module. Requires --enable-proxy. + --enable-proxy-hcheck reverse-proxy health-check module. Requires + --enable-proxy and --enable-watchdog. + --enable-session session module + --enable-session-cookie session cookie module + --enable-session-crypto session crypto module + --enable-session-dbd session dbd module + --enable-slotmem-shm slotmem provider that uses shared memory + --enable-slotmem-plain slotmem provider that uses plain memory + --enable-ssl SSL/TLS support (mod_ssl) + --enable-ssl-staticlib-deps + link mod_ssl with dependencies of OpenSSL's static + libraries (as indicated by "pkg-config --static"). + Must be specified in addition to --enable-ssl. + --enable-optional-hook-export + example optional hook exporter + --enable-optional-hook-import + example optional hook importer + --enable-optional-fn-import + example optional function importer + --enable-optional-fn-export + example optional function exporter + --enable-dialup rate limits static files to dialup modem speeds + --enable-static-support Build a statically linked version of the support + binaries + --enable-static-htpasswd + Build a statically linked version of htpasswd + --enable-static-htdigest + Build a statically linked version of htdigest + --enable-static-rotatelogs + Build a statically linked version of rotatelogs + --enable-static-logresolve + Build a statically linked version of logresolve + --enable-static-htdbm Build a statically linked version of htdbm + --enable-static-ab Build a statically linked version of ab + --enable-static-checkgid + Build a statically linked version of checkgid + --enable-static-htcacheclean + Build a statically linked version of htcacheclean + --enable-static-httxt2dbm + Build a statically linked version of httxt2dbm + --enable-static-fcgistarter + Build a statically linked version of fcgistarter + --enable-http2 HTTP/2 protocol handling in addition to HTTP + protocol handling. Implemented by mod_http2. This + module requires a libnghttp2 installation. See + --with-nghttp2 on how to manage non-standard + locations. This module is usually linked shared and + requires loading. + --enable-nghttp2-staticlib-deps + link mod_http2 with dependencies of libnghttp2's + static libraries (as indicated by "pkg-config + --static"). Must be specified in addition to + --enable-http2. + --enable-proxy-http2 HTTP/2 proxy module. This module requires a + libnghttp2 installation. See --with-nghttp2 on how + to manage non-standard locations. Also requires + --enable-proxy. + --enable-md Managed Domain handling + --enable-jansson-staticlib-deps + link mod_md with dependencies of libjansson's static + libraries (as indicated by "pkg-config --static"). + Must be specified in addition to --enable-md. + --enable-curl-staticlib-deps + link mod_md with dependencies of libcurl's static + libraries (as indicated by "pkg-config --static"). + Must be specified in addition to --enable-md. + --enable-lbmethod-byrequests + Apache proxy Load balancing by request counting + --enable-lbmethod-bytraffic + Apache proxy Load balancing by traffic counting + --enable-lbmethod-bybusyness + Apache proxy Load balancing by busyness + --enable-lbmethod-heartbeat + Apache proxy Load balancing from Heartbeats + --enable-mpms-shared=MPM-LIST + Space-separated list of MPM modules to enable for + dynamic loading. MPM-LIST=list | "all" + --enable-unixd unix specific support + --enable-privileges Per-virtualhost Unix UserIDs and enhanced security + for Solaris + --enable-systemd Systemd support + --enable-heartbeat Generates Heartbeats + --enable-heartmonitor Collects Heartbeats + --enable-dav WebDAV protocol handling. --enable-dav also enables + mod_dav_fs + --disable-status process/thread monitoring + --disable-autoindex directory listing + --enable-asis as-is filetypes + --enable-info server information + --enable-suexec set uid and gid for spawned processes + --enable-cgid CGI scripts. Enabled by default with threaded MPMs + --enable-cgi CGI scripts. Enabled by default with non-threaded + MPMs + --enable-cgid-fdpassing Enable experimental mod_cgid support for fd passing + --enable-dav-fs DAV provider for the filesystem. --enable-dav also + enables mod_dav_fs. + --enable-dav-lock DAV provider for generic locking + --enable-vhost-alias mass virtual hosting module + --enable-negotiation content negotiation + --disable-dir directory request handling + --enable-imagemap server-side imagemaps + --enable-actions Action triggering on requests + --enable-speling correct common URL misspellings + --enable-userdir mapping of requests to user-specific directories + --disable-alias mapping of requests to different filesystem parts + --enable-rewrite rule based URL manipulation + --enable-suexec-capabilities + Use Linux capability bits not setuid root suexec + --enable-v4-mapped Allow IPv6 sockets to handle IPv4 connections + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-included-apr Use bundled copies of APR/APR-Util + --with-apr=PATH prefix for installed APR or the full path to + apr-config + --with-apr-util=PATH prefix for installed APU or the full path to + apu-config + --with-pcre=PATH Use external PCRE library + --with-port=PORT Port on which to listen (default is 80) + --with-sslport=SSLPORT Port on which to securelisten (default is 443) + --with-distcache=PATH Distcache installation directory + --with-z=PATH use a specific zlib library + --with-libxml2=PATH location for libxml2 + --with-brotli=PATH Brotli installation directory + --with-lua=PATH Path to the Lua installation prefix + --with-ssl=PATH OpenSSL installation directory + --with-nghttp2=PATH nghttp2 installation directory + --with-jansson=PATH jansson installation directory + --with-curl=PATH curl installation directory + --with-mpm=MPM Choose the process model for Apache to use by + default. MPM={event|worker|prefork|winnt} This will + be statically linked as the only available MPM + unless --enable-mpms-shared is also specified. + --with-module=module-type:module-file + Enable module-file in the modules/ + directory. + --with-program-name alternate executable name + --with-suexec-bin Path to suexec binary + --with-suexec-caller User allowed to call SuExec + --with-suexec-userdir User subdirectory + --with-suexec-docroot SuExec root directory + --with-suexec-uidmin Minimal allowed UID + --with-suexec-gidmin Minimal allowed GID + --with-suexec-logfile Set the logfile + --with-suexec-syslog Use syslog for suexec logging + --with-suexec-safepath Set the safepath + --with-suexec-umask umask for suexec'd process + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by 'configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.72 + +Copyright (C) 2023 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 ;; +esac +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + } +then : + ac_retval=0 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 ;; +esac +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else case e in #( + e) eval "$3=no" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + } +then : + ac_retval=0 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 ;; +esac +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that +# executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then : + ac_retval=0 +else case e in #( + e) printf "%s\n" "$as_me: program exited with status $ac_status" >&5 + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status ;; +esac +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (void); below. */ + +#include +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (void); +/* 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_$2 || defined __stub___$2 +choke me +#endif + +int +main (void) +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "$3=yes" +else case e in #( + e) eval "$3=no" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext ;; +esac +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR +# ------------------------------------------------------------------ +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR. +ac_fn_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +printf %s "checking whether $as_decl_name is declared... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + eval ac_save_FLAGS=\$$6 + as_fn_append $6 " $5" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else case e in #( + e) eval "$3=no" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + eval $6=\$ac_save_FLAGS + ;; +esac +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_check_decl +ac_configure_args_raw= +for ac_arg +do + case $ac_arg in + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_configure_args_raw " '$ac_arg'" +done + +case $ac_configure_args_raw in + *$as_nl*) + ac_safe_unquote= ;; + *) + ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. + ac_unsafe_a="$ac_unsafe_z#~" + ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" + ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; +esac + +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.72. Invocation command line was + + $ $0$ac_configure_args_raw + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +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 || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" + # Save into config.log some information that might help in debugging. + { + echo + + printf "%s\n" "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + printf "%s\n" "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + printf "%s\n" "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + printf "%s\n" "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +printf "%s\n" "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + ac_site_files="$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" +else + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" +fi + +for ac_site_file in $ac_site_files +do + case $ac_site_file in #( + */*) : + ;; #( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See 'config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif + +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (char **p, int i) +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* C89 style stringification. */ +#define noexpand_stringify(a) #a +const char *stringified = noexpand_stringify(arbitrary+token=sequence); + +/* C89 style token pasting. Exercises some of the corner cases that + e.g. old MSVC gets wrong, but not very hard. */ +#define noexpand_concat(a,b) a##b +#define expand_concat(a,b) noexpand_concat(a,b) +extern int vA; +extern int vbee; +#define aye A +#define bee B +int *pvA = &expand_concat(v,aye); +int *pvbee = &noexpand_concat(v,bee); + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not \xHH hex character constants. + These do not provoke an error unfortunately, instead are silently treated + as an "x". The following induces an error, until -std is added to get + proper ANSI mode. Curiously \x00 != x always comes out true, for an + array size at least. It is necessary to write \x00 == 0 to get something + that is true only with -std. */ +int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) '\''x'\'' +int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), + int, int);' + +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' + +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +/* Does the compiler advertise C99 conformance? */ +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif + +// See if C++-style comments work. + +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); +extern void free (void *); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "your preprocessor is broken" +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static bool +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str = ""; + int number = 0; + float fnumber = 0; + + while (*format) + { + switch (*format++) + { + case '\''s'\'': // string + str = va_arg (args_copy, const char *); + break; + case '\''d'\'': // int + number = va_arg (args_copy, int); + break; + case '\''f'\'': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); + + return *str && number && fnumber; +} +' + +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + // Work around memory leak warnings. + free (ia); + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' + +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +/* Does the compiler advertise C11 conformance? */ +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif + +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; + +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); + +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } + +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; + +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; + +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; + +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' + +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' + +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" + +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" + +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" +as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H" +as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H" + +# Auxiliary files required by this configure script. +ac_aux_files="config.guess config.sub" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}/build" + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in $ac_aux_dir_candidates +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break + fi + ac_first_candidate=false + + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else case e in #( + e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; +esac +fi + + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +if test -f "${ac_aux_dir}config.guess"; then + ac_config_guess="$SHELL ${ac_aux_dir}config.guess" +fi +if test -f "${ac_aux_dir}config.sub"; then + ac_config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_configure="$SHELL ${ac_aux_dir}configure" +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' + and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_config_headers="$ac_config_headers include/ap_config_auto.h" + + + +abs_srcdir=`(cd $srcdir && pwd)` +abs_builddir=`pwd` + +HTTPD_VERSION=`$abs_srcdir/build/get-version.sh all $abs_srcdir/include/ap_release.h AP_SERVER` +HTTPD_MMN=`$abs_srcdir/build/get-version.sh mmn $abs_srcdir/include/ap_mmn.h MODULE_MAGIC_NUMBER` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# Check whether --enable-layout was given. +if test ${enable_layout+y} +then : + enableval=$enable_layout; + LAYOUT=$enableval + +fi + + +if test -z "$LAYOUT"; then + LAYOUT="Apache" +fi + + if test ! -f $srcdir/config.layout; then + echo "** Error: Layout file $srcdir/config.layout not found" + echo "** Error: Cannot use undefined layout '$LAYOUT'" + exit 1 + fi + # Catch layout names including a slash which will otherwise + # confuse the heck out of the sed script. + case $LAYOUT in + */*) + echo "** Error: $LAYOUT is not a valid layout name" + exit 1 ;; + esac + pldconf=./config.pld + + sed -e "1s/[ ]*<[lL]ayout[ ]*$LAYOUT[ ]*>[ ]*//;1t" \ + -e "1,/[ ]*<[lL]ayout[ ]*$LAYOUT[ ]*>[ ]*/d" \ + -e '/[ ]*<\/Layout>[ ]*/,$d' \ + -e "s/^[ ]*//g" \ + -e "s/:[ ]*/=\'/g" \ + -e "s/[ ]*$/'/g" \ + $srcdir/config.layout > $pldconf + layout_name=$LAYOUT + if test ! -s $pldconf; then + echo "** Error: unable to find layout $layout_name" + exit 1 + fi + . $pldconf + rm $pldconf + for var in prefix exec_prefix bindir sbindir libexecdir mandir \ + sysconfdir datadir includedir localstatedir runtimedir \ + logfiledir libdir installbuilddir libsuffix errordir iconsdir htdocsdir cgidir; do + eval "val=\"\$$var\"" + case $val in + *+) + val=`echo $val | sed -e 's;\+$;;'` + eval "$var=\"\$val\"" + autosuffix=yes + ;; + *) + autosuffix=no + ;; + esac + val=`echo $val | sed -e 's:\(.\)/*$:\1:'` + val=`echo $val | sed -e 's:[\$]\([a-z_]*\):$\1:g'` + if test "$autosuffix" = "yes"; then + if echo $val | grep apache >/dev/null; then + addtarget=no + else + addtarget=yes + fi + if test "$addtarget" = "yes"; then + val="$val/apache2" + fi + fi + eval "$var='$val'" + done + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for chosen layout" >&5 +printf %s "checking for chosen layout... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $layout_name" >&5 +printf "%s\n" "$layout_name" >&6; } + + + +ac_prev= +# Retrieve the command-line arguments. The eval is needed because +# the arguments are quoted to preserve accuracy. +eval "set x $ac_configure_args" +shift +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 + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$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" ;; + + -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" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -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" ;; + + -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" ;; + + esac +done + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) as_fn_error $? "expected an absolute path for --$ac_var: $ac_val" "$LINENO" 5;; + esac +done + + + + + + +ap_last= +ap_cur="$exec_prefix" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_exec_prefix="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_exec_prefix" + + + +ap_stripped=`echo $exp_exec_prefix | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_exec_prefix" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_exec_prefix="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_exec_prefix="$exp_exec_prefix" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_exec_prefix" + + + + + +ap_last= +ap_cur="$bindir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_bindir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_bindir" + + + +ap_stripped=`echo $exp_bindir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_bindir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_bindir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_bindir="$exp_bindir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_bindir" + + + + + +ap_last= +ap_cur="$sbindir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_sbindir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_sbindir" + + + +ap_stripped=`echo $exp_sbindir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_sbindir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_sbindir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_sbindir="$exp_sbindir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_sbindir" + + + + + +ap_last= +ap_cur="$libdir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_libdir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_libdir" + + + +ap_stripped=`echo $exp_libdir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_libdir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_libdir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_libdir="$exp_libdir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_libdir" + + + + + +ap_last= +ap_cur="$libexecdir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_libexecdir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_libexecdir" + + + +ap_stripped=`echo $exp_libexecdir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_libexecdir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_libexecdir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_libexecdir="$exp_libexecdir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_libexecdir" + + + + + +ap_last= +ap_cur="$mandir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_mandir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_mandir" + + + +ap_stripped=`echo $exp_mandir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_mandir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_mandir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_mandir="$exp_mandir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_mandir" + + + + + +ap_last= +ap_cur="$sysconfdir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_sysconfdir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_sysconfdir" + + + +ap_stripped=`echo $exp_sysconfdir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_sysconfdir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_sysconfdir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_sysconfdir="$exp_sysconfdir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_sysconfdir" + + + + + +ap_last= +ap_cur="$datadir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_datadir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_datadir" + + + +ap_stripped=`echo $exp_datadir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_datadir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_datadir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_datadir="$exp_datadir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_datadir" + + + + + +ap_last= +ap_cur="$installbuilddir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_installbuilddir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_installbuilddir" + + + +ap_stripped=`echo $exp_installbuilddir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_installbuilddir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_installbuilddir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_installbuilddir="$exp_installbuilddir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_installbuilddir" + + + + + +ap_last= +ap_cur="$errordir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_errordir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_errordir" + + + +ap_stripped=`echo $exp_errordir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_errordir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_errordir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_errordir="$exp_errordir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_errordir" + + + + + +ap_last= +ap_cur="$iconsdir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_iconsdir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_iconsdir" + + + +ap_stripped=`echo $exp_iconsdir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_iconsdir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_iconsdir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_iconsdir="$exp_iconsdir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_iconsdir" + + + + + +ap_last= +ap_cur="$htdocsdir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_htdocsdir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_htdocsdir" + + + +ap_stripped=`echo $exp_htdocsdir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_htdocsdir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_htdocsdir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_htdocsdir="$exp_htdocsdir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_htdocsdir" + + + + + +ap_last= +ap_cur="$manualdir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_manualdir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_manualdir" + + + +ap_stripped=`echo $exp_manualdir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_manualdir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_manualdir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_manualdir="$exp_manualdir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_manualdir" + + + + + +ap_last= +ap_cur="$cgidir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_cgidir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_cgidir" + + + +ap_stripped=`echo $exp_cgidir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_cgidir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_cgidir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_cgidir="$exp_cgidir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_cgidir" + + + + + +ap_last= +ap_cur="$includedir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_includedir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_includedir" + + + +ap_stripped=`echo $exp_includedir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_includedir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_includedir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_includedir="$exp_includedir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_includedir" + + + + + +ap_last= +ap_cur="$localstatedir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_localstatedir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_localstatedir" + + + +ap_stripped=`echo $exp_localstatedir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_localstatedir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_localstatedir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_localstatedir="$exp_localstatedir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_localstatedir" + + + + + +ap_last= +ap_cur="$runtimedir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_runtimedir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_runtimedir" + + + +ap_stripped=`echo $exp_runtimedir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_runtimedir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_runtimedir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_runtimedir="$exp_runtimedir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_runtimedir" + + + + + +ap_last= +ap_cur="$logfiledir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_logfiledir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_logfiledir" + + + +ap_stripped=`echo $exp_logfiledir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_logfiledir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_logfiledir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_logfiledir="$exp_logfiledir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_logfiledir" + + + + + +ap_last= +ap_cur="$proxycachedir" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +exp_proxycachedir="${ap_cur}" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exp_proxycachedir" + + + +ap_stripped=`echo $exp_proxycachedir | sed -e "s#^${prefix}##"` +# check if the stripping was successful +if test "x$exp_proxycachedir" != "x${ap_stripped}"; then + # it was, so strip of any leading slashes + rel_proxycachedir="`echo ${ap_stripped} | sed -e 's#^/*##'`" +else + # it wasn't so return the original + rel_proxycachedir="$exp_proxycachedir" +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rel_proxycachedir" + + + + + + + apr_ste_save_CPPFLAGS="$CPPFLAGS" + + + apr_ste_save_CFLAGS="$CFLAGS" + + + apr_ste_save_CXXFLAGS="$CXXFLAGS" + + + apr_ste_save_LDFLAGS="$LDFLAGS" + + + apr_ste_save_LIBS="$LIBS" + + + apr_ste_save_INCLUDES="$INCLUDES" + + + + rm -f config.nice + cat >config.nice<> config.nice + fi + if test -n "$CFLAGS"; then + echo "CFLAGS=\"$CFLAGS\"; export CFLAGS" >> config.nice + fi + if test -n "$CPPFLAGS"; then + echo "CPPFLAGS=\"$CPPFLAGS\"; export CPPFLAGS" >> config.nice + fi + if test -n "$LDFLAGS"; then + echo "LDFLAGS=\"$LDFLAGS\"; export LDFLAGS" >> config.nice + fi + if test -n "$LTFLAGS"; then + echo "LTFLAGS=\"$LTFLAGS\"; export LTFLAGS" >> config.nice + fi + if test -n "$LIBS"; then + echo "LIBS=\"$LIBS\"; export LIBS" >> config.nice + fi + if test -n "$INCLUDES"; then + echo "INCLUDES=\"$INCLUDES\"; export INCLUDES" >> config.nice + fi + if test -n "$NOTEST_CFLAGS"; then + echo "NOTEST_CFLAGS=\"$NOTEST_CFLAGS\"; export NOTEST_CFLAGS" >> config.nice + fi + if test -n "$NOTEST_CPPFLAGS"; then + echo "NOTEST_CPPFLAGS=\"$NOTEST_CPPFLAGS\"; export NOTEST_CPPFLAGS" >> config.nice + fi + if test -n "$NOTEST_LDFLAGS"; then + echo "NOTEST_LDFLAGS=\"$NOTEST_LDFLAGS\"; export NOTEST_LDFLAGS" >> config.nice + fi + if test -n "$NOTEST_LIBS"; then + echo "NOTEST_LIBS=\"$NOTEST_LIBS\"; export NOTEST_LIBS" >> config.nice + fi + + # Retrieve command-line arguments. + eval "set x $0 $ac_configure_args" + shift + + for arg + do + +ap_last= +ap_cur="$arg" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +arg="${ap_cur}" + + echo "\"$arg\" \\" >> config.nice + done + echo '"$@"' >> config.nice + chmod +x config.nice + + +nl=' +' + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working mkdir -p" >&5 +printf %s "checking for working mkdir -p... " >&6; } +if test ${ac_cv_mkdir_p+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + test -d conftestdir && rm -rf conftestdir + mkdir -p conftestdir/somedir >/dev/null 2>&1 + if test -d conftestdir/somedir; then + ac_cv_mkdir_p=yes + else + ac_cv_mkdir_p=no + fi + rm -rf conftestdir + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_mkdir_p" >&5 +printf "%s\n" "$ac_cv_mkdir_p" >&6; } + if test "$ac_cv_mkdir_p" = "yes"; then + mkdir_p="mkdir -p" + else + mkdir_p="$top_srcdir/build/mkdir.sh" + fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in #( +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + EGREP_TRADITIONAL=$EGREP + ac_cv_path_EGREP_TRADITIONAL=$EGREP + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST EGREP" + + + + + + + + + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 +fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 +printf %s "checking target system type... " >&6; } +if test ${ac_cv_target+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host +else + ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5 +fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 +printf "%s\n" "$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; +esac +target=$ac_cv_target +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_target +shift +target_cpu=$1 +target_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +target_os=$* +IFS=$ac_save_IFS +case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + + +orig_prefix="$prefix" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: " >&5 +printf "%s\n" "$as_me: " >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Configuring Apache Portable Runtime library..." >&5 +printf "%s\n" "$as_me: Configuring Apache Portable Runtime library..." >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: " >&5 +printf "%s\n" "$as_me: " >&6;} + + +# Check whether --with-included-apr was given. +if test ${with_included_apr+y} +then : + withval=$with_included_apr; +fi + + +if test "x$with_included_apr" = "xyes"; then + apr_found=reconfig + if test ! -d srclib/apr && test ! -d $srcdir/srclib/apr; then + as_fn_error $? "Bundled APR requested but not found at ./srclib/. Download and unpack the corresponding apr and apr-util packages to ./srclib/." "$LINENO" 5 + fi +else + + apr_found="no" + + if test "$target_os" = "os2-emx"; then + # Scripts don't pass test -x on OS/2 + TEST_X="test -f" + else + TEST_X="test -x" + fi + + acceptable_majors="1 2" + + apr_temp_acceptable_apr_config="" + for apr_temp_major in $acceptable_majors + do + case $apr_temp_major in + 0) + apr_temp_acceptable_apr_config="$apr_temp_acceptable_apr_config apr-config" + ;; + *) + apr_temp_acceptable_apr_config="$apr_temp_acceptable_apr_config apr-$apr_temp_major-config" + ;; + esac + done + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for APR" >&5 +printf %s "checking for APR... " >&6; } + +# Check whether --with-apr was given. +if test ${with_apr+y} +then : + withval=$with_apr; + if test "$withval" = "no" || test "$withval" = "yes"; then + as_fn_error $? "--with-apr requires a directory or file to be provided" "$LINENO" 5 + fi + + for apr_temp_apr_config_file in $apr_temp_acceptable_apr_config + do + for lookdir in "$withval/bin" "$withval" + do + if $TEST_X "$lookdir/$apr_temp_apr_config_file"; then + apr_config="$lookdir/$apr_temp_apr_config_file" + + apr_acceptable="yes" + + version=`$apr_config --version` + case x${version} in + x1.[0-3].*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: APR version 1.4.0 or later is required, found $version" >&5 +printf "%s\n" "$as_me: WARNING: APR version 1.4.0 or later is required, found $version" >&2;} + apr_acceptable=no + ;; + esac + unset version + + if test "$apr_acceptable" != "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Found APR in $apr_config, but we think it is considered unacceptable" >&5 +printf "%s\n" "$as_me: WARNING: Found APR in $apr_config, but we think it is considered unacceptable" >&2;} + continue + fi + apr_found="yes" + break 2 + fi + done + done + + if test "$apr_found" != "yes" && $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then + apr_config="$withval" + + apr_acceptable="yes" + + version=`$apr_config --version` + case x${version} in + x1.[0-3].*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: APR version 1.4.0 or later is required, found $version" >&5 +printf "%s\n" "$as_me: WARNING: APR version 1.4.0 or later is required, found $version" >&2;} + apr_acceptable=no + ;; + esac + unset version + + if test "$apr_acceptable" = "yes"; then + apr_found="yes" + fi + fi + + if test "$apr_found" != "yes"; then + as_fn_error $? "the --with-apr parameter is incorrect. It must specify an install prefix, a build directory, or an apr-config file." "$LINENO" 5 + fi + +else case e in #( + e) + if test -n "1" && test "1" = "1"; then + for apr_temp_apr_config_file in $apr_temp_acceptable_apr_config + do + if $apr_temp_apr_config_file --help > /dev/null 2>&1 ; then + apr_config="$apr_temp_apr_config_file" + + apr_acceptable="yes" + + version=`$apr_config --version` + case x${version} in + x1.[0-3].*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: APR version 1.4.0 or later is required, found $version" >&5 +printf "%s\n" "$as_me: WARNING: APR version 1.4.0 or later is required, found $version" >&2;} + apr_acceptable=no + ;; + esac + unset version + + if test "$apr_acceptable" != "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: skipped APR at $apr_config, version not acceptable" >&5 +printf "%s\n" "$as_me: WARNING: skipped APR at $apr_config, version not acceptable" >&2;} + continue + fi + apr_found="yes" + break + else + for lookdir in /usr /usr/local /usr/local/apr /opt/apr; do + if $TEST_X "$lookdir/bin/$apr_temp_apr_config_file"; then + apr_config="$lookdir/bin/$apr_temp_apr_config_file" + + apr_acceptable="yes" + + version=`$apr_config --version` + case x${version} in + x1.[0-3].*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: APR version 1.4.0 or later is required, found $version" >&5 +printf "%s\n" "$as_me: WARNING: APR version 1.4.0 or later is required, found $version" >&2;} + apr_acceptable=no + ;; + esac + unset version + + if test "$apr_acceptable" != "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: skipped APR at $apr_config, version not acceptable" >&5 +printf "%s\n" "$as_me: WARNING: skipped APR at $apr_config, version not acceptable" >&2;} + continue + fi + apr_found="yes" + break 2 + fi + done + fi + done + fi + if test "$apr_found" = "no" && test -d ""$srcdir/srclib/apr""; then + apr_temp_abs_srcdir="`cd \""$srcdir/srclib/apr"\" && pwd`" + apr_found="reconfig" + apr_bundled_major="`sed -n '/#define.*APR_MAJOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p' \""$srcdir/srclib/apr"/include/apr_version.h\"`" + case $apr_bundled_major in + "") + as_fn_error $? "failed to find major version of bundled APR" "$LINENO" 5 + ;; + 0) + apr_temp_apr_config_file="apr-config" + ;; + *) + apr_temp_apr_config_file="apr-$apr_bundled_major-config" + ;; + esac + if test -n ""./srclib/apr""; then + apr_config=""./srclib/apr"/$apr_temp_apr_config_file" + else + apr_config=""$srcdir/srclib/apr"/$apr_temp_apr_config_file" + fi + fi + ;; +esac +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $apr_found" >&5 +printf "%s\n" "$apr_found" >&6; } + +fi + +if test "$apr_found" = "no"; then + as_fn_error $? "APR not found. Please read the documentation." "$LINENO" 5 +fi + +if test "$apr_found" = "reconfig"; then + + # save our work to this point; this allows the sub-package to use it + cat >confcache <<\_ACEOF +# 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, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# 'ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* 'ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# 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. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # 'set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # 'set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + + echo "configuring package in srclib/apr now" + ac_popdir=`pwd` + apr_config_subdirs="srclib/apr" + test -d srclib/apr || $mkdir_p srclib/apr + ac_abs_srcdir=`(cd $srcdir/srclib/apr && pwd)` + cd srclib/apr + + # A "../" for each directory in /$config_subdirs. + ac_dots=`echo $apr_config_subdirs|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'` + + # Make the cache file pathname absolute for the subdirs + # required to correctly handle subdirs that might actually + # be symlinks + case "$cache_file" in + /*) # already absolute + ac_sub_cache_file=$cache_file ;; + *) # Was relative path. + ac_sub_cache_file="$ac_popdir/$cache_file" ;; + esac + + + apr_configure_args= + apr_sep= + for apr_configure_arg in $ac_configure_args + do + case "$apr_configure_arg" in + --enable-layout=*|\'--enable-layout=*) + continue ;; + esac + apr_configure_args="$apr_configure_args$apr_sep'$apr_configure_arg'" + apr_sep=" " + done + + + test "x$silent" = "xyes" && apr_configure_args="$apr_configure_args --silent" + + apr_configure_args="--disable-option-checking $apr_configure_args" + + if eval $SHELL $ac_abs_srcdir/configure $apr_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_abs_srcdir $apache_apr_flags --prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir --datadir=$datadir --with-installbuilddir=$installbuilddir + then : + echo "srclib/apr configured properly" + else + echo "configure failed for srclib/apr" + exit 1 + fi + + cd $ac_popdir + + # grab any updates from the sub-package + if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + + + AP_BUILD_SRCLIB_DIRS="apr $AP_BUILD_SRCLIB_DIRS" + AP_CLEAN_SRCLIB_DIRS="$AP_CLEAN_SRCLIB_DIRS apr" + + for majorver in 1 2; do + test_apr_config="./srclib/apr/apr-${majorver}-config" + if test -f "$test_apr_config"; then + apr_config="$test_apr_config" + fi + done +fi + + + if test -z "$CC"; then + test "x$silent" != "xyes" && echo " setting CC to \"`$apr_config --cc`\"" + CC="`$apr_config --cc`" + fi + + + if test -z "$CPP"; then + test "x$silent" != "xyes" && echo " setting CPP to \"`$apr_config --cpp`\"" + CPP="`$apr_config --cpp`" + fi + + + if test "x$CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CFLAGS to \"`$apr_config --cflags`\"" + CFLAGS="`$apr_config --cflags`" + else + apr_addto_bugger="`$apr_config --cflags`" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"`$apr_config --cppflags`\"" + CPPFLAGS="`$apr_config --cppflags`" + else + apr_addto_bugger="`$apr_config --cppflags`" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + +INTERNAL_CPPFLAGS="" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"`$apr_config --ldflags`\"" + LDFLAGS="`$apr_config --ldflags`" + else + apr_addto_bugger="`$apr_config --ldflags`" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + +SHLIBPATH_VAR=`$apr_config --shlib-path-var` +APR_BINDIR=`$apr_config --bindir` +APR_INCLUDEDIR=`$apr_config --includedir` +APR_INCLUDES=`$apr_config --includes` +APR_VERSION=`$apr_config --version` +apr_major_version=`echo ${APR_VERSION} | sed 's,\..*,,'` +APR_CONFIG="$APR_BINDIR/apr-${apr_major_version}-config" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: " >&5 +printf "%s\n" "$as_me: " >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Configuring Apache Portable Runtime Utility library..." >&5 +printf "%s\n" "$as_me: Configuring Apache Portable Runtime Utility library..." >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: " >&5 +printf "%s\n" "$as_me: " >&6;} + +if test "x${apr_major_version}" = "x2"; then + apu_found=obsolete +elif test "x$with_included_apr" = "xyes"; then + apu_found=reconfig + if test ! -d srclib/apr-util && test ! -d $srcdir/srclib/apr-util; then + as_fn_error $? "Bundled APR-Util requested but not found at ./srclib/. Download and unpack the corresponding apr and apr-util packages to ./srclib/." "$LINENO" 5 + fi +else + + + apu_found="no" + + if test "$target_os" = "os2-emx"; then + # Scripts don't pass test -x on OS/2 + TEST_X="test -f" + else + TEST_X="test -x" + fi + + acceptable_majors="${apr_major_version}" + + apu_temp_acceptable_apu_config="" + for apu_temp_major in $acceptable_majors + do + case $apu_temp_major in + 0) + apu_temp_acceptable_apu_config="$apu_temp_acceptable_apu_config apu-config" + ;; + *) + apu_temp_acceptable_apu_config="$apu_temp_acceptable_apu_config apu-$apu_temp_major-config" + ;; + esac + done + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for APR-util" >&5 +printf %s "checking for APR-util... " >&6; } + +# Check whether --with-apr-util was given. +if test ${with_apr_util+y} +then : + withval=$with_apr_util; + if test "$withval" = "no" || test "$withval" = "yes"; then + as_fn_error $? "--with-apr-util requires a directory or file to be provided" "$LINENO" 5 + fi + + for apu_temp_apu_config_file in $apu_temp_acceptable_apu_config + do + for lookdir in "$withval/bin" "$withval" + do + if $TEST_X "$lookdir/$apu_temp_apu_config_file"; then + apu_config="$lookdir/$apu_temp_apu_config_file" + + apu_found="yes" + break 2 + fi + done + done + + if test "$apu_found" != "yes" && $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then + apu_config="$withval" + apu_found="yes" + fi + + if test "$apu_found" != "yes"; then + as_fn_error $? "the --with-apr-util parameter is incorrect. It must specify an install prefix, a build directory, or an apu-config file." "$LINENO" 5 + fi + +else case e in #( + e) + if test -n "1" && test "1" = "1"; then + for apu_temp_apu_config_file in $apu_temp_acceptable_apu_config + do + if $apu_temp_apu_config_file --help > /dev/null 2>&1 ; then + apu_config="$apu_temp_apu_config_file" + + apu_found="yes" + break + else + for lookdir in /usr /usr/local /usr/local/apr /opt/apr; do + if $TEST_X "$lookdir/bin/$apu_temp_apu_config_file"; then + apu_config="$lookdir/bin/$apu_temp_apu_config_file" + + apu_found="yes" + break 2 + fi + done + fi + done + fi + if test "$apu_found" = "no" && test -d ""$srcdir/srclib/apr-util""; then + apu_temp_abs_srcdir="`cd \""$srcdir/srclib/apr-util"\" && pwd`" + apu_found="reconfig" + apu_bundled_major="`sed -n '/#define.*APU_MAJOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p' \""$srcdir/srclib/apr-util"/include/apu_version.h\"`" + case $apu_bundled_major in + "") + as_fn_error $? "failed to find major version of bundled APU" "$LINENO" 5 + ;; + 0) + apu_temp_apu_config_file="apu-config" + ;; + *) + apu_temp_apu_config_file="apu-$apu_bundled_major-config" + ;; + esac + if test -n ""./srclib/apr-util""; then + apu_config=""./srclib/apr-util"/$apu_temp_apu_config_file" + else + apu_config=""$srcdir/srclib/apr-util"/$apu_temp_apu_config_file" + fi + fi + ;; +esac +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $apu_found" >&5 +printf "%s\n" "$apu_found" >&6; } + + +fi + +if test "$apu_found" = "no"; then + as_fn_error $? "APR-util not found. Please read the documentation." "$LINENO" 5 +fi + +# Catch some misconfigurations: +case ${apr_found}.${apu_found} in +reconfig.yes) + as_fn_error $? "Cannot use an external APR-util with the bundled APR" "$LINENO" 5 + ;; +yes.reconfig) + as_fn_error $? "Cannot use an external APR with the bundled APR-util" "$LINENO" 5 + ;; +esac + +if test "$apu_found" = "reconfig"; then + + # save our work to this point; this allows the sub-package to use it + cat >confcache <<\_ACEOF +# 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, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# 'ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* 'ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# 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. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # 'set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # 'set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + + echo "configuring package in srclib/apr-util now" + ac_popdir=`pwd` + apr_config_subdirs="srclib/apr-util" + test -d srclib/apr-util || $mkdir_p srclib/apr-util + ac_abs_srcdir=`(cd $srcdir/srclib/apr-util && pwd)` + cd srclib/apr-util + + # A "../" for each directory in /$config_subdirs. + ac_dots=`echo $apr_config_subdirs|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'` + + # Make the cache file pathname absolute for the subdirs + # required to correctly handle subdirs that might actually + # be symlinks + case "$cache_file" in + /*) # already absolute + ac_sub_cache_file=$cache_file ;; + *) # Was relative path. + ac_sub_cache_file="$ac_popdir/$cache_file" ;; + esac + + + apr_configure_args= + apr_sep= + for apr_configure_arg in $ac_configure_args + do + case "$apr_configure_arg" in + --enable-layout=*|\'--enable-layout=*) + continue ;; + esac + apr_configure_args="$apr_configure_args$apr_sep'$apr_configure_arg'" + apr_sep=" " + done + + + test "x$silent" = "xyes" && apr_configure_args="$apr_configure_args --silent" + + apr_configure_args="--disable-option-checking $apr_configure_args" + + if eval $SHELL $ac_abs_srcdir/configure $apr_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_abs_srcdir --with-apr=../apr --prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir + then : + echo "srclib/apr-util configured properly" + else + echo "configure failed for srclib/apr-util" + exit 1 + fi + + cd $ac_popdir + + # grab any updates from the sub-package + if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + + + AP_BUILD_SRCLIB_DIRS="$AP_BUILD_SRCLIB_DIRS apr-util" + AP_CLEAN_SRCLIB_DIRS="apr-util $AP_CLEAN_SRCLIB_DIRS" + apu_config="./srclib/apr-util/apu-${apr_major_version}-config" +fi + +if test "$apu_found" = "obsolete"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: APR-util obsoleted, woohoo" >&5 +printf "%s\n" "$as_me: APR-util obsoleted, woohoo" >&6;} +else + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"`$apu_config --ldflags`\"" + LDFLAGS="`$apu_config --ldflags`" + else + apr_addto_bugger="`$apu_config --ldflags`" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + APU_BINDIR=`$apu_config --bindir` + APU_INCLUDEDIR=`$apu_config --includedir` + APU_INCLUDES=`$apu_config --includes` + APU_VERSION=`$apu_config --version` + APU_CONFIG="$APU_BINDIR/apu-`echo ${APU_VERSION} | sed 's,\..*,,'`-config" +fi + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + fi +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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_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 $# != 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 + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + fi +fi +fi ;; +esac +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See 'config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. +# So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an '-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else case e in #( + e) ac_file='' ;; +esac +fi +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See 'config.log' for more details" "$LINENO" 5; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) +# catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will +# work properly (i.e., refer to 'conftest.exe'), while it won't with +# 'rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else case e in #( + e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See 'config.log' for more details" "$LINENO" 5; } ;; +esac +fi +rm -f conftest conftest$ac_cv_exeext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +FILE *f = fopen ("conftest.out", "w"); + if (!f) + return 1; + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. +If you meant to cross compile, use '--host'. +See 'config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext \ + conftest.o conftest.obj conftest.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See 'config.log' for more details" "$LINENO" 5; } ;; +esac +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else case e in #( + e) ac_compiler_gnu=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else case e in #( + e) CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else case e in #( + e) ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; 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 +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC ;; +esac +fi + +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else case e in #( + e) if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" ;; +esac +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 ;; +esac +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC ;; +esac +fi + +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else case e in #( + e) if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" ;; +esac +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 ;; +esac +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC ;; +esac +fi + +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else case e in #( + e) if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" ;; +esac +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 ;; +esac +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +printf %s "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test ${ac_cv_prog_CPP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) # Double quotes because $CC needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else case e in #( + e) # Broken: fails on valid input. +continue ;; +esac +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else case e in #( + e) # Passes both tests. +ac_preproc_ok=: +break ;; +esac +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CPP=$CPP + ;; +esac +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +printf "%s\n" "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else case e in #( + e) # Broken: fails on valid input. +continue ;; +esac +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else case e in #( + e) # Passes both tests. +ac_preproc_ok=: +break ;; +esac +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else case e in #( + e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See 'config.log' for more details" "$LINENO" 5; } ;; +esac +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +if test "x${cache_file}" = "x/dev/null"; then + # Likewise, ensure that CC and CPP are passed through to the pcre + # configure script iff caching is disabled (the autoconf 2.5x default). + export CC; export CPP +fi + + +# Check whether --with-pcre was given. +if test ${with_pcre+y} +then : + withval=$with_pcre; +fi + +if test "x$with_pcre" = "x" || test "$with_pcre" = "yes"; then + with_pcre="$PATH" +else if which $with_pcre 2>/dev/null; then :; else + with_pcre="$with_pcre/bin:$with_pcre" +fi +fi + +for ac_prog in pcre2-config pcre-config +do + # Extract the first word of "$target_alias-$ac_prog", so it can be a program name with args. +set dummy $target_alias-$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PCRE_CONFIG+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$PCRE_CONFIG"; then + ac_cv_prog_PCRE_CONFIG="$PCRE_CONFIG" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $with_pcre +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_PCRE_CONFIG="$target_alias-$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +PCRE_CONFIG=$ac_cv_prog_PCRE_CONFIG +if test -n "$PCRE_CONFIG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PCRE_CONFIG" >&5 +printf "%s\n" "$PCRE_CONFIG" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$PCRE_CONFIG" && break +done +if test -z "$PCRE_CONFIG"; then + if test "$build" = "$target"; then + ac_ct_PCRE_CONFIG=$PCRE_CONFIG + for ac_prog in pcre2-config pcre-config +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_PCRE_CONFIG+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_PCRE_CONFIG"; then + ac_cv_prog_ac_ct_PCRE_CONFIG="$ac_ct_PCRE_CONFIG" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $with_pcre +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_PCRE_CONFIG="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_PCRE_CONFIG=$ac_cv_prog_ac_ct_PCRE_CONFIG +if test -n "$ac_ct_PCRE_CONFIG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_PCRE_CONFIG" >&5 +printf "%s\n" "$ac_ct_PCRE_CONFIG" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_PCRE_CONFIG" && break +done +test -n "$ac_ct_PCRE_CONFIG" || ac_ct_PCRE_CONFIG="`which $with_pcre 2>/dev/null`" + + PCRE_CONFIG=$ac_ct_PCRE_CONFIG + else + PCRE_CONFIG="`which $with_pcre 2>/dev/null`" + fi +fi + + +if test "x$PCRE_CONFIG" != "x"; then + if $PCRE_CONFIG --version >/dev/null 2>&1; then :; else + as_fn_error $? "Did not find working script at $PCRE_CONFIG" "$LINENO" 5 + fi + case `$PCRE_CONFIG --version` in + 1[0-9].*) + +printf "%s\n" "#define HAVE_PCRE2 1" >>confdefs.h + + ;; + [1-5].*) + as_fn_error $? "Need at least pcre version 6.0" "$LINENO" 5 + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Using external PCRE library from $PCRE_CONFIG" >&5 +printf "%s\n" "$as_me: Using external PCRE library from $PCRE_CONFIG" >&6;} + + if test "x$PCRE_INCLUDES" = "x"; then + test "x$silent" != "xyes" && echo " setting PCRE_INCLUDES to \"`$PCRE_CONFIG --cflags`\"" + PCRE_INCLUDES="`$PCRE_CONFIG --cflags`" + else + apr_addto_bugger="`$PCRE_CONFIG --cflags`" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $PCRE_INCLUDES; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to PCRE_INCLUDES" + PCRE_INCLUDES="$PCRE_INCLUDES $i" + fi + done + fi + + + if test "x$PCRE_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting PCRE_LIBS to \"`$PCRE_CONFIG --libs8 2>/dev/null || $PCRE_CONFIG --libs`\"" + PCRE_LIBS="`$PCRE_CONFIG --libs8 2>/dev/null || $PCRE_CONFIG --libs`" + else + apr_addto_bugger="`$PCRE_CONFIG --libs8 2>/dev/null || $PCRE_CONFIG --libs`" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $PCRE_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to PCRE_LIBS" + PCRE_LIBS="$PCRE_LIBS $i" + fi + done + fi + +else + as_fn_error $? "pcre(2)-config for libpcre not found. PCRE is required and available from http://pcre.org/" "$LINENO" 5 +fi + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST PCRE_LIBS" + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: " >&5 +printf "%s\n" "$as_me: " >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Configuring Apache httpd..." >&5 +printf "%s\n" "$as_me: Configuring Apache httpd..." >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: " >&5 +printf "%s\n" "$as_me: " >&6;} + + + + if test "x$INCLUDES" = "x"; then + test "x$silent" != "xyes" && echo " setting INCLUDES to \"-I.\"" + INCLUDES="-I." + else + apr_addto_bugger="-I." + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $INCLUDES; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + + +if test "$abs_builddir" != "$abs_srcdir"; then + + if test "x$INCLUDES" = "x"; then + test "x$silent" != "xyes" && echo " setting INCLUDES to \"-I\$(top_builddir)/include\"" + INCLUDES="-I\$(top_builddir)/include" + else + apr_addto_bugger="-I\$(top_builddir)/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $INCLUDES; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + +fi + + + if test "x$INCLUDES" = "x"; then + test "x$silent" != "xyes" && echo " setting INCLUDES to \"-I\$(top_srcdir)/os/\$(OS_DIR) -I\$(top_srcdir)/include\"" + INCLUDES="-I\$(top_srcdir)/os/\$(OS_DIR) -I\$(top_srcdir)/include" + else + apr_addto_bugger="-I\$(top_srcdir)/os/\$(OS_DIR) -I\$(top_srcdir)/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $INCLUDES; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + + +# apr/apr-util --includes may pick up system paths for dependent +# libraries, so ensure these are later in INCLUDES than local source +# directories. + + if test "x$INCLUDES" = "x"; then + test "x$silent" != "xyes" && echo " setting INCLUDES to \"$APR_INCLUDES\"" + INCLUDES="$APR_INCLUDES" + else + apr_addto_bugger="$APR_INCLUDES" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $INCLUDES; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + + + if test "x$INCLUDES" = "x"; then + test "x$silent" != "xyes" && echo " setting INCLUDES to \"$APU_INCLUDES\"" + INCLUDES="$APU_INCLUDES" + else + apr_addto_bugger="$APU_INCLUDES" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $INCLUDES; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + + + + if test "x$INCLUDES" = "x"; then + test "x$silent" != "xyes" && echo " setting INCLUDES to \"$PCRE_INCLUDES\"" + INCLUDES="$PCRE_INCLUDES" + else + apr_addto_bugger="$PCRE_INCLUDES" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $INCLUDES; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + + +save_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS $PCRE_INCLUDES" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep -e" >&5 +printf %s "checking for egrep -e... " >&6; } +if test ${ac_cv_path_EGREP_TRADITIONAL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -z "$EGREP_TRADITIONAL"; then + ac_path_EGREP_TRADITIONAL_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue +# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. + # Check for GNU $ac_path_EGREP_TRADITIONAL +case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" + "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" + ac_path_EGREP_TRADITIONAL_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_TRADITIONAL_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then + : + fi +else + ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL +fi + + if test "$ac_cv_path_EGREP_TRADITIONAL" +then : + ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E" +else case e in #( + e) if test -z "$EGREP_TRADITIONAL"; then + ac_path_EGREP_TRADITIONAL_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue +# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. + # Check for GNU $ac_path_EGREP_TRADITIONAL +case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" + "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" + ac_path_EGREP_TRADITIONAL_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_TRADITIONAL_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL +fi + ;; +esac +fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5 +printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; } + EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef HAVE_PCRE2 +yes +#else +#include +#ifdef PCRE_DUPNAMES +yes +#endif +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP_TRADITIONAL "yes" >/dev/null 2>&1 +then : + pcre_have_dupnames=yes +else case e in #( + e) pcre_have_dupnames=no ;; +esac +fi +rm -rf conftest* + +if test "$pcre_have_dupnames" != "yes"; then + as_fn_error $? "pcre version does not support PCRE_DUPNAMES" "$LINENO" 5 +fi +CPPFLAGS="$save_CPPFLAGS" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: " >&5 +printf "%s\n" "$as_me: " >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Applying OS-specific hints for httpd..." >&5 +printf "%s\n" "$as_me: Applying OS-specific hints for httpd..." >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: " >&5 +printf "%s\n" "$as_me: " >&6;} + +case $host in + *os2*) + # Use a custom made libtool replacement + echo "using aplibtool" + LIBTOOL="$abs_srcdir/srclib/apr/build/aplibtool" + SH_LIBTOOL="$LIBTOOL --shared --export-all" + SH_LIBS="\$(ALL_LIBS)" + CORE_IMPLIB_FILE="ApacheCoreOS2.la" + CORE_IMPLIB="$abs_srcdir/server/$CORE_IMPLIB_FILE" + MK_IMPLIB="emximp" + other_targets="$other_targets os2core" + INSTALL_PROG_FLAGS="-e .exe" + SHLTCFLAGS="" + LTCFLAGS="" + ;; + *) + if test "x$LTFLAGS" = "x"; then + LTFLAGS='--silent' + fi + my_libtool=`$apr_config --apr-libtool` + LIBTOOL="$my_libtool \$(LTFLAGS)" + libtoolversion=`$my_libtool --version` + case $libtoolversion in + *1.[45]* | *[2-9].[0-9]*) + SH_LIBTOOL='$(LIBTOOL)' + SHLTCFLAGS="-prefer-pic" + LTCFLAGS="-prefer-non-pic -static" + ;; + *) + SH_LIBTOOL='$(SHELL) $(top_builddir)/shlibtool $(LTFLAGS)' + SHLTCFLAGS="" + LTCFLAGS="" + ;; + esac + ;; +esac + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST SHLTCFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST LTCFLAGS" + + + +case $host in + *-apple-aux3*) + + test "x$silent" != "xyes" && echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + ;; + *os2-emx*) + + test "x$silent" != "xyes" && echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + ;; + *-linux-*) + case `uname -r` in + # Unserialized accept() was not recommended until Linux 2.2. + [01].* | 2.[01]* ) + ;; + * ) + + test "x$silent" != "xyes" && echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + ;; + esac + ;; + *486-*-bsdi* | *-netbsd* | *-freebsd* | *-apple-darwin* | *-dec-osf* | *-qnx) + + test "x$silent" != "xyes" && echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + ;; + *-solaris2*) + ap_platform_runtime_link_flag="-R" + case `uname -r` in + 5.[567]*) + ;; + * ) + + test "x$silent" != "xyes" && echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + ;; + esac + ;; + *cygwin*) + + test "x$silent" != "xyes" && echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + ;; + *mingw32*) + + if test "x$INTERNAL_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting INTERNAL_CPPFLAGS to \"-DAP_DECLARE_EXPORT\"" + INTERNAL_CPPFLAGS="-DAP_DECLARE_EXPORT" + else + apr_addto_bugger="-DAP_DECLARE_EXPORT" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $INTERNAL_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to INTERNAL_CPPFLAGS" + INTERNAL_CPPFLAGS="$INTERNAL_CPPFLAGS $i" + fi + done + fi + + + if test -z "$ac_cv_func_times"; then + test "x$silent" != "xyes" && echo " setting ac_cv_func_times to \"no\"" + ac_cv_func_times="no" + fi + + + if test -z "$ac_cv_func_getpwnam"; then + test "x$silent" != "xyes" && echo " setting ac_cv_func_getpwnam to \"no\"" + ac_cv_func_getpwnam="no" + fi + + + if test -z "$ac_cv_func_getgrnam"; then + test "x$silent" != "xyes" && echo " setting ac_cv_func_getgrnam to \"no\"" + ac_cv_func_getgrnam="no" + fi + + ;; + *aix*) + aixver=`echo $host | sed 's/^[^0-9]*//' | sed 's/\.//g'` + if test $aixver -ge 4320; then + + test "x$silent" != "xyes" && echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + fi + ;; + *os390*) + + test "x$silent" != "xyes" && echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + ;; +esac + + + test "x$silent" != "xyes" && echo " forcing AP_NONBLOCK_WHEN_MULTI_LISTEN to \"1\"" + AP_NONBLOCK_WHEN_MULTI_LISTEN="1" + + + + +# Extract the first word of "rm", so it can be a program name with args. +set dummy rm; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_RM+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) case $RM in + [\\/]* | ?:[\\/]*) + ac_cv_path_RM="$RM" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_RM="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac ;; +esac +fi +RM=$ac_cv_path_RM +if test -n "$RM"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 +printf "%s\n" "$RM" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_PKGCONFIG+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) case $PKGCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_PKGCONFIG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac ;; +esac +fi +PKGCONFIG=$ac_cv_path_PKGCONFIG +if test -n "$PKGCONFIG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5 +printf "%s\n" "$PKGCONFIG" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "rsync", so it can be a program name with args. +set dummy rsync; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_RSYNC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) case $RSYNC in + [\\/]* | ?:[\\/]*) + ac_cv_path_RSYNC="$RSYNC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_RSYNC="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac ;; +esac +fi +RSYNC=$ac_cv_path_RSYNC +if test -n "$RSYNC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RSYNC" >&5 +printf "%s\n" "$RSYNC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "svn", so it can be a program name with args. +set dummy svn; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_SVN+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) case $SVN in + [\\/]* | ?:[\\/]*) + ac_cv_path_SVN="$SVN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_SVN="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac ;; +esac +fi +SVN=$ac_cv_path_SVN +if test -n "$SVN"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SVN" >&5 +printf "%s\n" "$SVN" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB="true" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +for ac_prog in lynx links elinks +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LYNX_PATH+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$LYNX_PATH"; then + ac_cv_prog_LYNX_PATH="$LYNX_PATH" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_LYNX_PATH="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +LYNX_PATH=$ac_cv_prog_LYNX_PATH +if test -n "$LYNX_PATH"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LYNX_PATH" >&5 +printf "%s\n" "$LYNX_PATH" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$LYNX_PATH" && break +done +test -n "$LYNX_PATH" || LYNX_PATH="lynx" + + +# Hard-coded install programs +MKINSTALLDIRS="\$(abs_srcdir)/build/mkdir.sh" +INSTALL="\$(LIBTOOL) --mode=install \$(abs_srcdir)/build/install.sh -c" + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST MKINSTALLDIRS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST INSTALL" + + + + +ac_header= ac_cache= +for ac_item in $ac_header_c_list +do + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi +done + + + + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h + +fi + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if test ${ac_cv_safe_to_define___extensions__+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_safe_to_define___extensions__=yes +else case e in #( + e) ac_cv_safe_to_define___extensions__=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 +printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; } +if test ${ac_cv_should_define__xopen_source+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_cv_should_define__xopen_source=no + if test $ac_cv_header_wchar_h = yes +then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + mbstate_t x; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define _XOPEN_SOURCE 500 + #include + mbstate_t x; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_should_define__xopen_source=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 +printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; } + + printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h + + printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _OPENBSD_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h + + printf "%s\n" "#define _TANDEM_SOURCE 1" >>confdefs.h + + if test $ac_cv_header_minix_config_h = yes +then : + MINIX=yes + printf "%s\n" "#define _MINIX 1" >>confdefs.h + + printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h + +else case e in #( + e) MINIX= ;; +esac +fi + if test $ac_cv_safe_to_define___extensions__ = yes +then : + printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h + +fi + if test $ac_cv_should_define__xopen_source = yes +then : + printf "%s\n" "#define _XOPEN_SOURCE 500" >>confdefs.h + +fi + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5 +printf %s "checking for library containing strerror... " >&6; } +if test ${ac_cv_search_strerror+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char strerror (void); +int +main (void) +{ +return strerror (); + ; + return 0; +} +_ACEOF +for ac_lib in '' cposix +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_strerror=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_strerror+y} +then : + break +fi +done +if test ${ac_cv_search_strerror+y} +then : + +else case e in #( + e) ac_cv_search_strerror=no ;; +esac +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5 +printf "%s\n" "$ac_cv_search_strerror" >&6; } +ac_res=$ac_cv_search_strerror +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +# Ensure that satisfactory versions of apr and apr-util are +# found if external copies are configured. +if test "${apr_found}" = "yes"; then + # Require at least APR 1.3.x otherwise fail + + + + + + +ap_ckver_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS `$apr_config --includes`" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for APR version 1.3.0 or later" >&5 +printf %s "checking for APR version 1.3.0 or later... " >&6; } +if test ${ap_cv_aprver13+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if APR_MAJOR_VERSION > 1 || (APR_MAJOR_VERSION == 1 && APR_MINOR_VERSION >= 3) +good +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP_TRADITIONAL "good" >/dev/null 2>&1 +then : + ap_cv_aprver13=yes +else case e in #( + e) ap_cv_aprver13=no ;; +esac +fi +rm -rf conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_cv_aprver13" >&5 +printf "%s\n" "$ap_cv_aprver13" >&6; } + +if test "$ap_cv_aprver13" = "yes"; then + : +else + as_fn_error $? "APR version 1.3.0 or later is required" "$LINENO" 5 +fi + +CPPFLAGS="$ap_ckver_CPPFLAGS" + + + + + + +fi + +if test "${apu_found}" = "yes"; then + # Require at least APR-util 1.3.x otherwise fail + if test "${apr_found}" = "yes"; then + # we need to add the APR includes to CPPFLAGS + apu_ckver_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS `$apr_config --includes`" + + + + + + +ap_ckver_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS `$apu_config --includes`" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for APR-util version 1.3.0 or later" >&5 +printf %s "checking for APR-util version 1.3.0 or later... " >&6; } +if test ${ap_cv_apuver13+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if APU_MAJOR_VERSION > 1 || (APU_MAJOR_VERSION == 1 && APU_MINOR_VERSION >= 3) +good +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP_TRADITIONAL "good" >/dev/null 2>&1 +then : + ap_cv_apuver13=yes +else case e in #( + e) ap_cv_apuver13=no ;; +esac +fi +rm -rf conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_cv_apuver13" >&5 +printf "%s\n" "$ap_cv_apuver13" >&6; } + +if test "$ap_cv_apuver13" = "yes"; then + : +else + as_fn_error $? "APR-util version 1.3.0 or later is required" "$LINENO" 5 +fi + +CPPFLAGS="$ap_ckver_CPPFLAGS" + + + + + + + CPPFLAGS="$apu_ckver_CPPFLAGS" + else + + + + + + +ap_ckver_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS `$apu_config --includes`" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for APR-util version 1.3.0 or later" >&5 +printf %s "checking for APR-util version 1.3.0 or later... " >&6; } +if test ${ap_cv_apuver13+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if APU_MAJOR_VERSION > 1 || (APU_MAJOR_VERSION == 1 && APU_MINOR_VERSION >= 3) +good +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP_TRADITIONAL "good" >/dev/null 2>&1 +then : + ap_cv_apuver13=yes +else case e in #( + e) ap_cv_apuver13=no ;; +esac +fi +rm -rf conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_cv_apuver13" >&5 +printf "%s\n" "$ap_cv_apuver13" >&6; } + +if test "$ap_cv_apuver13" = "yes"; then + : +else + as_fn_error $? "APR-util version 1.3.0 or later is required" "$LINENO" 5 +fi + +CPPFLAGS="$ap_ckver_CPPFLAGS" + + + + + + + fi +fi + + +if test "$GCC" = "yes"; then + MKDEP='$(CC) -MM' +else + rm -f conftest.c + cat > conftest.c < + int main(int argc, const char *argv) { return 0; } +EOF + MKDEP="true" + for i in "$CC -MM" "$CC -M" "$CPP -MM" "$CPP -M" "cpp -M"; do + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $i can create proper make dependencies" >&5 +printf %s "checking if $i can create proper make dependencies... " >&6; } + if $i conftest.c 2>/dev/null | grep 'conftest.o: conftest.c' >/dev/null; then + MKDEP=$i + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + break; + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + done + rm -f conftest.c +fi + + + + + + + + +# Autoupdate added the next two lines to ensure that your configure +# script's behavior did not change. They are probably safe to remove. + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + EGREP_TRADITIONAL=$EGREP + ac_cv_path_EGREP_TRADITIONAL=$EGREP + + +ac_fn_c_check_header_compile "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = xyes +then : + printf "%s\n" "#define HAVE_STRING_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" +if test "x$ac_cv_header_limits_h" = xyes +then : + printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +if test "x$ac_cv_header_unistd_h" = xyes +then : + printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_socket_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SOCKET_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "pwd.h" "ac_cv_header_pwd_h" "$ac_includes_default" +if test "x$ac_cv_header_pwd_h" = xyes +then : + printf "%s\n" "#define HAVE_PWD_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "grp.h" "ac_cv_header_grp_h" "$ac_includes_default" +if test "x$ac_cv_header_grp_h" = xyes +then : + printf "%s\n" "#define HAVE_GRP_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" +if test "x$ac_cv_header_strings_h" = xyes +then : + printf "%s\n" "#define HAVE_STRINGS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/prctl.h" "ac_cv_header_sys_prctl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_prctl_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PRCTL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/processor.h" "ac_cv_header_sys_processor_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_processor_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PROCESSOR_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/sem.h" "ac_cv_header_sys_sem_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_sem_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SEM_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/sdt.h" "ac_cv_header_sys_sdt_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_sdt_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SDT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/loadavg.h" "ac_cv_header_sys_loadavg_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_loadavg_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_LOADAVG_H 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 +printf %s "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } +if test ${ac_cv_header_sys_wait_h+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#ifndef WEXITSTATUS +# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) +#endif +#ifndef WIFEXITED +# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif + +int +main (void) +{ + int s; + wait (&s); + s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_header_sys_wait_h=yes +else case e in #( + e) ac_cv_header_sys_wait_h=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 +printf "%s\n" "$ac_cv_header_sys_wait_h" >&6; } +if test $ac_cv_header_sys_wait_h = yes; then + +printf "%s\n" "#define HAVE_SYS_WAIT_H 1" >>confdefs.h + +fi + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +printf %s "checking for an ANSI C-conforming const... " >&6; } +if test ${ac_cv_c_const+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* IBM 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"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 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; + } + { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_const=yes +else case e in #( + e) ac_cv_c_const=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +printf "%s\n" "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +printf "%s\n" "#define const /**/" >>confdefs.h + +fi + + +saved_LIBS="$LIBS" +LIBS="" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing sqrt" >&5 +printf %s "checking for library containing sqrt... " >&6; } +if test ${ac_cv_search_sqrt+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char sqrt (void); +int +main (void) +{ +return sqrt (); + ; + return 0; +} +_ACEOF +for ac_lib in '' m +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_sqrt=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_sqrt+y} +then : + break +fi +done +if test ${ac_cv_search_sqrt+y} +then : + +else case e in #( + e) ac_cv_search_sqrt=no ;; +esac +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sqrt" >&5 +printf "%s\n" "$ac_cv_search_sqrt" >&6; } +ac_res=$ac_cv_search_sqrt +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +MATH_LIBS="$LIBS" + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST MATH_LIBS" + + +LIBS="$saved_LIBS" + +saved_LIBS="$LIBS" +LIBS="" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing crypt" >&5 +printf %s "checking for library containing crypt... " >&6; } +if test ${ac_cv_search_crypt+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char crypt (void); +int +main (void) +{ +return crypt (); + ; + return 0; +} +_ACEOF +for ac_lib in '' crypt +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_crypt=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_crypt+y} +then : + break +fi +done +if test ${ac_cv_search_crypt+y} +then : + +else case e in #( + e) ac_cv_search_crypt=no ;; +esac +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_crypt" >&5 +printf "%s\n" "$ac_cv_search_crypt" >&6; } +ac_res=$ac_cv_search_crypt +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +CRYPT_LIBS="$LIBS" + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST CRYPT_LIBS" + + + +if test "$ac_cv_search_crypt" != "no"; then + # Test crypt() with the SHA-512 test vector from https://akkadia.org/drepper/SHA-crypt.txt + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether crypt() supports SHA-2" >&5 +printf %s "checking whether crypt() supports SHA-2... " >&6; } +if test ${ap_cv_crypt_sha2+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + if test "$cross_compiling" = yes +then : + ap_cv_crypt_sha2=no +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +#define PASSWD_0 "Hello world!" +#define SALT_0 "\$6\$saltstring" +#define EXPECT_0 "\$6\$saltstring\$svn8UoSVapNtMuq1ukKS4tPQd8iKwSMHWjl/O817G3uBnIFNjnQJu" \ + "esI68u4OTLiBFdcbYEdFCoEOfaS35inz1" + +int +main (void) +{ +char *result = crypt(PASSWD_0, SALT_0); + if (!result) return 1; + if (strcmp(result, EXPECT_0)) return 2; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ap_cv_crypt_sha2=yes +else case e in #( + e) ap_cv_crypt_sha2=no ;; +esac +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_cv_crypt_sha2" >&5 +printf "%s\n" "$ap_cv_crypt_sha2" >&6; } + if test "$ap_cv_crypt_sha2" = yes; then + +printf "%s\n" "#define HAVE_CRYPT_SHA2 1" >>confdefs.h + + fi +fi + +LIBS="$saved_LIBS" + + +ac_fn_c_check_func "$LINENO" "getpwnam" "ac_cv_func_getpwnam" +if test "x$ac_cv_func_getpwnam" = xyes +then : + printf "%s\n" "#define HAVE_GETPWNAM 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getgrnam" "ac_cv_func_getgrnam" +if test "x$ac_cv_func_getgrnam" = xyes +then : + printf "%s\n" "#define HAVE_GETGRNAM 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "initgroups" "ac_cv_func_initgroups" +if test "x$ac_cv_func_initgroups" = xyes +then : + printf "%s\n" "#define HAVE_INITGROUPS 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "bindprocessor" "ac_cv_func_bindprocessor" +if test "x$ac_cv_func_bindprocessor" = xyes +then : + printf "%s\n" "#define HAVE_BINDPROCESSOR 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "prctl" "ac_cv_func_prctl" +if test "x$ac_cv_func_prctl" = xyes +then : + printf "%s\n" "#define HAVE_PRCTL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "timegm" "ac_cv_func_timegm" +if test "x$ac_cv_func_timegm" = xyes +then : + printf "%s\n" "#define HAVE_TIMEGM 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getpgid" "ac_cv_func_getpgid" +if test "x$ac_cv_func_getpgid" = xyes +then : + printf "%s\n" "#define HAVE_GETPGID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fopen64" "ac_cv_func_fopen64" +if test "x$ac_cv_func_fopen64" = xyes +then : + printf "%s\n" "#define HAVE_FOPEN64 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getloadavg" "ac_cv_func_getloadavg" +if test "x$ac_cv_func_getloadavg" = xyes +then : + printf "%s\n" "#define HAVE_GETLOADAVG 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "gettid" "ac_cv_func_gettid" +if test "x$ac_cv_func_gettid" = xyes +then : + printf "%s\n" "#define HAVE_GETTID 1" >>confdefs.h + +fi + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for void pointer length" >&5 +printf %s "checking for void pointer length... " >&6; } +if test ${ap_cv_void_ptr_lt_long+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test "$cross_compiling" = yes +then : + ap_cv_void_ptr_lt_long=yes +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int main(void) +{ + return sizeof(void *) < sizeof(long); +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ap_cv_void_ptr_lt_long=no +else case e in #( + e) ap_cv_void_ptr_lt_long=yes ;; +esac +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_cv_void_ptr_lt_long" >&5 +printf "%s\n" "$ap_cv_void_ptr_lt_long" >&6; } + +if test "$ap_cv_void_ptr_lt_long" = "yes"; then + as_fn_error $? "Size of \"void *\" is less than size of \"long\"" "$LINENO" 5 +fi + + +if test $ac_cv_func_gettid = no; then + # On Linux before glibc 2.30, gettid() is only usable via syscall() + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gettid() via syscall" >&5 +printf %s "checking for gettid() via syscall... " >&6; } +if test ${ap_cv_gettid+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test "$cross_compiling" = yes +then : + ap_cv_gettid=no +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _GNU_SOURCE +#include +#include +#include +int main(int argc, char **argv) { +pid_t t = syscall(SYS_gettid); return t == -1 ? 1 : 0; } +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ap_cv_gettid=yes +else case e in #( + e) ap_cv_gettid=no ;; +esac +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_cv_gettid" >&5 +printf "%s\n" "$ap_cv_gettid" >&6; } + if test "$ap_cv_gettid" = "yes"; then + +printf "%s\n" "#define HAVE_SYS_GETTID 1" >>confdefs.h + + fi +fi + +case ${host}X${ac_cv_func_gettid}X${ap_cv_gettid} in +*linux-*XyesX* | *linux-*XnoXyes) + +printf "%s\n" "#define DEFAULT_LOG_TID \"g\"" >>confdefs.h + + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tm_gmtoff in struct tm" >&5 +printf %s "checking for tm_gmtoff in struct tm... " >&6; } +if test ${ac_cv_struct_tm_gmtoff+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main (void) +{ +struct tm tm; tm.tm_gmtoff; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_struct_tm_gmtoff=yes +else case e in #( + e) ac_cv_struct_tm_gmtoff=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm_gmtoff" >&5 +printf "%s\n" "$ac_cv_struct_tm_gmtoff" >&6; } +if test "$ac_cv_struct_tm_gmtoff" = "yes"; then + +printf "%s\n" "#define HAVE_GMTOFF 1" >>confdefs.h + +fi + + +case $host in +*-linux-*) + if test -n "$PKGCONFIG" && $PKGCONFIG --exists libsystemd; then + SYSTEMD_LIBS=`$PKGCONFIG --libs libsystemd` + elif test -n "$PKGCONFIG" && $PKGCONFIG --exists libsystemd-daemon; then + SYSTEMD_LIBS=`$PKGCONFIG --libs libsystemd-daemon` + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sd_notify in -lsystemd-daemon" >&5 +printf %s "checking for sd_notify in -lsystemd-daemon... " >&6; } +if test ${ac_cv_lib_systemd_daemon_sd_notify+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-lsystemd-daemon $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char sd_notify (void); +int +main (void) +{ +return sd_notify (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_systemd_daemon_sd_notify=yes +else case e in #( + e) ac_cv_lib_systemd_daemon_sd_notify=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_systemd_daemon_sd_notify" >&5 +printf "%s\n" "$ac_cv_lib_systemd_daemon_sd_notify" >&6; } +if test "x$ac_cv_lib_systemd_daemon_sd_notify" = xyes +then : + SYSTEMD_LIBS="-lsystemd-daemon" +fi + + fi + if test -n "$SYSTEMD_LIBS"; then + ac_fn_c_check_header_compile "$LINENO" "systemd/sd-daemon.h" "ac_cv_header_systemd_sd_daemon_h" "$ac_includes_default" +if test "x$ac_cv_header_systemd_sd_daemon_h" = xyes +then : + printf "%s\n" "#define HAVE_SYSTEMD_SD_DAEMON_H 1" >>confdefs.h + +fi + + if test "${ac_cv_header_systemd_sd_daemon_h}" = "no" || test -z "${SYSTEMD_LIBS}"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Your system does not support systemd." >&5 +printf "%s\n" "$as_me: WARNING: Your system does not support systemd." >&2;} + else + +printf "%s\n" "#define HAVE_SYSTEMD 1" >>confdefs.h + + fi + fi + ;; +esac + + + +case $host in + *aix*) + # for 32-bit builds, increase MAXDATA to allow lots of threads + if test x$OBJECT_MODE != x64; then + OS_SPECIFIC_VARS="LDR_CNTRL=\"MAXDATA=0x80000000\" ; export LDR_CNTRL ;" + fi + OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS AIXTHREAD_SCOPE=S ; export AIXTHREAD_SCOPE" + OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; AIXTHREAD_MUTEX_DEBUG=OFF ; export AIXTHREAD_MUTEX_DEBUG" + OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; AIXTHREAD_RWLOCK_DEBUG=OFF ; export AIXTHREAD_RWLOCK_DEBUG" + OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; AIXTHREAD_COND_DEBUG=OFF ; export AIXTHREAD_COND_DEBUG" + OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; SPINLOOPTIME=1000 ; export SPINLOOPTIME" + OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; YIELDLOOPTIME=8 ; export YIELDLOOPTIME" + OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; MALLOCMULTIHEAP=considersize,heaps:8 ; export MALLOCMULTIHEAP" + ;; + *os390*) + OS_SPECIFIC_VARS="export _CEE_RUNOPTS=\"STACK(,,ANY)\" ; export _EDC_ADD_ERRNO2=1" + ;; + *) + OS_SPECIFIC_VARS="" +esac + + +# Check whether --with-port was given. +if test ${with_port+y} +then : + withval=$with_port; if test "$withval" = "yes"; then as_fn_error $? "'option --with-port requires a value (the TCP port number)'" "$LINENO" 5; else PORT="$withval"; fi +else case e in #( + e) PORT=80 ;; +esac +fi + + + +# Check whether --with-sslport was given. +if test ${with_sslport+y} +then : + withval=$with_sslport; if test "$withval" = "yes"; then as_fn_error $? "'option --with-sslport requires a value (the SSL TCP port number)'" "$LINENO" 5; else SSLPORT="$withval"; fi +else case e in #( + e) SSLPORT=443 ;; +esac +fi + + +DTRACE=true +# Check whether --enable-dtrace was given. +if test ${enable_dtrace+y} +then : + enableval=$enable_dtrace; + enable_dtrace=$enableval + if test "$enableval" = "yes"; then + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"-DAPR_DTRACE_PROVIDER\"" + CPPFLAGS="-DAPR_DTRACE_PROVIDER" + else + apr_addto_bugger="-DAPR_DTRACE_PROVIDER" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + as_fn_error $? "'DTrace Support in the build system is not complete. Patches Welcome!'" "$LINENO" 5 + fi + +else case e in #( + e) + enable_dtrace=no + ;; +esac +fi + + +enable_dtrace=no + +case $host in + *-solaris2*) + if test $enable_dtrace = "yes" -a "$ac_cv_header_sys_sdt_h" = "yes"; then + +printf "%s\n" "#define AP_ENABLE_DTRACE 1" >>confdefs.h + + DTRACE="/usr/sbin/dtrace $DTRACEFLAGS" + test -f include/apache_probes.h || $DTRACE -h -s apache_probes.d -o include/apache_probes.h + fi + ;; +esac + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST DTRACE" + + + +# Check whether --enable-hook-probes was given. +if test ${enable_hook_probes+y} +then : + enableval=$enable_hook_probes; + if test "$enableval" = "yes"; then + +printf "%s\n" "#define AP_HOOK_PROBES_ENABLED 1" >>confdefs.h + + + if test "x$INTERNAL_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting INTERNAL_CPPFLAGS to \"-DAP_HOOK_PROBES_ENABLED\"" + INTERNAL_CPPFLAGS="-DAP_HOOK_PROBES_ENABLED" + else + apr_addto_bugger="-DAP_HOOK_PROBES_ENABLED" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $INTERNAL_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to INTERNAL_CPPFLAGS" + INTERNAL_CPPFLAGS="$INTERNAL_CPPFLAGS $i" + fi + done + fi + + fi + +fi + +# Check whether --enable-exception-hook was given. +if test ${enable_exception_hook+y} +then : + enableval=$enable_exception_hook; + if test "$enableval" = "yes"; then + +printf "%s\n" "#define AP_ENABLE_EXCEPTION_HOOK 1" >>confdefs.h + + fi + +fi + +# Check whether --enable-load-all-modules was given. +if test ${enable_load_all_modules+y} +then : + enableval=$enable_load_all_modules; + LOAD_ALL_MODULES=$enableval + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Setting \"LOAD_ALL_MODULES\" to $LOAD_ALL_MODULES" >&5 +printf "%s\n" "$as_me: Setting \"LOAD_ALL_MODULES\" to $LOAD_ALL_MODULES" >&6;} + +else case e in #( + e) + LOAD_ALL_MODULES="no" + ;; +esac +fi + + +# Check whether --enable-maintainer-mode was given. +if test ${enable_maintainer_mode+y} +then : + enableval=$enable_maintainer_mode; + if test "$enableval" = "yes"; then + + if test "x$NOTEST_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CPPFLAGS to \"-DAP_DEBUG\"" + NOTEST_CPPFLAGS="-DAP_DEBUG" + else + apr_addto_bugger="-DAP_DEBUG" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CPPFLAGS" + NOTEST_CPPFLAGS="$NOTEST_CPPFLAGS $i" + fi + done + fi + + if test "$GCC" = "yes"; then + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -std=c89" >&5 +printf %s "checking whether gcc accepts -std=c89... " >&6; } +if test ${ac_cv_gcc__std_c89+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -std=c89 -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__std_c89=yes +else case e in #( + e) ac_cv_gcc__std_c89=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__std_c89" >&5 +printf "%s\n" "$ac_cv_gcc__std_c89" >&6; } + if test "$ac_cv_gcc__std_c89" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-std=c89\"" + NOTEST_CFLAGS="-std=c89" + else + apr_addto_bugger="-std=c89" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Werror" >&5 +printf %s "checking whether gcc accepts -Werror... " >&6; } +if test ${ac_cv_gcc__Werror+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Werror=yes +else case e in #( + e) ac_cv_gcc__Werror=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Werror" >&5 +printf "%s\n" "$ac_cv_gcc__Werror" >&6; } + if test "$ac_cv_gcc__Werror" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Werror\"" + NOTEST_CFLAGS="-Werror" + else + apr_addto_bugger="-Werror" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wall" >&5 +printf %s "checking whether gcc accepts -Wall... " >&6; } +if test ${ac_cv_gcc__Wall+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wall -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wall=yes +else case e in #( + e) ac_cv_gcc__Wall=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wall" >&5 +printf "%s\n" "$ac_cv_gcc__Wall" >&6; } + if test "$ac_cv_gcc__Wall" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wall\"" + NOTEST_CFLAGS="-Wall" + else + apr_addto_bugger="-Wall" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wstrict-prototypes" >&5 +printf %s "checking whether gcc accepts -Wstrict-prototypes... " >&6; } +if test ${ac_cv_gcc__Wstrict_prototypes+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wstrict-prototypes -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wstrict_prototypes=yes +else case e in #( + e) ac_cv_gcc__Wstrict_prototypes=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wstrict_prototypes" >&5 +printf "%s\n" "$ac_cv_gcc__Wstrict_prototypes" >&6; } + if test "$ac_cv_gcc__Wstrict_prototypes" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wstrict-prototypes\"" + NOTEST_CFLAGS="-Wstrict-prototypes" + else + apr_addto_bugger="-Wstrict-prototypes" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wmissing-prototypes" >&5 +printf %s "checking whether gcc accepts -Wmissing-prototypes... " >&6; } +if test ${ac_cv_gcc__Wmissing_prototypes+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wmissing-prototypes -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wmissing_prototypes=yes +else case e in #( + e) ac_cv_gcc__Wmissing_prototypes=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wmissing_prototypes" >&5 +printf "%s\n" "$ac_cv_gcc__Wmissing_prototypes" >&6; } + if test "$ac_cv_gcc__Wmissing_prototypes" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wmissing-prototypes\"" + NOTEST_CFLAGS="-Wmissing-prototypes" + else + apr_addto_bugger="-Wmissing-prototypes" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wmissing-declarations" >&5 +printf %s "checking whether gcc accepts -Wmissing-declarations... " >&6; } +if test ${ac_cv_gcc__Wmissing_declarations+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wmissing-declarations -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wmissing_declarations=yes +else case e in #( + e) ac_cv_gcc__Wmissing_declarations=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wmissing_declarations" >&5 +printf "%s\n" "$ac_cv_gcc__Wmissing_declarations" >&6; } + if test "$ac_cv_gcc__Wmissing_declarations" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wmissing-declarations\"" + NOTEST_CFLAGS="-Wmissing-declarations" + else + apr_addto_bugger="-Wmissing-declarations" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wdeclaration-after-statement" >&5 +printf %s "checking whether gcc accepts -Wdeclaration-after-statement... " >&6; } +if test ${ac_cv_gcc__Wdeclaration_after_statement+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wdeclaration-after-statement -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wdeclaration_after_statement=yes +else case e in #( + e) ac_cv_gcc__Wdeclaration_after_statement=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wdeclaration_after_statement" >&5 +printf "%s\n" "$ac_cv_gcc__Wdeclaration_after_statement" >&6; } + if test "$ac_cv_gcc__Wdeclaration_after_statement" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wdeclaration-after-statement\"" + NOTEST_CFLAGS="-Wdeclaration-after-statement" + else + apr_addto_bugger="-Wdeclaration-after-statement" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wpointer-arith" >&5 +printf %s "checking whether gcc accepts -Wpointer-arith... " >&6; } +if test ${ac_cv_gcc__Wpointer_arith+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wpointer-arith -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wpointer_arith=yes +else case e in #( + e) ac_cv_gcc__Wpointer_arith=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wpointer_arith" >&5 +printf "%s\n" "$ac_cv_gcc__Wpointer_arith" >&6; } + if test "$ac_cv_gcc__Wpointer_arith" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wpointer-arith\"" + NOTEST_CFLAGS="-Wpointer-arith" + else + apr_addto_bugger="-Wpointer-arith" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wformat" >&5 +printf %s "checking whether gcc accepts -Wformat... " >&6; } +if test ${ac_cv_gcc__Wformat+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wformat -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wformat=yes +else case e in #( + e) ac_cv_gcc__Wformat=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wformat" >&5 +printf "%s\n" "$ac_cv_gcc__Wformat" >&6; } + if test "$ac_cv_gcc__Wformat" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wformat\"" + NOTEST_CFLAGS="-Wformat" + else + apr_addto_bugger="-Wformat" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wformat-security" >&5 +printf %s "checking whether gcc accepts -Wformat-security... " >&6; } +if test ${ac_cv_gcc__Wformat_security+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wformat-security -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wformat_security=yes +else case e in #( + e) ac_cv_gcc__Wformat_security=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wformat_security" >&5 +printf "%s\n" "$ac_cv_gcc__Wformat_security" >&6; } + if test "$ac_cv_gcc__Wformat_security" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wformat-security\"" + NOTEST_CFLAGS="-Wformat-security" + else + apr_addto_bugger="-Wformat-security" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wunused" >&5 +printf %s "checking whether gcc accepts -Wunused... " >&6; } +if test ${ac_cv_gcc__Wunused+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wunused -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wunused=yes +else case e in #( + e) ac_cv_gcc__Wunused=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wunused" >&5 +printf "%s\n" "$ac_cv_gcc__Wunused" >&6; } + if test "$ac_cv_gcc__Wunused" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wunused\"" + NOTEST_CFLAGS="-Wunused" + else + apr_addto_bugger="-Wunused" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + elif test "$AIX_XLC" = "yes"; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-qfullpath -qcheck=all -qinfo=pro\"" + NOTEST_CFLAGS="-qfullpath -qcheck=all -qinfo=pro" + else + apr_addto_bugger="-qfullpath -qcheck=all -qinfo=pro" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + if test "x$enable_load_all_modules" = "x"; then + LOAD_ALL_MODULES=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Maintainer mode setting \"LOAD_ALL_MODULES\" to $LOAD_ALL_MODULES" >&5 +printf "%s\n" "$as_me: Maintainer mode setting \"LOAD_ALL_MODULES\" to $LOAD_ALL_MODULES" >&6;} + fi + if test "x$enable_bucketeer" = "x"; then + enable_bucketeer=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Maintainer mode setting \"enable_bucketeer\" to yes" >&5 +printf "%s\n" "$as_me: Maintainer mode setting \"enable_bucketeer\" to yes" >&6;} + fi + fi + +fi + +# Check whether --enable-debugger-mode was given. +if test ${enable_debugger_mode+y} +then : + enableval=$enable_debugger_mode; + if test "$enableval" = "yes"; then + + if test "x$NOTEST_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CPPFLAGS to \"-DAP_DEBUG\"" + NOTEST_CPPFLAGS="-DAP_DEBUG" + else + apr_addto_bugger="-DAP_DEBUG" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CPPFLAGS" + NOTEST_CPPFLAGS="$NOTEST_CPPFLAGS $i" + fi + done + fi + + if test "$GCC" = "yes"; then + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -O0" >&5 +printf %s "checking whether gcc accepts -O0... " >&6; } +if test ${ac_cv_gcc__O0+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -O0 -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__O0=yes +else case e in #( + e) ac_cv_gcc__O0=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__O0" >&5 +printf "%s\n" "$ac_cv_gcc__O0" >&6; } + if test "$ac_cv_gcc__O0" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-O0\"" + NOTEST_CFLAGS="-O0" + else + apr_addto_bugger="-O0" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wall" >&5 +printf %s "checking whether gcc accepts -Wall... " >&6; } +if test ${ac_cv_gcc__Wall+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wall -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wall=yes +else case e in #( + e) ac_cv_gcc__Wall=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wall" >&5 +printf "%s\n" "$ac_cv_gcc__Wall" >&6; } + if test "$ac_cv_gcc__Wall" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wall\"" + NOTEST_CFLAGS="-Wall" + else + apr_addto_bugger="-Wall" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wstrict-prototypes" >&5 +printf %s "checking whether gcc accepts -Wstrict-prototypes... " >&6; } +if test ${ac_cv_gcc__Wstrict_prototypes+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wstrict-prototypes -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wstrict_prototypes=yes +else case e in #( + e) ac_cv_gcc__Wstrict_prototypes=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wstrict_prototypes" >&5 +printf "%s\n" "$ac_cv_gcc__Wstrict_prototypes" >&6; } + if test "$ac_cv_gcc__Wstrict_prototypes" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wstrict-prototypes\"" + NOTEST_CFLAGS="-Wstrict-prototypes" + else + apr_addto_bugger="-Wstrict-prototypes" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wmissing-prototypes" >&5 +printf %s "checking whether gcc accepts -Wmissing-prototypes... " >&6; } +if test ${ac_cv_gcc__Wmissing_prototypes+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wmissing-prototypes -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wmissing_prototypes=yes +else case e in #( + e) ac_cv_gcc__Wmissing_prototypes=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wmissing_prototypes" >&5 +printf "%s\n" "$ac_cv_gcc__Wmissing_prototypes" >&6; } + if test "$ac_cv_gcc__Wmissing_prototypes" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wmissing-prototypes\"" + NOTEST_CFLAGS="-Wmissing-prototypes" + else + apr_addto_bugger="-Wmissing-prototypes" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wmissing-declarations" >&5 +printf %s "checking whether gcc accepts -Wmissing-declarations... " >&6; } +if test ${ac_cv_gcc__Wmissing_declarations+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wmissing-declarations -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wmissing_declarations=yes +else case e in #( + e) ac_cv_gcc__Wmissing_declarations=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wmissing_declarations" >&5 +printf "%s\n" "$ac_cv_gcc__Wmissing_declarations" >&6; } + if test "$ac_cv_gcc__Wmissing_declarations" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wmissing-declarations\"" + NOTEST_CFLAGS="-Wmissing-declarations" + else + apr_addto_bugger="-Wmissing-declarations" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wdeclaration-after-statement" >&5 +printf %s "checking whether gcc accepts -Wdeclaration-after-statement... " >&6; } +if test ${ac_cv_gcc__Wdeclaration_after_statement+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wdeclaration-after-statement -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wdeclaration_after_statement=yes +else case e in #( + e) ac_cv_gcc__Wdeclaration_after_statement=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wdeclaration_after_statement" >&5 +printf "%s\n" "$ac_cv_gcc__Wdeclaration_after_statement" >&6; } + if test "$ac_cv_gcc__Wdeclaration_after_statement" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wdeclaration-after-statement\"" + NOTEST_CFLAGS="-Wdeclaration-after-statement" + else + apr_addto_bugger="-Wdeclaration-after-statement" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Werror=declaration-after-statement" >&5 +printf %s "checking whether gcc accepts -Werror=declaration-after-statement... " >&6; } +if test ${ac_cv_gcc__Werror_declaration_after_statement+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror=declaration-after-statement -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Werror_declaration_after_statement=yes +else case e in #( + e) ac_cv_gcc__Werror_declaration_after_statement=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Werror_declaration_after_statement" >&5 +printf "%s\n" "$ac_cv_gcc__Werror_declaration_after_statement" >&6; } + if test "$ac_cv_gcc__Werror_declaration_after_statement" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Werror=declaration-after-statement\"" + NOTEST_CFLAGS="-Werror=declaration-after-statement" + else + apr_addto_bugger="-Werror=declaration-after-statement" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wpointer-arith" >&5 +printf %s "checking whether gcc accepts -Wpointer-arith... " >&6; } +if test ${ac_cv_gcc__Wpointer_arith+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wpointer-arith -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wpointer_arith=yes +else case e in #( + e) ac_cv_gcc__Wpointer_arith=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wpointer_arith" >&5 +printf "%s\n" "$ac_cv_gcc__Wpointer_arith" >&6; } + if test "$ac_cv_gcc__Wpointer_arith" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wpointer-arith\"" + NOTEST_CFLAGS="-Wpointer-arith" + else + apr_addto_bugger="-Wpointer-arith" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wformat" >&5 +printf %s "checking whether gcc accepts -Wformat... " >&6; } +if test ${ac_cv_gcc__Wformat+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wformat -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wformat=yes +else case e in #( + e) ac_cv_gcc__Wformat=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wformat" >&5 +printf "%s\n" "$ac_cv_gcc__Wformat" >&6; } + if test "$ac_cv_gcc__Wformat" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wformat\"" + NOTEST_CFLAGS="-Wformat" + else + apr_addto_bugger="-Wformat" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wformat-security" >&5 +printf %s "checking whether gcc accepts -Wformat-security... " >&6; } +if test ${ac_cv_gcc__Wformat_security+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wformat-security -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Wformat_security=yes +else case e in #( + e) ac_cv_gcc__Wformat_security=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Wformat_security" >&5 +printf "%s\n" "$ac_cv_gcc__Wformat_security" >&6; } + if test "$ac_cv_gcc__Wformat_security" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Wformat-security\"" + NOTEST_CFLAGS="-Wformat-security" + else + apr_addto_bugger="-Wformat-security" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + + + if test "$GCC" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Werror=format-security" >&5 +printf %s "checking whether gcc accepts -Werror=format-security... " >&6; } +if test ${ac_cv_gcc__Werror_format_security+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror=format-security -Wno-strict-prototypes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_gcc__Werror_format_security=yes +else case e in #( + e) ac_cv_gcc__Werror_format_security=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS="$save_CFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc__Werror_format_security" >&5 +printf "%s\n" "$ac_cv_gcc__Werror_format_security" >&6; } + if test "$ac_cv_gcc__Werror_format_security" = "yes" ; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-Werror=format-security\"" + NOTEST_CFLAGS="-Werror=format-security" + else + apr_addto_bugger="-Werror=format-security" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + + + elif test "$AIX_XLC" = "yes"; then + + if test "x$NOTEST_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting NOTEST_CFLAGS to \"-qfullpath -qinitauto=FE -qcheck=all -qinfo=pro\"" + NOTEST_CFLAGS="-qfullpath -qinitauto=FE -qcheck=all -qinfo=pro" + else + apr_addto_bugger="-qfullpath -qinitauto=FE -qcheck=all -qinfo=pro" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $NOTEST_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to NOTEST_CFLAGS" + NOTEST_CFLAGS="$NOTEST_CFLAGS $i" + fi + done + fi + + fi + fi + +fi + +# Check whether --enable-pie was given. +if test ${enable_pie+y} +then : + enableval=$enable_pie; +fi + +if test "$enable_pie" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts PIE flags" >&5 +printf %s "checking whether $CC accepts PIE flags... " >&6; } +if test ${ap_cv_cc_pie+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS -fPIE" + LDFLAGS="$LDFLAGS -pie" + if test "$cross_compiling" = yes +then : + ap_cv_cc_pie=yes +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +static int foo[30000]; int main () { return 0; } +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ap_cv_cc_pie=yes +else case e in #( + e) ap_cv_cc_pie=no ;; +esac +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi + + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_cv_cc_pie" >&5 +printf "%s\n" "$ap_cv_cc_pie" >&6; } + if test "$ap_cv_cc_pie" = "yes"; then + PICFLAGS="-fPIE" + PILDFLAGS="-pie" + else + as_fn_error $? "--enable-pie requested but $CC failed using PIE flags" "$LINENO" 5 + fi +fi + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST PICFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST PILDFLAGS" + + + +prefix="$orig_prefix" + + module_selection=most + module_default=shared + + +apr_old_cppflags=$CPPFLAGS +CPPFLAGS="$CPPFLAGS $INCLUDES" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if APR_HAS_DSO +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP_TRADITIONAL "YES_IS_DEFINED" >/dev/null 2>&1 +then : + ac_cv_define_APR_HAS_DSO=yes +else case e in #( + e) ac_cv_define_APR_HAS_DSO=no ;; +esac +fi +rm -rf conftest* + +CPPFLAGS=$apr_old_cppflags + + + if test $ac_cv_define_APR_HAS_DSO = "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Missing DSO support - building static modules by default." >&5 +printf "%s\n" "$as_me: WARNING: Missing DSO support - building static modules by default." >&2;} + module_default=static + fi + + + # Check whether --enable-modules was given. +if test ${enable_modules+y} +then : + enableval=$enable_modules; + if test "$enableval" = "none"; then + module_default=no + module_selection=none + else + for i in $enableval; do + if test "$i" = "all" -o "$i" = "most" -o "$i" = "few" -o "$i" = "reallyall" + then + module_selection=$i + else + i=`echo $i | sed 's/-/_/g'` + eval "enable_$i=shared" + fi + done + fi + +fi + + + # Check whether --enable-mods-shared was given. +if test ${enable_mods_shared+y} +then : + enableval=$enable_mods_shared; + for i in $enableval; do + if test "$i" = "all" -o "$i" = "most" -o "$i" = "few" -o "$i" = "reallyall" + then + module_selection=$i + module_default=shared + else + i=`echo $i | sed 's/-/_/g'` + eval "enable_$i=shared" + fi + done + +fi + + + # Check whether --enable-mods-static was given. +if test ${enable_mods_static+y} +then : + enableval=$enable_mods_static; + for i in $enableval; do + if test "$i" = "all" -o "$i" = "most" -o "$i" = "few" -o "$i" = "reallyall"; then + module_selection=$i + module_default=static + else + i=`echo $i | sed 's/-/_/g'` + eval "enable_$i=static" + fi + done + +fi + + + + + + + + current_dir=aaa + modpath_current=modules/aaa + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d aaa || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_authn_file" >&5 +printf %s "checking whether to enable mod_authn_file... " >&6; } + # Check whether --enable-authn-file was given. +if test ${enable_authn_file+y} +then : + enableval=$enable_authn_file; force_authn_file=$enableval +else case e in #( + e) enable_authn_file=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authn_file" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authn_file" = "static" -o "$enable_authn_file" = "shared"; then + : + elif test "$enable_authn_file" = "yes"; then + enable_authn_file=$module_default + elif test "$enable_authn_file" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authn_file=$module_default + else + enable_authn_file=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authn_file" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authn_file=$module_default + else + enable_authn_file=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authn_file" = "all" -o "$enable_authn_file" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authn_file=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authn_file=no + fi + elif test "$enable_authn_file" = "reallyall" -o "$enable_authn_file" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authn_file" != "no" ; then + enable_authn_file=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authn_file=no + fi + else + enable_authn_file=no + fi + if test "$enable_authn_file" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authn_file$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authn_file$_apmod_extra_msg" >&6; } + if test "$enable_authn_file" != "no"; then + case "$enable_authn_file" in + static*) + MODLIST="$MODLIST authn_file" + if test "authn_file" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authn_file" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authn_file" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authn_file.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authn_file.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_authn_dbm... " >&6; } + # Check whether --enable-authn-dbm was given. +if test ${enable_authn_dbm+y} +then : + enableval=$enable_authn_dbm; force_authn_dbm=$enableval +else case e in #( + e) enable_authn_dbm=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authn_dbm" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authn_dbm" = "static" -o "$enable_authn_dbm" = "shared"; then + : + elif test "$enable_authn_dbm" = "yes"; then + enable_authn_dbm=$module_default + elif test "$enable_authn_dbm" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authn_dbm=$module_default + else + enable_authn_dbm=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authn_dbm" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authn_dbm=$module_default + else + enable_authn_dbm=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authn_dbm" = "all" -o "$enable_authn_dbm" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authn_dbm=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authn_dbm=no + fi + elif test "$enable_authn_dbm" = "reallyall" -o "$enable_authn_dbm" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authn_dbm" != "no" ; then + enable_authn_dbm=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authn_dbm=no + fi + else + enable_authn_dbm=no + fi + if test "$enable_authn_dbm" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authn_dbm$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authn_dbm$_apmod_extra_msg" >&6; } + if test "$enable_authn_dbm" != "no"; then + case "$enable_authn_dbm" in + static*) + MODLIST="$MODLIST authn_dbm" + if test "authn_dbm" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authn_dbm" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authn_dbm" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authn_dbm.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authn_dbm.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_authn_anon... " >&6; } + # Check whether --enable-authn-anon was given. +if test ${enable_authn_anon+y} +then : + enableval=$enable_authn_anon; force_authn_anon=$enableval +else case e in #( + e) enable_authn_anon=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authn_anon" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authn_anon" = "static" -o "$enable_authn_anon" = "shared"; then + : + elif test "$enable_authn_anon" = "yes"; then + enable_authn_anon=$module_default + elif test "$enable_authn_anon" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authn_anon=$module_default + else + enable_authn_anon=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authn_anon" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authn_anon=$module_default + else + enable_authn_anon=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authn_anon" = "all" -o "$enable_authn_anon" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authn_anon=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authn_anon=no + fi + elif test "$enable_authn_anon" = "reallyall" -o "$enable_authn_anon" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authn_anon" != "no" ; then + enable_authn_anon=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authn_anon=no + fi + else + enable_authn_anon=no + fi + if test "$enable_authn_anon" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authn_anon$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authn_anon$_apmod_extra_msg" >&6; } + if test "$enable_authn_anon" != "no"; then + case "$enable_authn_anon" in + static*) + MODLIST="$MODLIST authn_anon" + if test "authn_anon" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authn_anon" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authn_anon" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authn_anon.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authn_anon.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_authn_dbd... " >&6; } + # Check whether --enable-authn-dbd was given. +if test ${enable_authn_dbd+y} +then : + enableval=$enable_authn_dbd; force_authn_dbd=$enableval +else case e in #( + e) enable_authn_dbd=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authn_dbd" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authn_dbd" = "static" -o "$enable_authn_dbd" = "shared"; then + : + elif test "$enable_authn_dbd" = "yes"; then + enable_authn_dbd=$module_default + elif test "$enable_authn_dbd" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authn_dbd=$module_default + else + enable_authn_dbd=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authn_dbd" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authn_dbd=$module_default + else + enable_authn_dbd=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authn_dbd" = "all" -o "$enable_authn_dbd" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authn_dbd=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authn_dbd=no + fi + elif test "$enable_authn_dbd" = "reallyall" -o "$enable_authn_dbd" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authn_dbd" != "no" ; then + enable_authn_dbd=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authn_dbd=no + fi + else + enable_authn_dbd=no + fi + if test "$enable_authn_dbd" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authn_dbd$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authn_dbd$_apmod_extra_msg" >&6; } + if test "$enable_authn_dbd" != "no"; then + case "$enable_authn_dbd" in + static*) + MODLIST="$MODLIST authn_dbd" + if test "authn_dbd" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authn_dbd" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authn_dbd" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authn_dbd.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authn_dbd.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_authn_socache... " >&6; } + # Check whether --enable-authn-socache was given. +if test ${enable_authn_socache+y} +then : + enableval=$enable_authn_socache; force_authn_socache=$enableval +else case e in #( + e) enable_authn_socache=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authn_socache" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authn_socache" = "static" -o "$enable_authn_socache" = "shared"; then + : + elif test "$enable_authn_socache" = "yes"; then + enable_authn_socache=$module_default + elif test "$enable_authn_socache" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authn_socache=$module_default + else + enable_authn_socache=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authn_socache" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authn_socache=$module_default + else + enable_authn_socache=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authn_socache" = "all" -o "$enable_authn_socache" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authn_socache=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authn_socache=no + fi + elif test "$enable_authn_socache" = "reallyall" -o "$enable_authn_socache" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authn_socache" != "no" ; then + enable_authn_socache=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authn_socache=no + fi + else + enable_authn_socache=no + fi + if test "$enable_authn_socache" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authn_socache$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authn_socache$_apmod_extra_msg" >&6; } + if test "$enable_authn_socache" != "no"; then + case "$enable_authn_socache" in + static*) + MODLIST="$MODLIST authn_socache" + if test "authn_socache" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authn_socache" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authn_socache" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authn_socache.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authn_socache.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_authn_core... " >&6; } + # Check whether --enable-authn-core was given. +if test ${enable_authn_core+y} +then : + enableval=$enable_authn_core; force_authn_core=$enableval +else case e in #( + e) enable_authn_core=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authn_core" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authn_core" = "static" -o "$enable_authn_core" = "shared"; then + : + elif test "$enable_authn_core" = "yes"; then + enable_authn_core=$module_default + elif test "$enable_authn_core" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authn_core=$module_default + else + enable_authn_core=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authn_core" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authn_core=$module_default + else + enable_authn_core=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authn_core" = "all" -o "$enable_authn_core" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authn_core=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authn_core=no + fi + elif test "$enable_authn_core" = "reallyall" -o "$enable_authn_core" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authn_core" != "no" ; then + enable_authn_core=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authn_core=no + fi + else + enable_authn_core=no + fi + if test "$enable_authn_core" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authn_core$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authn_core$_apmod_extra_msg" >&6; } + if test "$enable_authn_core" != "no"; then + case "$enable_authn_core" in + static*) + MODLIST="$MODLIST authn_core" + if test "authn_core" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authn_core" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authn_core" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authn_core.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authn_core.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_authz_host... " >&6; } + # Check whether --enable-authz-host was given. +if test ${enable_authz_host+y} +then : + enableval=$enable_authz_host; force_authz_host=$enableval +else case e in #( + e) enable_authz_host=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authz_host" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authz_host" = "static" -o "$enable_authz_host" = "shared"; then + : + elif test "$enable_authz_host" = "yes"; then + enable_authz_host=$module_default + elif test "$enable_authz_host" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authz_host=$module_default + else + enable_authz_host=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authz_host" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authz_host=$module_default + else + enable_authz_host=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authz_host" = "all" -o "$enable_authz_host" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authz_host=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authz_host=no + fi + elif test "$enable_authz_host" = "reallyall" -o "$enable_authz_host" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authz_host" != "no" ; then + enable_authz_host=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authz_host=no + fi + else + enable_authz_host=no + fi + if test "$enable_authz_host" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authz_host$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authz_host$_apmod_extra_msg" >&6; } + if test "$enable_authz_host" != "no"; then + case "$enable_authz_host" in + static*) + MODLIST="$MODLIST authz_host" + if test "authz_host" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authz_host" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authz_host" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authz_host.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authz_host.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_authz_groupfile... " >&6; } + # Check whether --enable-authz-groupfile was given. +if test ${enable_authz_groupfile+y} +then : + enableval=$enable_authz_groupfile; force_authz_groupfile=$enableval +else case e in #( + e) enable_authz_groupfile=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authz_groupfile" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authz_groupfile" = "static" -o "$enable_authz_groupfile" = "shared"; then + : + elif test "$enable_authz_groupfile" = "yes"; then + enable_authz_groupfile=$module_default + elif test "$enable_authz_groupfile" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authz_groupfile=$module_default + else + enable_authz_groupfile=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authz_groupfile" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authz_groupfile=$module_default + else + enable_authz_groupfile=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authz_groupfile" = "all" -o "$enable_authz_groupfile" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authz_groupfile=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authz_groupfile=no + fi + elif test "$enable_authz_groupfile" = "reallyall" -o "$enable_authz_groupfile" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authz_groupfile" != "no" ; then + enable_authz_groupfile=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authz_groupfile=no + fi + else + enable_authz_groupfile=no + fi + if test "$enable_authz_groupfile" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authz_groupfile$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authz_groupfile$_apmod_extra_msg" >&6; } + if test "$enable_authz_groupfile" != "no"; then + case "$enable_authz_groupfile" in + static*) + MODLIST="$MODLIST authz_groupfile" + if test "authz_groupfile" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authz_groupfile" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authz_groupfile" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authz_groupfile.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authz_groupfile.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_authz_user... " >&6; } + # Check whether --enable-authz-user was given. +if test ${enable_authz_user+y} +then : + enableval=$enable_authz_user; force_authz_user=$enableval +else case e in #( + e) enable_authz_user=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authz_user" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authz_user" = "static" -o "$enable_authz_user" = "shared"; then + : + elif test "$enable_authz_user" = "yes"; then + enable_authz_user=$module_default + elif test "$enable_authz_user" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authz_user=$module_default + else + enable_authz_user=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authz_user" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authz_user=$module_default + else + enable_authz_user=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authz_user" = "all" -o "$enable_authz_user" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authz_user=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authz_user=no + fi + elif test "$enable_authz_user" = "reallyall" -o "$enable_authz_user" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authz_user" != "no" ; then + enable_authz_user=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authz_user=no + fi + else + enable_authz_user=no + fi + if test "$enable_authz_user" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authz_user$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authz_user$_apmod_extra_msg" >&6; } + if test "$enable_authz_user" != "no"; then + case "$enable_authz_user" in + static*) + MODLIST="$MODLIST authz_user" + if test "authz_user" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authz_user" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authz_user" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authz_user.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authz_user.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_authz_dbm... " >&6; } + # Check whether --enable-authz-dbm was given. +if test ${enable_authz_dbm+y} +then : + enableval=$enable_authz_dbm; force_authz_dbm=$enableval +else case e in #( + e) enable_authz_dbm=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authz_dbm" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authz_dbm" = "static" -o "$enable_authz_dbm" = "shared"; then + : + elif test "$enable_authz_dbm" = "yes"; then + enable_authz_dbm=$module_default + elif test "$enable_authz_dbm" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authz_dbm=$module_default + else + enable_authz_dbm=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authz_dbm" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authz_dbm=$module_default + else + enable_authz_dbm=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authz_dbm" = "all" -o "$enable_authz_dbm" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authz_dbm=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authz_dbm=no + fi + elif test "$enable_authz_dbm" = "reallyall" -o "$enable_authz_dbm" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authz_dbm" != "no" ; then + enable_authz_dbm=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authz_dbm=no + fi + else + enable_authz_dbm=no + fi + if test "$enable_authz_dbm" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authz_dbm$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authz_dbm$_apmod_extra_msg" >&6; } + if test "$enable_authz_dbm" != "no"; then + case "$enable_authz_dbm" in + static*) + MODLIST="$MODLIST authz_dbm" + if test "authz_dbm" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authz_dbm" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authz_dbm" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authz_dbm.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authz_dbm.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_authz_owner... " >&6; } + # Check whether --enable-authz-owner was given. +if test ${enable_authz_owner+y} +then : + enableval=$enable_authz_owner; force_authz_owner=$enableval +else case e in #( + e) enable_authz_owner=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authz_owner" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authz_owner" = "static" -o "$enable_authz_owner" = "shared"; then + : + elif test "$enable_authz_owner" = "yes"; then + enable_authz_owner=$module_default + elif test "$enable_authz_owner" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authz_owner=$module_default + else + enable_authz_owner=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authz_owner" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authz_owner=$module_default + else + enable_authz_owner=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authz_owner" = "all" -o "$enable_authz_owner" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authz_owner=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authz_owner=no + fi + elif test "$enable_authz_owner" = "reallyall" -o "$enable_authz_owner" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authz_owner" != "no" ; then + enable_authz_owner=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authz_owner=no + fi + else + enable_authz_owner=no + fi + if test "$enable_authz_owner" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authz_owner$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authz_owner$_apmod_extra_msg" >&6; } + if test "$enable_authz_owner" != "no"; then + case "$enable_authz_owner" in + static*) + MODLIST="$MODLIST authz_owner" + if test "authz_owner" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authz_owner" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authz_owner" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authz_owner.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authz_owner.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_authz_dbd... " >&6; } + # Check whether --enable-authz-dbd was given. +if test ${enable_authz_dbd+y} +then : + enableval=$enable_authz_dbd; force_authz_dbd=$enableval +else case e in #( + e) enable_authz_dbd=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authz_dbd" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authz_dbd" = "static" -o "$enable_authz_dbd" = "shared"; then + : + elif test "$enable_authz_dbd" = "yes"; then + enable_authz_dbd=$module_default + elif test "$enable_authz_dbd" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authz_dbd=$module_default + else + enable_authz_dbd=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authz_dbd" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authz_dbd=$module_default + else + enable_authz_dbd=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authz_dbd" = "all" -o "$enable_authz_dbd" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authz_dbd=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authz_dbd=no + fi + elif test "$enable_authz_dbd" = "reallyall" -o "$enable_authz_dbd" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authz_dbd" != "no" ; then + enable_authz_dbd=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authz_dbd=no + fi + else + enable_authz_dbd=no + fi + if test "$enable_authz_dbd" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authz_dbd$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authz_dbd$_apmod_extra_msg" >&6; } + if test "$enable_authz_dbd" != "no"; then + case "$enable_authz_dbd" in + static*) + MODLIST="$MODLIST authz_dbd" + if test "authz_dbd" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authz_dbd" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authz_dbd" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authz_dbd.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authz_dbd.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_authz_core... " >&6; } + # Check whether --enable-authz-core was given. +if test ${enable_authz_core+y} +then : + enableval=$enable_authz_core; force_authz_core=$enableval +else case e in #( + e) enable_authz_core=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authz_core" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authz_core" = "static" -o "$enable_authz_core" = "shared"; then + : + elif test "$enable_authz_core" = "yes"; then + enable_authz_core=$module_default + elif test "$enable_authz_core" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authz_core=$module_default + else + enable_authz_core=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authz_core" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authz_core=$module_default + else + enable_authz_core=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authz_core" = "all" -o "$enable_authz_core" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authz_core=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authz_core=no + fi + elif test "$enable_authz_core" = "reallyall" -o "$enable_authz_core" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authz_core" != "no" ; then + enable_authz_core=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authz_core=no + fi + else + enable_authz_core=no + fi + if test "$enable_authz_core" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authz_core$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authz_core$_apmod_extra_msg" >&6; } + if test "$enable_authz_core" != "no"; then + case "$enable_authz_core" in + static*) + MODLIST="$MODLIST authz_core" + if test "authz_core" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authz_core" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authz_core" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authz_core.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authz_core.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_authnz_ldap... " >&6; } + # Check whether --enable-authnz-ldap was given. +if test ${enable_authnz_ldap+y} +then : + enableval=$enable_authnz_ldap; force_authnz_ldap=$enableval +else case e in #( + e) enable_authnz_ldap=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authnz_ldap" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authnz_ldap" = "static" -o "$enable_authnz_ldap" = "shared"; then + : + elif test "$enable_authnz_ldap" = "yes"; then + enable_authnz_ldap=$module_default + elif test "$enable_authnz_ldap" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authnz_ldap=$module_default + else + enable_authnz_ldap=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authnz_ldap" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authnz_ldap=$module_default + else + enable_authnz_ldap=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authnz_ldap" = "all" -o "$enable_authnz_ldap" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authnz_ldap=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authnz_ldap=no + fi + elif test "$enable_authnz_ldap" = "reallyall" -o "$enable_authnz_ldap" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authnz_ldap" != "no" ; then + enable_authnz_ldap=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authnz_ldap=no + fi + else + enable_authnz_ldap=no + fi + if test "$enable_authnz_ldap" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ldap support in apr/apr-util" >&5 +printf %s "checking for ldap support in apr/apr-util... " >&6; } +if test ${ac_cv_APR_HAS_LDAP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + apache_old_cppflags="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCLUDES" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if APR_HAS_LDAP +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP_TRADITIONAL "YES_IS_DEFINED" >/dev/null 2>&1 +then : + ac_cv_APR_HAS_LDAP=yes +else case e in #( + e) ac_cv_APR_HAS_LDAP=no ;; +esac +fi +rm -rf conftest* + + CPPFLAGS="$apache_old_cppflags" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_APR_HAS_LDAP" >&5 +printf "%s\n" "$ac_cv_APR_HAS_LDAP" >&6; } + + if test "$ac_cv_APR_HAS_LDAP" = "yes" ; then + if test -z "$apu_config" ; then + LDAP_LIBS="`$apr_config --ldap-libs`" + else + LDAP_LIBS="`$apu_config --ldap-libs`" + fi + + if test "x$MOD_AUTHNZ_LDAP_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_AUTHNZ_LDAP_LDADD to \"$LDAP_LIBS\"" + MOD_AUTHNZ_LDAP_LDADD="$LDAP_LIBS" + else + apr_addto_bugger="$LDAP_LIBS" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_AUTHNZ_LDAP_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_AUTHNZ_LDAP_LDADD" + MOD_AUTHNZ_LDAP_LDADD="$MOD_AUTHNZ_LDAP_LDADD $i" + fi + done + fi + + + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: apr/apr-util is compiled without ldap support" >&5 +printf "%s\n" "$as_me: WARNING: apr/apr-util is compiled without ldap support" >&2;} + enable_authnz_ldap=no + fi + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_authnz_ldap" >&5 +printf %s "checking whether to enable mod_authnz_ldap... " >&6; } + if test "$enable_authnz_ldap" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_authnz_ldap has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authnz_ldap$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authnz_ldap$_apmod_extra_msg" >&6; } + if test "$enable_authnz_ldap" != "no"; then + case "$enable_authnz_ldap" in + static*) + MODLIST="$MODLIST authnz_ldap" + if test "authnz_ldap" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authnz_ldap" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authnz_ldap" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authnz_ldap.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authnz_ldap.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_authnz_fcgi... " >&6; } + # Check whether --enable-authnz-fcgi was given. +if test ${enable_authnz_fcgi+y} +then : + enableval=$enable_authnz_fcgi; force_authnz_fcgi=$enableval +else case e in #( + e) enable_authnz_fcgi=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_authnz_fcgi" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_authnz_fcgi" = "static" -o "$enable_authnz_fcgi" = "shared"; then + : + elif test "$enable_authnz_fcgi" = "yes"; then + enable_authnz_fcgi=$module_default + elif test "$enable_authnz_fcgi" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authnz_fcgi=$module_default + else + enable_authnz_fcgi=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authnz_fcgi" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_authnz_fcgi=$module_default + else + enable_authnz_fcgi=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_authnz_fcgi" = "all" -o "$enable_authnz_fcgi" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_authnz_fcgi=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authnz_fcgi=no + fi + elif test "$enable_authnz_fcgi" = "reallyall" -o "$enable_authnz_fcgi" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_authnz_fcgi" != "no" ; then + enable_authnz_fcgi=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_authnz_fcgi=no + fi + else + enable_authnz_fcgi=no + fi + if test "$enable_authnz_fcgi" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_authnz_fcgi$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_authnz_fcgi$_apmod_extra_msg" >&6; } + if test "$enable_authnz_fcgi" != "no"; then + case "$enable_authnz_fcgi" in + static*) + MODLIST="$MODLIST authnz_fcgi" + if test "authnz_fcgi" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES authnz_fcgi" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},authnz_fcgi" + fi + ;; + esac + + + if test -z ""; then + objects="mod_authnz_fcgi.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_authnz_fcgi.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_access_compat... " >&6; } + # Check whether --enable-access-compat was given. +if test ${enable_access_compat+y} +then : + enableval=$enable_access_compat; force_access_compat=$enableval +else case e in #( + e) enable_access_compat=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_access_compat" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_access_compat" = "static" -o "$enable_access_compat" = "shared"; then + : + elif test "$enable_access_compat" = "yes"; then + enable_access_compat=$module_default + elif test "$enable_access_compat" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_access_compat=$module_default + else + enable_access_compat=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_access_compat" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_access_compat=$module_default + else + enable_access_compat=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_access_compat" = "all" -o "$enable_access_compat" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_access_compat=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_access_compat=no + fi + elif test "$enable_access_compat" = "reallyall" -o "$enable_access_compat" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_access_compat" != "no" ; then + enable_access_compat=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_access_compat=no + fi + else + enable_access_compat=no + fi + if test "$enable_access_compat" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_access_compat$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_access_compat$_apmod_extra_msg" >&6; } + if test "$enable_access_compat" != "no"; then + case "$enable_access_compat" in + static*) + MODLIST="$MODLIST access_compat" + if test "access_compat" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES access_compat" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},access_compat" + fi + ;; + esac + + + if test -z ""; then + objects="mod_access_compat.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_access_compat.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_auth_basic... " >&6; } + # Check whether --enable-auth-basic was given. +if test ${enable_auth_basic+y} +then : + enableval=$enable_auth_basic; force_auth_basic=$enableval +else case e in #( + e) enable_auth_basic=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_auth_basic" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_auth_basic" = "static" -o "$enable_auth_basic" = "shared"; then + : + elif test "$enable_auth_basic" = "yes"; then + enable_auth_basic=$module_default + elif test "$enable_auth_basic" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_auth_basic=$module_default + else + enable_auth_basic=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth_basic" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_auth_basic=$module_default + else + enable_auth_basic=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth_basic" = "all" -o "$enable_auth_basic" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_auth_basic=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_auth_basic=no + fi + elif test "$enable_auth_basic" = "reallyall" -o "$enable_auth_basic" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_auth_basic" != "no" ; then + enable_auth_basic=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_auth_basic=no + fi + else + enable_auth_basic=no + fi + if test "$enable_auth_basic" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_auth_basic$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_auth_basic$_apmod_extra_msg" >&6; } + if test "$enable_auth_basic" != "no"; then + case "$enable_auth_basic" in + static*) + MODLIST="$MODLIST auth_basic" + if test "auth_basic" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES auth_basic" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},auth_basic" + fi + ;; + esac + + + if test -z ""; then + objects="mod_auth_basic.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_auth_basic.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_auth_form... " >&6; } + # Check whether --enable-auth-form was given. +if test ${enable_auth_form+y} +then : + enableval=$enable_auth_form; force_auth_form=$enableval +else case e in #( + e) enable_auth_form=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_auth_form" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_auth_form" = "static" -o "$enable_auth_form" = "shared"; then + : + elif test "$enable_auth_form" = "yes"; then + enable_auth_form=$module_default + elif test "$enable_auth_form" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_auth_form=$module_default + else + enable_auth_form=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth_form" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_auth_form=$module_default + else + enable_auth_form=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth_form" = "all" -o "$enable_auth_form" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_auth_form=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_auth_form=no + fi + elif test "$enable_auth_form" = "reallyall" -o "$enable_auth_form" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_auth_form" != "no" ; then + enable_auth_form=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_auth_form=no + fi + else + enable_auth_form=no + fi + if test "$enable_auth_form" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_auth_form$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_auth_form$_apmod_extra_msg" >&6; } + if test "$enable_auth_form" != "no"; then + case "$enable_auth_form" in + static*) + MODLIST="$MODLIST auth_form" + if test "auth_form" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES auth_form" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},auth_form" + fi + ;; + esac + + + if test -z ""; then + objects="mod_auth_form.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_auth_form.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_auth_digest... " >&6; } + # Check whether --enable-auth-digest was given. +if test ${enable_auth_digest+y} +then : + enableval=$enable_auth_digest; force_auth_digest=$enableval +else case e in #( + e) enable_auth_digest=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_auth_digest" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_auth_digest" = "static" -o "$enable_auth_digest" = "shared"; then + : + elif test "$enable_auth_digest" = "yes"; then + enable_auth_digest=$module_default + elif test "$enable_auth_digest" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_auth_digest=$module_default + else + enable_auth_digest=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth_digest" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_auth_digest=$module_default + else + enable_auth_digest=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth_digest" = "all" -o "$enable_auth_digest" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_auth_digest=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_auth_digest=no + fi + elif test "$enable_auth_digest" = "reallyall" -o "$enable_auth_digest" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_auth_digest" != "no" ; then + enable_auth_digest=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_auth_digest=no + fi + else + enable_auth_digest=no + fi + if test "$enable_auth_digest" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + +apr_old_cppflags=$CPPFLAGS +CPPFLAGS="$CPPFLAGS $INCLUDES" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if APR_HAS_RANDOM +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP_TRADITIONAL "YES_IS_DEFINED" >/dev/null 2>&1 +then : + ac_cv_define_APR_HAS_RANDOM=yes +else case e in #( + e) ac_cv_define_APR_HAS_RANDOM=no ;; +esac +fi +rm -rf conftest* + +CPPFLAGS=$apr_old_cppflags + + if test $ac_cv_define_APR_HAS_RANDOM = "no"; then + echo "You need APR random support to use mod_auth_digest." + echo "Look at APR configure options --with-egd and --with-devrandom." + enable_auth_digest="no" + fi + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_auth_digest" >&5 +printf %s "checking whether to enable mod_auth_digest... " >&6; } + if test "$enable_auth_digest" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_auth_digest has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_auth_digest$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_auth_digest$_apmod_extra_msg" >&6; } + if test "$enable_auth_digest" != "no"; then + case "$enable_auth_digest" in + static*) + MODLIST="$MODLIST auth_digest" + if test "auth_digest" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES auth_digest" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},auth_digest" + fi + ;; + esac + + + if test -z ""; then + objects="mod_auth_digest.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_auth_digest.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_allowmethods... " >&6; } + # Check whether --enable-allowmethods was given. +if test ${enable_allowmethods+y} +then : + enableval=$enable_allowmethods; force_allowmethods=$enableval +else case e in #( + e) enable_allowmethods=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_allowmethods" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_allowmethods" = "static" -o "$enable_allowmethods" = "shared"; then + : + elif test "$enable_allowmethods" = "yes"; then + enable_allowmethods=$module_default + elif test "$enable_allowmethods" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_allowmethods=$module_default + else + enable_allowmethods=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_allowmethods" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_allowmethods=$module_default + else + enable_allowmethods=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_allowmethods" = "all" -o "$enable_allowmethods" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_allowmethods=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_allowmethods=no + fi + elif test "$enable_allowmethods" = "reallyall" -o "$enable_allowmethods" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_allowmethods" != "no" ; then + enable_allowmethods=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_allowmethods=no + fi + else + enable_allowmethods=no + fi + if test "$enable_allowmethods" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_allowmethods$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_allowmethods$_apmod_extra_msg" >&6; } + if test "$enable_allowmethods" != "no"; then + case "$enable_allowmethods" in + static*) + MODLIST="$MODLIST allowmethods" + if test "allowmethods" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES allowmethods" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},allowmethods" + fi + ;; + esac + + + if test -z ""; then + objects="mod_allowmethods.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_allowmethods.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + + current_dir=arch/win32 + modpath_current=modules/arch/win32 + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d arch/win32 || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_isapi" >&5 +printf %s "checking whether to enable mod_isapi... " >&6; } + # Check whether --enable-isapi was given. +if test ${enable_isapi+y} +then : + enableval=$enable_isapi; force_isapi=$enableval +else case e in #( + e) enable_isapi=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_isapi" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_isapi" = "static" -o "$enable_isapi" = "shared"; then + : + elif test "$enable_isapi" = "yes"; then + enable_isapi=$module_default + elif test "$enable_isapi" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_isapi=$module_default + else + enable_isapi=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_isapi" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_isapi=$module_default + else + enable_isapi=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_isapi" = "all" -o "$enable_isapi" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_isapi=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_isapi=no + fi + elif test "$enable_isapi" = "reallyall" -o "$enable_isapi" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_isapi" != "no" ; then + enable_isapi=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_isapi=no + fi + else + enable_isapi=no + fi + if test "$enable_isapi" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_isapi$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_isapi$_apmod_extra_msg" >&6; } + if test "$enable_isapi" != "no"; then + case "$enable_isapi" in + static*) + MODLIST="$MODLIST isapi" + if test "isapi" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES isapi" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},isapi" + fi + ;; + esac + + + if test -z ""; then + objects="mod_isapi.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_isapi.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + + current_dir=cache + modpath_current=modules/cache + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d cache || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_file_cache" >&5 +printf %s "checking whether to enable mod_file_cache... " >&6; } + # Check whether --enable-file-cache was given. +if test ${enable_file_cache+y} +then : + enableval=$enable_file_cache; force_file_cache=$enableval +else case e in #( + e) enable_file_cache=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_file_cache" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_file_cache" = "static" -o "$enable_file_cache" = "shared"; then + : + elif test "$enable_file_cache" = "yes"; then + enable_file_cache=$module_default + elif test "$enable_file_cache" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_file_cache=$module_default + else + enable_file_cache=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_file_cache" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_file_cache=$module_default + else + enable_file_cache=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_file_cache" = "all" -o "$enable_file_cache" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_file_cache=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_file_cache=no + fi + elif test "$enable_file_cache" = "reallyall" -o "$enable_file_cache" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_file_cache" != "no" ; then + enable_file_cache=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_file_cache=no + fi + else + enable_file_cache=no + fi + if test "$enable_file_cache" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_file_cache$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_file_cache$_apmod_extra_msg" >&6; } + if test "$enable_file_cache" != "no"; then + case "$enable_file_cache" in + static*) + MODLIST="$MODLIST file_cache" + if test "file_cache" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES file_cache" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},file_cache" + fi + ;; + esac + + + if test -z ""; then + objects="mod_file_cache.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_file_cache.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_cache... " >&6; } + # Check whether --enable-cache was given. +if test ${enable_cache+y} +then : + enableval=$enable_cache; force_cache=$enableval +else case e in #( + e) enable_cache=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_cache" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_cache" = "static" -o "$enable_cache" = "shared"; then + : + elif test "$enable_cache" = "yes"; then + enable_cache=$module_default + elif test "$enable_cache" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cache=$module_default + else + enable_cache=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cache" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_cache=$module_default + else + enable_cache=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cache" = "all" -o "$enable_cache" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cache=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cache=no + fi + elif test "$enable_cache" = "reallyall" -o "$enable_cache" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_cache" != "no" ; then + enable_cache=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cache=no + fi + else + enable_cache=no + fi + if test "$enable_cache" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_cache$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_cache$_apmod_extra_msg" >&6; } + if test "$enable_cache" != "no"; then + case "$enable_cache" in + static*) + MODLIST="$MODLIST cache" + if test "cache" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES cache" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},cache" + fi + ;; + esac + + + if test -z "$cache_objs"; then + objects="mod_cache.lo" + else + objects="$cache_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_cache.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_cache_disk... " >&6; } + # Check whether --enable-cache-disk was given. +if test ${enable_cache_disk+y} +then : + enableval=$enable_cache_disk; force_cache_disk=$enableval +else case e in #( + e) enable_cache_disk=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_cache_disk" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_cache_disk" = "static" -o "$enable_cache_disk" = "shared"; then + : + elif test "$enable_cache_disk" = "yes"; then + enable_cache_disk=$module_default + elif test "$enable_cache_disk" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cache_disk=$module_default + else + enable_cache_disk=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cache_disk" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_cache_disk=$module_default + else + enable_cache_disk=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cache_disk" = "all" -o "$enable_cache_disk" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cache_disk=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cache_disk=no + fi + elif test "$enable_cache_disk" = "reallyall" -o "$enable_cache_disk" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_cache_disk" != "no" ; then + enable_cache_disk=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cache_disk=no + fi + else + enable_cache_disk=no + fi + if test "$enable_cache_disk" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_cache" = "no" ; then + enable_cache_disk=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_cache is disabled but required for mod_cache_disk\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_cache is disabled but required for mod_cache_disk\"" >&2;} + elif test "$enable_cache_disk" = "static" && test "$enable_cache" != "static" ; then + enable_cache_disk=$enable_cache + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_cache_disk shared because mod_cache is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_cache_disk shared because mod_cache is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_cache_disk" >&5 +printf %s "checking whether to enable mod_cache_disk... " >&6; } + if test "$enable_cache_disk" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_cache_disk has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_cache_disk$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_cache_disk$_apmod_extra_msg" >&6; } + if test "$enable_cache_disk" != "no"; then + case "$enable_cache_disk" in + static*) + MODLIST="$MODLIST cache_disk" + if test "cache_disk" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES cache_disk" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},cache_disk" + fi + ;; + esac + + + if test -z "$cache_disk_objs"; then + objects="mod_cache_disk.lo" + else + objects="$cache_disk_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_cache_disk.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_cache_socache... " >&6; } + # Check whether --enable-cache-socache was given. +if test ${enable_cache_socache+y} +then : + enableval=$enable_cache_socache; force_cache_socache=$enableval +else case e in #( + e) enable_cache_socache=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_cache_socache" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_cache_socache" = "static" -o "$enable_cache_socache" = "shared"; then + : + elif test "$enable_cache_socache" = "yes"; then + enable_cache_socache=$module_default + elif test "$enable_cache_socache" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cache_socache=$module_default + else + enable_cache_socache=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cache_socache" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_cache_socache=$module_default + else + enable_cache_socache=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cache_socache" = "all" -o "$enable_cache_socache" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cache_socache=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cache_socache=no + fi + elif test "$enable_cache_socache" = "reallyall" -o "$enable_cache_socache" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_cache_socache" != "no" ; then + enable_cache_socache=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cache_socache=no + fi + else + enable_cache_socache=no + fi + if test "$enable_cache_socache" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_cache_socache$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_cache_socache$_apmod_extra_msg" >&6; } + if test "$enable_cache_socache" != "no"; then + case "$enable_cache_socache" in + static*) + MODLIST="$MODLIST cache_socache" + if test "cache_socache" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES cache_socache" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},cache_socache" + fi + ;; + esac + + + if test -z "$cache_socache_objs"; then + objects="mod_cache_socache.lo" + else + objects="$cache_socache_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_cache_socache.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_socache_shmcb... " >&6; } + # Check whether --enable-socache-shmcb was given. +if test ${enable_socache_shmcb+y} +then : + enableval=$enable_socache_shmcb; force_socache_shmcb=$enableval +else case e in #( + e) enable_socache_shmcb=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_socache_shmcb" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_socache_shmcb" = "static" -o "$enable_socache_shmcb" = "shared"; then + : + elif test "$enable_socache_shmcb" = "yes"; then + enable_socache_shmcb=$module_default + elif test "$enable_socache_shmcb" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_socache_shmcb=$module_default + else + enable_socache_shmcb=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_socache_shmcb" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_socache_shmcb=$module_default + else + enable_socache_shmcb=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_socache_shmcb" = "all" -o "$enable_socache_shmcb" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_socache_shmcb=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_socache_shmcb=no + fi + elif test "$enable_socache_shmcb" = "reallyall" -o "$enable_socache_shmcb" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_socache_shmcb" != "no" ; then + enable_socache_shmcb=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_socache_shmcb=no + fi + else + enable_socache_shmcb=no + fi + if test "$enable_socache_shmcb" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_socache_shmcb$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_socache_shmcb$_apmod_extra_msg" >&6; } + if test "$enable_socache_shmcb" != "no"; then + case "$enable_socache_shmcb" in + static*) + MODLIST="$MODLIST socache_shmcb" + if test "socache_shmcb" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES socache_shmcb" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},socache_shmcb" + fi + ;; + esac + + + if test -z ""; then + objects="mod_socache_shmcb.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_socache_shmcb.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_socache_dbm... " >&6; } + # Check whether --enable-socache-dbm was given. +if test ${enable_socache_dbm+y} +then : + enableval=$enable_socache_dbm; force_socache_dbm=$enableval +else case e in #( + e) enable_socache_dbm=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_socache_dbm" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_socache_dbm" = "static" -o "$enable_socache_dbm" = "shared"; then + : + elif test "$enable_socache_dbm" = "yes"; then + enable_socache_dbm=$module_default + elif test "$enable_socache_dbm" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_socache_dbm=$module_default + else + enable_socache_dbm=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_socache_dbm" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_socache_dbm=$module_default + else + enable_socache_dbm=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_socache_dbm" = "all" -o "$enable_socache_dbm" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_socache_dbm=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_socache_dbm=no + fi + elif test "$enable_socache_dbm" = "reallyall" -o "$enable_socache_dbm" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_socache_dbm" != "no" ; then + enable_socache_dbm=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_socache_dbm=no + fi + else + enable_socache_dbm=no + fi + if test "$enable_socache_dbm" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_socache_dbm$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_socache_dbm$_apmod_extra_msg" >&6; } + if test "$enable_socache_dbm" != "no"; then + case "$enable_socache_dbm" in + static*) + MODLIST="$MODLIST socache_dbm" + if test "socache_dbm" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES socache_dbm" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},socache_dbm" + fi + ;; + esac + + + if test -z ""; then + objects="mod_socache_dbm.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_socache_dbm.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_socache_memcache... " >&6; } + # Check whether --enable-socache-memcache was given. +if test ${enable_socache_memcache+y} +then : + enableval=$enable_socache_memcache; force_socache_memcache=$enableval +else case e in #( + e) enable_socache_memcache=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_socache_memcache" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_socache_memcache" = "static" -o "$enable_socache_memcache" = "shared"; then + : + elif test "$enable_socache_memcache" = "yes"; then + enable_socache_memcache=$module_default + elif test "$enable_socache_memcache" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_socache_memcache=$module_default + else + enable_socache_memcache=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_socache_memcache" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_socache_memcache=$module_default + else + enable_socache_memcache=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_socache_memcache" = "all" -o "$enable_socache_memcache" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_socache_memcache=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_socache_memcache=no + fi + elif test "$enable_socache_memcache" = "reallyall" -o "$enable_socache_memcache" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_socache_memcache" != "no" ; then + enable_socache_memcache=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_socache_memcache=no + fi + else + enable_socache_memcache=no + fi + if test "$enable_socache_memcache" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_socache_memcache$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_socache_memcache$_apmod_extra_msg" >&6; } + if test "$enable_socache_memcache" != "no"; then + case "$enable_socache_memcache" in + static*) + MODLIST="$MODLIST socache_memcache" + if test "socache_memcache" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES socache_memcache" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},socache_memcache" + fi + ;; + esac + + + if test -z ""; then + objects="mod_socache_memcache.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_socache_memcache.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_socache_redis... " >&6; } + # Check whether --enable-socache-redis was given. +if test ${enable_socache_redis+y} +then : + enableval=$enable_socache_redis; force_socache_redis=$enableval +else case e in #( + e) enable_socache_redis=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_socache_redis" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_socache_redis" = "static" -o "$enable_socache_redis" = "shared"; then + : + elif test "$enable_socache_redis" = "yes"; then + enable_socache_redis=$module_default + elif test "$enable_socache_redis" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_socache_redis=$module_default + else + enable_socache_redis=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_socache_redis" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_socache_redis=$module_default + else + enable_socache_redis=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_socache_redis" = "all" -o "$enable_socache_redis" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_socache_redis=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_socache_redis=no + fi + elif test "$enable_socache_redis" = "reallyall" -o "$enable_socache_redis" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_socache_redis" != "no" ; then + enable_socache_redis=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_socache_redis=no + fi + else + enable_socache_redis=no + fi + if test "$enable_socache_redis" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_socache_redis$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_socache_redis$_apmod_extra_msg" >&6; } + if test "$enable_socache_redis" != "no"; then + case "$enable_socache_redis" in + static*) + MODLIST="$MODLIST socache_redis" + if test "socache_redis" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES socache_redis" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},socache_redis" + fi + ;; + esac + + + if test -z ""; then + objects="mod_socache_redis.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_socache_redis.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_socache_dc... " >&6; } + # Check whether --enable-socache-dc was given. +if test ${enable_socache_dc+y} +then : + enableval=$enable_socache_dc; force_socache_dc=$enableval +else case e in #( + e) enable_socache_dc=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_socache_dc" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_socache_dc" = "static" -o "$enable_socache_dc" = "shared"; then + : + elif test "$enable_socache_dc" = "yes"; then + enable_socache_dc=$module_default + elif test "$enable_socache_dc" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_socache_dc=$module_default + else + enable_socache_dc=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_socache_dc" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_socache_dc=$module_default + else + enable_socache_dc=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_socache_dc" = "all" -o "$enable_socache_dc" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_socache_dc=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_socache_dc=no + fi + elif test "$enable_socache_dc" = "reallyall" -o "$enable_socache_dc" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_socache_dc" != "no" ; then + enable_socache_dc=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_socache_dc=no + fi + else + enable_socache_dc=no + fi + if test "$enable_socache_dc" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + +if test "x$ap_distcache_configured" = "x"; then + ap_distcache_found="" + ap_distcache_base="" + ap_distcache_libs="" + ap_distcache_ldflags="" + ap_distcache_with="" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for user-provided distcache base" >&5 +printf %s "checking for user-provided distcache base... " >&6; } + +# Check whether --with-distcache was given. +if test ${with_distcache+y} +then : + withval=$with_distcache; + if test "x$withval" != "xyes" -a "x$withval" != "x"; then + ap_distcache_with="yes" + ap_distcache_base="`cd $withval ; pwd`" + fi + +fi + + if test "x$ap_distcache_base" = "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_distcache_base" >&5 +printf "%s\n" "$ap_distcache_base" >&6; } + fi + + saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" + saved_LDFLAGS="$LDFLAGS" + + if test "x$ap_distcache_base" != "x"; then + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"-I$ap_distcache_base/include\"" + CPPFLAGS="-I$ap_distcache_base/include" + else + apr_addto_bugger="-I$ap_distcache_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_INCLUDES" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_INCLUDES to \"-I$ap_distcache_base/include\"" + MOD_INCLUDES="-I$ap_distcache_base/include" + else + apr_addto_bugger="-I$ap_distcache_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_INCLUDES; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_INCLUDES" + MOD_INCLUDES="$MOD_INCLUDES $i" + fi + done + fi + + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"-L$ap_distcache_base/lib\"" + LDFLAGS="-L$ap_distcache_base/lib" + else + apr_addto_bugger="-L$ap_distcache_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$ap_distcache_ldflags" = "x"; then + test "x$silent" != "xyes" && echo " setting ap_distcache_ldflags to \"-L$ap_distcache_base/lib\"" + ap_distcache_ldflags="-L$ap_distcache_base/lib" + else + apr_addto_bugger="-L$ap_distcache_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $ap_distcache_ldflags; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to ap_distcache_ldflags" + ap_distcache_ldflags="$ap_distcache_ldflags $i" + fi + done + fi + + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$ap_platform_runtime_link_flag$ap_distcache_base/lib\"" + LDFLAGS="$ap_platform_runtime_link_flag$ap_distcache_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_distcache_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$ap_distcache_ldflags" = "x"; then + test "x$silent" != "xyes" && echo " setting ap_distcache_ldflags to \"$ap_platform_runtime_link_flag$ap_distcache_base/lib\"" + ap_distcache_ldflags="$ap_platform_runtime_link_flag$ap_distcache_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_distcache_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $ap_distcache_ldflags; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to ap_distcache_ldflags" + ap_distcache_ldflags="$ap_distcache_ldflags $i" + fi + done + fi + + fi + fi + for ac_header in distcache/dc_client.h +do : + ac_fn_c_check_header_compile "$LINENO" "distcache/dc_client.h" "ac_cv_header_distcache_dc_client_h" "$ac_includes_default" +if test "x$ac_cv_header_distcache_dc_client_h" = xyes +then : + printf "%s\n" "#define HAVE_DISTCACHE_DC_CLIENT_H 1" >>confdefs.h + ap_distcache_found="yes" +fi + +done + if test "$ap_distcache_found" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for distcache version" >&5 +printf %s "checking for distcache version... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + +#if DISTCACHE_CLIENT_API != 0x0001 +#error "distcache API version is unrecognised" +#endif + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else case e in #( + e) ap_distcache_found="no" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_distcache_found" >&5 +printf "%s\n" "$ap_distcache_found" >&6; } + fi + if test "$ap_distcache_found" != "yes"; then + if test "x$ap_distcache_with" = "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ...No distcache detected" >&5 +printf "%s\n" "$as_me: WARNING: ...No distcache detected" >&2;} + else + as_fn_error $? "...No distcache detected" "$LINENO" 5 + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for distcache libraries" >&5 +printf %s "checking for distcache libraries... " >&6; } + ap_distcache_libs="-ldistcache -lnal" + + if test "x$LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LIBS to \"$ap_distcache_libs\"" + LIBS="$ap_distcache_libs" + else + apr_addto_bugger="$ap_distcache_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +DC_CTX *foo = DC_CTX_new((const char *)0,0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +else case e in #( + e) ap_distcache_found="no" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_distcache_found" >&5 +printf "%s\n" "$ap_distcache_found" >&6; } + if test "$ap_distcache_found" != "yes"; then + if test "x$ap_distcache_base" = "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ... Error, distcache libraries were missing or unusable" >&5 +printf "%s\n" "$as_me: WARNING: ... Error, distcache libraries were missing or unusable" >&2;} + else + as_fn_error $? "... Error, distcache libraries were missing or unusable" "$LINENO" 5 + fi + fi + fi + + CPPFLAGS="$saved_CPPFLAGS" + LIBS="$saved_LIBS" + LDFLAGS="$saved_LDFLAGS" + + if test "$ap_distcache_found" = "yes"; then + + if test "x$MOD_SOCACHE_DC_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_SOCACHE_DC_LDADD to \"$ap_distcache_ldflags $ap_distcache_libs\"" + MOD_SOCACHE_DC_LDADD="$ap_distcache_ldflags $ap_distcache_libs" + else + apr_addto_bugger="$ap_distcache_ldflags $ap_distcache_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_SOCACHE_DC_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_SOCACHE_DC_LDADD" + MOD_SOCACHE_DC_LDADD="$MOD_SOCACHE_DC_LDADD $i" + fi + done + fi + + +printf "%s\n" "#define HAVE_DISTCACHE 1" >>confdefs.h + + else + enable_socache_dc=no + fi + ap_distcache_configured="yes" +fi + + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_socache_dc" >&5 +printf %s "checking whether to enable mod_socache_dc... " >&6; } + if test "$enable_socache_dc" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_socache_dc has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_socache_dc$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_socache_dc$_apmod_extra_msg" >&6; } + if test "$enable_socache_dc" != "no"; then + case "$enable_socache_dc" in + static*) + MODLIST="$MODLIST socache_dc" + if test "socache_dc" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES socache_dc" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},socache_dc" + fi + ;; + esac + + + if test -z ""; then + objects="mod_socache_dc.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_socache_dc.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + + current_dir=core + modpath_current=modules/core + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d core || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + +apr_old_cppflags=$CPPFLAGS +CPPFLAGS="$CPPFLAGS $INCLUDES" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if APR_HAS_DSO +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP_TRADITIONAL "YES_IS_DEFINED" >/dev/null 2>&1 +then : + ac_cv_define_APR_HAS_DSO=yes +else case e in #( + e) ac_cv_define_APR_HAS_DSO=no ;; +esac +fi +rm -rf conftest* + +CPPFLAGS=$apr_old_cppflags + + +case "x$enable_so" in + "xyes") + if test $ac_cv_define_APR_HAS_DSO = "no"; then + as_fn_error $? "mod_so has been requested but cannot be built on your system" "$LINENO" 5 + fi + ;; + "xshared") + as_fn_error $? "mod_so can not be built as a shared DSO" "$LINENO" 5 + ;; + "xno") + ;; + "x") + enable_so=$ac_cv_define_APR_HAS_DSO + ;; +esac + +if test "x$enable_so" = "xyes"; then + enable_so="static" +fi + +if test "x$enable_so" = "xstatic"; then + + if test "x$HTTPD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting HTTPD_LDFLAGS to \"-export-dynamic\"" + HTTPD_LDFLAGS="-export-dynamic" + else + apr_addto_bugger="-export-dynamic" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $HTTPD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to HTTPD_LDFLAGS" + HTTPD_LDFLAGS="$HTTPD_LDFLAGS $i" + fi + done + fi + + INSTALL_DSO=yes +else + INSTALL_DSO=no +fi + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST INSTALL_DSO" + + + +if test "$sharedobjs" = "yes"; then + if test $ac_cv_define_APR_HAS_DSO = "no"; then + as_fn_error $? "shared objects have been requested but cannot be built since mod_so cannot be built" "$LINENO" 5 + elif test $enable_so = "no"; then + as_fn_error $? "shared objects have been requested but cannot be built since mod_so was disabled" "$LINENO" 5 + fi +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_so" >&5 +printf %s "checking whether to enable mod_so... " >&6; } + # Check whether --enable-so was given. +if test ${enable_so+y} +then : + enableval=$enable_so; force_so=$enableval +else case e in #( + e) enable_so=$enable_so ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_so" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_so" = "static" -o "$enable_so" = "shared"; then + : + elif test "$enable_so" = "yes"; then + enable_so=$module_default + elif test "$enable_so" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_so=$module_default + else + enable_so=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_so" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_so=$module_default + else + enable_so=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_so" = "all" -o "$enable_so" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_so=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_so=no + fi + elif test "$enable_so" = "reallyall" -o "$enable_so" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_so" != "no" ; then + enable_so=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_so=no + fi + else + enable_so=no + fi + if test "$enable_so" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_so$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_so$_apmod_extra_msg" >&6; } + if test "$enable_so" != "no"; then + case "$enable_so" in + static*) + MODLIST="$MODLIST so" + if test "so" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES so" + if test "$enable_so" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},so" + fi + ;; + esac + + + if test -z ""; then + objects="mod_so.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_so.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_watchdog... " >&6; } + # Check whether --enable-watchdog was given. +if test ${enable_watchdog+y} +then : + enableval=$enable_watchdog; force_watchdog=$enableval +else case e in #( + e) enable_watchdog=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_watchdog" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_watchdog" = "static" -o "$enable_watchdog" = "shared"; then + : + elif test "$enable_watchdog" = "yes"; then + enable_watchdog=$module_default + elif test "$enable_watchdog" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_watchdog=$module_default + else + enable_watchdog=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_watchdog" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_watchdog=$module_default + else + enable_watchdog=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_watchdog" = "all" -o "$enable_watchdog" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_watchdog=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_watchdog=no + fi + elif test "$enable_watchdog" = "reallyall" -o "$enable_watchdog" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_watchdog" != "no" ; then + enable_watchdog=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_watchdog=no + fi + else + enable_watchdog=no + fi + if test "$enable_watchdog" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + +apr_old_cppflags=$CPPFLAGS +CPPFLAGS="$CPPFLAGS $INCLUDES" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if APR_HAS_THREADS +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP_TRADITIONAL "YES_IS_DEFINED" >/dev/null 2>&1 +then : + ac_cv_define_APR_HAS_THREADS=yes +else case e in #( + e) ac_cv_define_APR_HAS_THREADS=no ;; +esac +fi +rm -rf conftest* + +CPPFLAGS=$apr_old_cppflags + + if test $ac_cv_define_APR_HAS_THREADS = "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: mod_watchdog requires apr to be built with --enable-threads" >&5 +printf "%s\n" "$as_me: WARNING: mod_watchdog requires apr to be built with --enable-threads" >&2;} + enable_watchdog=no + fi + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_watchdog" >&5 +printf %s "checking whether to enable mod_watchdog... " >&6; } + if test "$enable_watchdog" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_watchdog has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_watchdog$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_watchdog$_apmod_extra_msg" >&6; } + if test "$enable_watchdog" != "no"; then + case "$enable_watchdog" in + static*) + MODLIST="$MODLIST watchdog" + if test "watchdog" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES watchdog" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},watchdog" + fi + ;; + esac + + + if test -z ""; then + objects="mod_watchdog.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_watchdog.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_macro... " >&6; } + # Check whether --enable-macro was given. +if test ${enable_macro+y} +then : + enableval=$enable_macro; force_macro=$enableval +else case e in #( + e) enable_macro=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_macro" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_macro" = "static" -o "$enable_macro" = "shared"; then + : + elif test "$enable_macro" = "yes"; then + enable_macro=$module_default + elif test "$enable_macro" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_macro=$module_default + else + enable_macro=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_macro" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_macro=$module_default + else + enable_macro=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_macro" = "all" -o "$enable_macro" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_macro=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_macro=no + fi + elif test "$enable_macro" = "reallyall" -o "$enable_macro" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_macro" != "no" ; then + enable_macro=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_macro=no + fi + else + enable_macro=no + fi + if test "$enable_macro" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_macro$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_macro$_apmod_extra_msg" >&6; } + if test "$enable_macro" != "no"; then + case "$enable_macro" in + static*) + MODLIST="$MODLIST macro" + if test "macro" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES macro" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},macro" + fi + ;; + esac + + + if test -z ""; then + objects="mod_macro.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_macro.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + current_dir=database + modpath_current=modules/database + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d database || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_dbd" >&5 +printf %s "checking whether to enable mod_dbd... " >&6; } + # Check whether --enable-dbd was given. +if test ${enable_dbd+y} +then : + enableval=$enable_dbd; force_dbd=$enableval +else case e in #( + e) enable_dbd=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_dbd" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_dbd" = "static" -o "$enable_dbd" = "shared"; then + : + elif test "$enable_dbd" = "yes"; then + enable_dbd=$module_default + elif test "$enable_dbd" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_dbd=$module_default + else + enable_dbd=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dbd" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_dbd=$module_default + else + enable_dbd=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dbd" = "all" -o "$enable_dbd" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_dbd=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_dbd=no + fi + elif test "$enable_dbd" = "reallyall" -o "$enable_dbd" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_dbd" != "no" ; then + enable_dbd=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_dbd=no + fi + else + enable_dbd=no + fi + if test "$enable_dbd" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_dbd$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_dbd$_apmod_extra_msg" >&6; } + if test "$enable_dbd" != "no"; then + case "$enable_dbd" in + static*) + MODLIST="$MODLIST dbd" + if test "dbd" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES dbd" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},dbd" + fi + ;; + esac + + + if test -z ""; then + objects="mod_dbd.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_dbd.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + current_dir=debugging + modpath_current=modules/debugging + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d debugging || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_bucketeer" >&5 +printf %s "checking whether to enable mod_bucketeer... " >&6; } + # Check whether --enable-bucketeer was given. +if test ${enable_bucketeer+y} +then : + enableval=$enable_bucketeer; force_bucketeer=$enableval +else case e in #( + e) enable_bucketeer=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_bucketeer" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_bucketeer" = "static" -o "$enable_bucketeer" = "shared"; then + : + elif test "$enable_bucketeer" = "yes"; then + enable_bucketeer=$module_default + elif test "$enable_bucketeer" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_bucketeer=$module_default + else + enable_bucketeer=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_bucketeer" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_bucketeer=$module_default + else + enable_bucketeer=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_bucketeer" = "all" -o "$enable_bucketeer" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_bucketeer=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_bucketeer=no + fi + elif test "$enable_bucketeer" = "reallyall" -o "$enable_bucketeer" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_bucketeer" != "no" ; then + enable_bucketeer=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_bucketeer=no + fi + else + enable_bucketeer=no + fi + if test "$enable_bucketeer" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_bucketeer$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_bucketeer$_apmod_extra_msg" >&6; } + if test "$enable_bucketeer" != "no"; then + case "$enable_bucketeer" in + static*) + MODLIST="$MODLIST bucketeer" + if test "bucketeer" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES bucketeer" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},bucketeer" + fi + ;; + esac + + + if test -z ""; then + objects="mod_bucketeer.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_bucketeer.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_dumpio... " >&6; } + # Check whether --enable-dumpio was given. +if test ${enable_dumpio+y} +then : + enableval=$enable_dumpio; force_dumpio=$enableval +else case e in #( + e) enable_dumpio=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_dumpio" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_dumpio" = "static" -o "$enable_dumpio" = "shared"; then + : + elif test "$enable_dumpio" = "yes"; then + enable_dumpio=$module_default + elif test "$enable_dumpio" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_dumpio=$module_default + else + enable_dumpio=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dumpio" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_dumpio=$module_default + else + enable_dumpio=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dumpio" = "all" -o "$enable_dumpio" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_dumpio=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_dumpio=no + fi + elif test "$enable_dumpio" = "reallyall" -o "$enable_dumpio" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_dumpio" != "no" ; then + enable_dumpio=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_dumpio=no + fi + else + enable_dumpio=no + fi + if test "$enable_dumpio" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_dumpio$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_dumpio$_apmod_extra_msg" >&6; } + if test "$enable_dumpio" != "no"; then + case "$enable_dumpio" in + static*) + MODLIST="$MODLIST dumpio" + if test "dumpio" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES dumpio" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},dumpio" + fi + ;; + esac + + + if test -z ""; then + objects="mod_dumpio.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_dumpio.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + + current_dir=echo + modpath_current=modules/echo + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d echo || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_echo" >&5 +printf %s "checking whether to enable mod_echo... " >&6; } + # Check whether --enable-echo was given. +if test ${enable_echo+y} +then : + enableval=$enable_echo; force_echo=$enableval +else case e in #( + e) enable_echo=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_echo" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_echo" = "static" -o "$enable_echo" = "shared"; then + : + elif test "$enable_echo" = "yes"; then + enable_echo=$module_default + elif test "$enable_echo" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_echo=$module_default + else + enable_echo=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_echo" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_echo=$module_default + else + enable_echo=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_echo" = "all" -o "$enable_echo" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_echo=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_echo=no + fi + elif test "$enable_echo" = "reallyall" -o "$enable_echo" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_echo" != "no" ; then + enable_echo=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_echo=no + fi + else + enable_echo=no + fi + if test "$enable_echo" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_echo$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_echo$_apmod_extra_msg" >&6; } + if test "$enable_echo" != "no"; then + case "$enable_echo" in + static*) + MODLIST="$MODLIST echo" + if test "echo" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES echo" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},echo" + fi + ;; + esac + + + if test -z ""; then + objects="mod_echo.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_echo.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + current_dir=examples + modpath_current=modules/examples + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d examples || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_example_hooks" >&5 +printf %s "checking whether to enable mod_example_hooks... " >&6; } + # Check whether --enable-example-hooks was given. +if test ${enable_example_hooks+y} +then : + enableval=$enable_example_hooks; force_example_hooks=$enableval +else case e in #( + e) enable_example_hooks=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_example_hooks" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_example_hooks" = "static" -o "$enable_example_hooks" = "shared"; then + : + elif test "$enable_example_hooks" = "yes"; then + enable_example_hooks=$module_default + elif test "$enable_example_hooks" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_example_hooks=$module_default + else + enable_example_hooks=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_example_hooks" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_example_hooks=$module_default + else + enable_example_hooks=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_example_hooks" = "all" -o "$enable_example_hooks" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_example_hooks=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_example_hooks=no + fi + elif test "$enable_example_hooks" = "reallyall" -o "$enable_example_hooks" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_example_hooks" != "no" ; then + enable_example_hooks=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_example_hooks=no + fi + else + enable_example_hooks=no + fi + if test "$enable_example_hooks" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_example_hooks$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_example_hooks$_apmod_extra_msg" >&6; } + if test "$enable_example_hooks" != "no"; then + case "$enable_example_hooks" in + static*) + MODLIST="$MODLIST example_hooks" + if test "example_hooks" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES example_hooks" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},example_hooks" + fi + ;; + esac + + + if test -z ""; then + objects="mod_example_hooks.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_example_hooks.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_case_filter... " >&6; } + # Check whether --enable-case-filter was given. +if test ${enable_case_filter+y} +then : + enableval=$enable_case_filter; force_case_filter=$enableval +else case e in #( + e) enable_case_filter=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_case_filter" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_case_filter" = "static" -o "$enable_case_filter" = "shared"; then + : + elif test "$enable_case_filter" = "yes"; then + enable_case_filter=$module_default + elif test "$enable_case_filter" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_case_filter=$module_default + else + enable_case_filter=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_case_filter" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_case_filter=$module_default + else + enable_case_filter=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_case_filter" = "all" -o "$enable_case_filter" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_case_filter=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_case_filter=no + fi + elif test "$enable_case_filter" = "reallyall" -o "$enable_case_filter" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_case_filter" != "no" ; then + enable_case_filter=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_case_filter=no + fi + else + enable_case_filter=no + fi + if test "$enable_case_filter" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_case_filter$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_case_filter$_apmod_extra_msg" >&6; } + if test "$enable_case_filter" != "no"; then + case "$enable_case_filter" in + static*) + MODLIST="$MODLIST case_filter" + if test "case_filter" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES case_filter" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},case_filter" + fi + ;; + esac + + + if test -z ""; then + objects="mod_case_filter.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_case_filter.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_case_filter_in... " >&6; } + # Check whether --enable-case-filter-in was given. +if test ${enable_case_filter_in+y} +then : + enableval=$enable_case_filter_in; force_case_filter_in=$enableval +else case e in #( + e) enable_case_filter_in=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_case_filter_in" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_case_filter_in" = "static" -o "$enable_case_filter_in" = "shared"; then + : + elif test "$enable_case_filter_in" = "yes"; then + enable_case_filter_in=$module_default + elif test "$enable_case_filter_in" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_case_filter_in=$module_default + else + enable_case_filter_in=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_case_filter_in" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_case_filter_in=$module_default + else + enable_case_filter_in=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_case_filter_in" = "all" -o "$enable_case_filter_in" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_case_filter_in=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_case_filter_in=no + fi + elif test "$enable_case_filter_in" = "reallyall" -o "$enable_case_filter_in" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_case_filter_in" != "no" ; then + enable_case_filter_in=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_case_filter_in=no + fi + else + enable_case_filter_in=no + fi + if test "$enable_case_filter_in" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_case_filter_in$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_case_filter_in$_apmod_extra_msg" >&6; } + if test "$enable_case_filter_in" != "no"; then + case "$enable_case_filter_in" in + static*) + MODLIST="$MODLIST case_filter_in" + if test "case_filter_in" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES case_filter_in" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},case_filter_in" + fi + ;; + esac + + + if test -z ""; then + objects="mod_case_filter_in.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_case_filter_in.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_example_ipc... " >&6; } + # Check whether --enable-example-ipc was given. +if test ${enable_example_ipc+y} +then : + enableval=$enable_example_ipc; force_example_ipc=$enableval +else case e in #( + e) enable_example_ipc=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_example_ipc" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_example_ipc" = "static" -o "$enable_example_ipc" = "shared"; then + : + elif test "$enable_example_ipc" = "yes"; then + enable_example_ipc=$module_default + elif test "$enable_example_ipc" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_example_ipc=$module_default + else + enable_example_ipc=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_example_ipc" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_example_ipc=$module_default + else + enable_example_ipc=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_example_ipc" = "all" -o "$enable_example_ipc" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_example_ipc=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_example_ipc=no + fi + elif test "$enable_example_ipc" = "reallyall" -o "$enable_example_ipc" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_example_ipc" != "no" ; then + enable_example_ipc=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_example_ipc=no + fi + else + enable_example_ipc=no + fi + if test "$enable_example_ipc" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_example_ipc$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_example_ipc$_apmod_extra_msg" >&6; } + if test "$enable_example_ipc" != "no"; then + case "$enable_example_ipc" in + static*) + MODLIST="$MODLIST example_ipc" + if test "example_ipc" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES example_ipc" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},example_ipc" + fi + ;; + esac + + + if test -z ""; then + objects="mod_example_ipc.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_example_ipc.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + current_dir=experimental + modpath_current=modules/experimental + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d experimental || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + echo "DISTCLEAN_TARGETS = modules.mk" >> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + + current_dir=filters + modpath_current=modules/filters + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d filters || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_buffer" >&5 +printf %s "checking whether to enable mod_buffer... " >&6; } + # Check whether --enable-buffer was given. +if test ${enable_buffer+y} +then : + enableval=$enable_buffer; force_buffer=$enableval +else case e in #( + e) enable_buffer=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_buffer" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_buffer" = "static" -o "$enable_buffer" = "shared"; then + : + elif test "$enable_buffer" = "yes"; then + enable_buffer=$module_default + elif test "$enable_buffer" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_buffer=$module_default + else + enable_buffer=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_buffer" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_buffer=$module_default + else + enable_buffer=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_buffer" = "all" -o "$enable_buffer" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_buffer=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_buffer=no + fi + elif test "$enable_buffer" = "reallyall" -o "$enable_buffer" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_buffer" != "no" ; then + enable_buffer=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_buffer=no + fi + else + enable_buffer=no + fi + if test "$enable_buffer" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_buffer$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_buffer$_apmod_extra_msg" >&6; } + if test "$enable_buffer" != "no"; then + case "$enable_buffer" in + static*) + MODLIST="$MODLIST buffer" + if test "buffer" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES buffer" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},buffer" + fi + ;; + esac + + + if test -z ""; then + objects="mod_buffer.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_buffer.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_data... " >&6; } + # Check whether --enable-data was given. +if test ${enable_data+y} +then : + enableval=$enable_data; force_data=$enableval +else case e in #( + e) enable_data=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_data" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_data" = "static" -o "$enable_data" = "shared"; then + : + elif test "$enable_data" = "yes"; then + enable_data=$module_default + elif test "$enable_data" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_data=$module_default + else + enable_data=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_data" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_data=$module_default + else + enable_data=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_data" = "all" -o "$enable_data" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_data=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_data=no + fi + elif test "$enable_data" = "reallyall" -o "$enable_data" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_data" != "no" ; then + enable_data=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_data=no + fi + else + enable_data=no + fi + if test "$enable_data" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_data$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_data$_apmod_extra_msg" >&6; } + if test "$enable_data" != "no"; then + case "$enable_data" in + static*) + MODLIST="$MODLIST data" + if test "data" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES data" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},data" + fi + ;; + esac + + + if test -z ""; then + objects="mod_data.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_data.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_ratelimit... " >&6; } + # Check whether --enable-ratelimit was given. +if test ${enable_ratelimit+y} +then : + enableval=$enable_ratelimit; force_ratelimit=$enableval +else case e in #( + e) enable_ratelimit=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_ratelimit" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_ratelimit" = "static" -o "$enable_ratelimit" = "shared"; then + : + elif test "$enable_ratelimit" = "yes"; then + enable_ratelimit=$module_default + elif test "$enable_ratelimit" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_ratelimit=$module_default + else + enable_ratelimit=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ratelimit" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_ratelimit=$module_default + else + enable_ratelimit=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ratelimit" = "all" -o "$enable_ratelimit" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_ratelimit=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_ratelimit=no + fi + elif test "$enable_ratelimit" = "reallyall" -o "$enable_ratelimit" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_ratelimit" != "no" ; then + enable_ratelimit=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_ratelimit=no + fi + else + enable_ratelimit=no + fi + if test "$enable_ratelimit" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_ratelimit$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_ratelimit$_apmod_extra_msg" >&6; } + if test "$enable_ratelimit" != "no"; then + case "$enable_ratelimit" in + static*) + MODLIST="$MODLIST ratelimit" + if test "ratelimit" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES ratelimit" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},ratelimit" + fi + ;; + esac + + + if test -z ""; then + objects="mod_ratelimit.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_ratelimit.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_reqtimeout... " >&6; } + # Check whether --enable-reqtimeout was given. +if test ${enable_reqtimeout+y} +then : + enableval=$enable_reqtimeout; force_reqtimeout=$enableval +else case e in #( + e) enable_reqtimeout=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_reqtimeout" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_reqtimeout" = "static" -o "$enable_reqtimeout" = "shared"; then + : + elif test "$enable_reqtimeout" = "yes"; then + enable_reqtimeout=$module_default + elif test "$enable_reqtimeout" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_reqtimeout=$module_default + else + enable_reqtimeout=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_reqtimeout" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_reqtimeout=$module_default + else + enable_reqtimeout=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_reqtimeout" = "all" -o "$enable_reqtimeout" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_reqtimeout=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_reqtimeout=no + fi + elif test "$enable_reqtimeout" = "reallyall" -o "$enable_reqtimeout" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_reqtimeout" != "no" ; then + enable_reqtimeout=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_reqtimeout=no + fi + else + enable_reqtimeout=no + fi + if test "$enable_reqtimeout" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_reqtimeout$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_reqtimeout$_apmod_extra_msg" >&6; } + if test "$enable_reqtimeout" != "no"; then + case "$enable_reqtimeout" in + static*) + MODLIST="$MODLIST reqtimeout" + if test "reqtimeout" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES reqtimeout" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},reqtimeout" + fi + ;; + esac + + + if test -z ""; then + objects="mod_reqtimeout.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_reqtimeout.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_ext_filter... " >&6; } + # Check whether --enable-ext-filter was given. +if test ${enable_ext_filter+y} +then : + enableval=$enable_ext_filter; force_ext_filter=$enableval +else case e in #( + e) enable_ext_filter=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_ext_filter" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_ext_filter" = "static" -o "$enable_ext_filter" = "shared"; then + : + elif test "$enable_ext_filter" = "yes"; then + enable_ext_filter=$module_default + elif test "$enable_ext_filter" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_ext_filter=$module_default + else + enable_ext_filter=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ext_filter" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_ext_filter=$module_default + else + enable_ext_filter=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ext_filter" = "all" -o "$enable_ext_filter" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_ext_filter=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_ext_filter=no + fi + elif test "$enable_ext_filter" = "reallyall" -o "$enable_ext_filter" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_ext_filter" != "no" ; then + enable_ext_filter=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_ext_filter=no + fi + else + enable_ext_filter=no + fi + if test "$enable_ext_filter" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_ext_filter$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_ext_filter$_apmod_extra_msg" >&6; } + if test "$enable_ext_filter" != "no"; then + case "$enable_ext_filter" in + static*) + MODLIST="$MODLIST ext_filter" + if test "ext_filter" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES ext_filter" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},ext_filter" + fi + ;; + esac + + + if test -z ""; then + objects="mod_ext_filter.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_ext_filter.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_request... " >&6; } + # Check whether --enable-request was given. +if test ${enable_request+y} +then : + enableval=$enable_request; force_request=$enableval +else case e in #( + e) enable_request=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_request" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_request" = "static" -o "$enable_request" = "shared"; then + : + elif test "$enable_request" = "yes"; then + enable_request=$module_default + elif test "$enable_request" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_request=$module_default + else + enable_request=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_request" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_request=$module_default + else + enable_request=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_request" = "all" -o "$enable_request" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_request=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_request=no + fi + elif test "$enable_request" = "reallyall" -o "$enable_request" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_request" != "no" ; then + enable_request=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_request=no + fi + else + enable_request=no + fi + if test "$enable_request" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_request$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_request$_apmod_extra_msg" >&6; } + if test "$enable_request" != "no"; then + case "$enable_request" in + static*) + MODLIST="$MODLIST request" + if test "request" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES request" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},request" + fi + ;; + esac + + + if test -z ""; then + objects="mod_request.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_request.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_include... " >&6; } + # Check whether --enable-include was given. +if test ${enable_include+y} +then : + enableval=$enable_include; force_include=$enableval +else case e in #( + e) enable_include=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_include" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_include" = "static" -o "$enable_include" = "shared"; then + : + elif test "$enable_include" = "yes"; then + enable_include=$module_default + elif test "$enable_include" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_include=$module_default + else + enable_include=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_include" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_include=$module_default + else + enable_include=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_include" = "all" -o "$enable_include" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_include=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_include=no + fi + elif test "$enable_include" = "reallyall" -o "$enable_include" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_include" != "no" ; then + enable_include=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_include=no + fi + else + enable_include=no + fi + if test "$enable_include" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_include$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_include$_apmod_extra_msg" >&6; } + if test "$enable_include" != "no"; then + case "$enable_include" in + static*) + MODLIST="$MODLIST include" + if test "include" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES include" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},include" + fi + ;; + esac + + + if test -z ""; then + objects="mod_include.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_include.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_filter... " >&6; } + # Check whether --enable-filter was given. +if test ${enable_filter+y} +then : + enableval=$enable_filter; force_filter=$enableval +else case e in #( + e) enable_filter=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_filter" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_filter" = "static" -o "$enable_filter" = "shared"; then + : + elif test "$enable_filter" = "yes"; then + enable_filter=$module_default + elif test "$enable_filter" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_filter=$module_default + else + enable_filter=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_filter" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_filter=$module_default + else + enable_filter=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_filter" = "all" -o "$enable_filter" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_filter=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_filter=no + fi + elif test "$enable_filter" = "reallyall" -o "$enable_filter" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_filter" != "no" ; then + enable_filter=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_filter=no + fi + else + enable_filter=no + fi + if test "$enable_filter" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_filter$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_filter$_apmod_extra_msg" >&6; } + if test "$enable_filter" != "no"; then + case "$enable_filter" in + static*) + MODLIST="$MODLIST filter" + if test "filter" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES filter" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},filter" + fi + ;; + esac + + + if test -z ""; then + objects="mod_filter.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_filter.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_reflector... " >&6; } + # Check whether --enable-reflector was given. +if test ${enable_reflector+y} +then : + enableval=$enable_reflector; force_reflector=$enableval +else case e in #( + e) enable_reflector=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_reflector" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_reflector" = "static" -o "$enable_reflector" = "shared"; then + : + elif test "$enable_reflector" = "yes"; then + enable_reflector=$module_default + elif test "$enable_reflector" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_reflector=$module_default + else + enable_reflector=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_reflector" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_reflector=$module_default + else + enable_reflector=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_reflector" = "all" -o "$enable_reflector" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_reflector=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_reflector=no + fi + elif test "$enable_reflector" = "reallyall" -o "$enable_reflector" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_reflector" != "no" ; then + enable_reflector=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_reflector=no + fi + else + enable_reflector=no + fi + if test "$enable_reflector" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_reflector$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_reflector$_apmod_extra_msg" >&6; } + if test "$enable_reflector" != "no"; then + case "$enable_reflector" in + static*) + MODLIST="$MODLIST reflector" + if test "reflector" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES reflector" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},reflector" + fi + ;; + esac + + + if test -z ""; then + objects="mod_reflector.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_reflector.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_substitute... " >&6; } + # Check whether --enable-substitute was given. +if test ${enable_substitute+y} +then : + enableval=$enable_substitute; force_substitute=$enableval +else case e in #( + e) enable_substitute=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_substitute" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_substitute" = "static" -o "$enable_substitute" = "shared"; then + : + elif test "$enable_substitute" = "yes"; then + enable_substitute=$module_default + elif test "$enable_substitute" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_substitute=$module_default + else + enable_substitute=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_substitute" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_substitute=$module_default + else + enable_substitute=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_substitute" = "all" -o "$enable_substitute" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_substitute=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_substitute=no + fi + elif test "$enable_substitute" = "reallyall" -o "$enable_substitute" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_substitute" != "no" ; then + enable_substitute=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_substitute=no + fi + else + enable_substitute=no + fi + if test "$enable_substitute" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_substitute$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_substitute$_apmod_extra_msg" >&6; } + if test "$enable_substitute" != "no"; then + case "$enable_substitute" in + static*) + MODLIST="$MODLIST substitute" + if test "substitute" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES substitute" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},substitute" + fi + ;; + esac + + + if test -z ""; then + objects="mod_substitute.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_substitute.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_sed... " >&6; } + # Check whether --enable-sed was given. +if test ${enable_sed+y} +then : + enableval=$enable_sed; force_sed=$enableval +else case e in #( + e) enable_sed=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_sed" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_sed" = "static" -o "$enable_sed" = "shared"; then + : + elif test "$enable_sed" = "yes"; then + enable_sed=$module_default + elif test "$enable_sed" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_sed=$module_default + else + enable_sed=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_sed" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_sed=$module_default + else + enable_sed=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_sed" = "all" -o "$enable_sed" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_sed=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_sed=no + fi + elif test "$enable_sed" = "reallyall" -o "$enable_sed" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_sed" != "no" ; then + enable_sed=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_sed=no + fi + else + enable_sed=no + fi + if test "$enable_sed" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + if test "x$enable_sed" = "xshared"; then + # The only symbol which needs to be exported is the module + # structure, so ask libtool to hide libsed internals: + + if test "x$MOD_SED_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_SED_LDADD to \"-export-symbols-regex sed_module\"" + MOD_SED_LDADD="-export-symbols-regex sed_module" + else + apr_addto_bugger="-export-symbols-regex sed_module" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_SED_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_SED_LDADD" + MOD_SED_LDADD="$MOD_SED_LDADD $i" + fi + done + fi + + fi + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_sed" >&5 +printf %s "checking whether to enable mod_sed... " >&6; } + if test "$enable_sed" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_sed has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_sed$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_sed$_apmod_extra_msg" >&6; } + if test "$enable_sed" != "no"; then + case "$enable_sed" in + static*) + MODLIST="$MODLIST sed" + if test "sed" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES sed" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},sed" + fi + ;; + esac + + + if test -z "$sed_obj"; then + objects="mod_sed.lo" + else + objects="$sed_obj" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_sed.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_charset_lite... " >&6; } + # Check whether --enable-charset-lite was given. +if test ${enable_charset_lite+y} +then : + enableval=$enable_charset_lite; force_charset_lite=$enableval +else case e in #( + e) enable_charset_lite=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_charset_lite" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_charset_lite" = "static" -o "$enable_charset_lite" = "shared"; then + : + elif test "$enable_charset_lite" = "yes"; then + enable_charset_lite=$module_default + elif test "$enable_charset_lite" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_charset_lite=$module_default + else + enable_charset_lite=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_charset_lite" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_charset_lite=$module_default + else + enable_charset_lite=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_charset_lite" = "all" -o "$enable_charset_lite" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_charset_lite=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_charset_lite=no + fi + elif test "$enable_charset_lite" = "reallyall" -o "$enable_charset_lite" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_charset_lite" != "no" ; then + enable_charset_lite=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_charset_lite=no + fi + else + enable_charset_lite=no + fi + if test "$enable_charset_lite" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_charset_lite$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_charset_lite$_apmod_extra_msg" >&6; } + if test "$enable_charset_lite" != "no"; then + case "$enable_charset_lite" in + static*) + MODLIST="$MODLIST charset_lite" + if test "charset_lite" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES charset_lite" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},charset_lite" + fi + ;; + esac + + + if test -z ""; then + objects="mod_charset_lite.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_charset_lite.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_charset_lite... " >&6; } + # Check whether --enable-charset-lite was given. +if test ${enable_charset_lite+y} +then : + enableval=$enable_charset_lite; force_charset_lite=$enableval +else case e in #( + e) enable_charset_lite=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_charset_lite" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_charset_lite" = "static" -o "$enable_charset_lite" = "shared"; then + : + elif test "$enable_charset_lite" = "yes"; then + enable_charset_lite=$module_default + elif test "$enable_charset_lite" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_charset_lite=$module_default + else + enable_charset_lite=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_charset_lite" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_charset_lite=$module_default + else + enable_charset_lite=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_charset_lite" = "all" -o "$enable_charset_lite" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_charset_lite=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_charset_lite=no + fi + elif test "$enable_charset_lite" = "reallyall" -o "$enable_charset_lite" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_charset_lite" != "no" ; then + enable_charset_lite=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_charset_lite=no + fi + else + enable_charset_lite=no + fi + if test "$enable_charset_lite" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_charset_lite$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_charset_lite$_apmod_extra_msg" >&6; } + if test "$enable_charset_lite" != "no"; then + case "$enable_charset_lite" in + static*) + MODLIST="$MODLIST charset_lite" + if test "charset_lite" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES charset_lite" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},charset_lite" + fi + ;; + esac + + + if test -z ""; then + objects="mod_charset_lite.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_charset_lite.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_deflate... " >&6; } + # Check whether --enable-deflate was given. +if test ${enable_deflate+y} +then : + enableval=$enable_deflate; force_deflate=$enableval +else case e in #( + e) enable_deflate=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_deflate" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_deflate" = "static" -o "$enable_deflate" = "shared"; then + : + elif test "$enable_deflate" = "yes"; then + enable_deflate=$module_default + elif test "$enable_deflate" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_deflate=$module_default + else + enable_deflate=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_deflate" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_deflate=$module_default + else + enable_deflate=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_deflate" = "all" -o "$enable_deflate" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_deflate=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_deflate=no + fi + elif test "$enable_deflate" = "reallyall" -o "$enable_deflate" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_deflate" != "no" ; then + enable_deflate=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_deflate=no + fi + else + enable_deflate=no + fi + if test "$enable_deflate" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + +# Check whether --with-z was given. +if test ${with_z+y} +then : + withval=$with_z; + if test "x$withval" != "xyes" && test "x$withval" != "x"; then + ap_zlib_base="$withval" + ap_zlib_with="yes" + fi + +fi + + if test "x$ap_zlib_base" = "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for zlib location" >&5 +printf %s "checking for zlib location... " >&6; } + if test ${ap_cv_zlib+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + for dir in /usr/local /usr ; do + if test -d $dir && test -f $dir/include/zlib.h; then + ap_cv_zlib=$dir + break + fi + done + ;; +esac +fi + + ap_zlib_base=$ap_cv_zlib + if test "x$ap_zlib_base" = "x"; then + enable_deflate=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +printf "%s\n" "not found" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_zlib_base" >&5 +printf "%s\n" "$ap_zlib_base" >&6; } + fi + fi + if test "$enable_deflate" != "no"; then + ap_save_includes=$INCLUDES + ap_save_ldflags=$LDFLAGS + ap_save_cppflags=$CPPFLAGS + ap_zlib_ldflags="" + if test "$ap_zlib_base" != "/usr"; then + + if test "x$INCLUDES" = "x"; then + test "x$silent" != "xyes" && echo " setting INCLUDES to \"-I${ap_zlib_base}/include\"" + INCLUDES="-I${ap_zlib_base}/include" + else + apr_addto_bugger="-I${ap_zlib_base}/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $INCLUDES; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + + + if test "x$MOD_INCLUDES" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_INCLUDES to \"-I${ap_zlib_base}/include\"" + MOD_INCLUDES="-I${ap_zlib_base}/include" + else + apr_addto_bugger="-I${ap_zlib_base}/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_INCLUDES; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_INCLUDES" + MOD_INCLUDES="$MOD_INCLUDES $i" + fi + done + fi + + CPPFLAGS="$CPPFLAGS $INCLUDES" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"-L${ap_zlib_base}/lib\"" + LDFLAGS="-L${ap_zlib_base}/lib" + else + apr_addto_bugger="-L${ap_zlib_base}/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$ap_zlib_ldflags" = "x"; then + test "x$silent" != "xyes" && echo " setting ap_zlib_ldflags to \"-L${ap_zlib_base}/lib\"" + ap_zlib_ldflags="-L${ap_zlib_base}/lib" + else + apr_addto_bugger="-L${ap_zlib_base}/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $ap_zlib_ldflags; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to ap_zlib_ldflags" + ap_zlib_ldflags="$ap_zlib_ldflags $i" + fi + done + fi + + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$ap_platform_runtime_link_flag${ap_zlib_base}/lib\"" + LDFLAGS="$ap_platform_runtime_link_flag${ap_zlib_base}/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${ap_zlib_base}/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$ap_zlib_ldflags" = "x"; then + test "x$silent" != "xyes" && echo " setting ap_zlib_ldflags to \"$ap_platform_runtime_link_flag${ap_zlib_base}/lib\"" + ap_zlib_ldflags="$ap_platform_runtime_link_flag${ap_zlib_base}/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${ap_zlib_base}/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $ap_zlib_ldflags; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to ap_zlib_ldflags" + ap_zlib_ldflags="$ap_zlib_ldflags $i" + fi + done + fi + + fi + fi + + if test "x$LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LIBS to \"-lz\"" + LIBS="-lz" + else + apr_addto_bugger="-lz" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for zlib library" >&5 +printf %s "checking for zlib library... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +int i = Z_OK; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: found" >&5 +printf "%s\n" "found" >&6; } + + if test "x$MOD_DEFLATE_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_DEFLATE_LDADD to \"$ap_zlib_ldflags -lz\"" + MOD_DEFLATE_LDADD="$ap_zlib_ldflags -lz" + else + apr_addto_bugger="$ap_zlib_ldflags -lz" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_DEFLATE_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_DEFLATE_LDADD" + MOD_DEFLATE_LDADD="$MOD_DEFLATE_LDADD $i" + fi + done + fi + +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +printf "%s\n" "not found" >&6; } + enable_deflate=no + if test "x$ap_zlib_with" = "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ... Error, zlib was missing or unusable" >&5 +printf "%s\n" "$as_me: WARNING: ... Error, zlib was missing or unusable" >&2;} + else + as_fn_error $? "... Error, zlib was missing or unusable" "$LINENO" 5 + fi + ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + INCLUDES=$ap_save_includes + LDFLAGS=$ap_save_ldflags + CPPFLAGS=$ap_save_cppflags + + if test "x$LIBS" = "x-lz"; then + test "x$silent" != "xyes" && echo " nulling LIBS" + LIBS="" + else + apr_new_bugger="" + apr_removed=0 + for i in $LIBS; do + if test "x$i" != "x-lz"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + test "x$silent" != "xyes" && echo " removed \"-lz\" from LIBS" + LIBS=$apr_new_bugger + fi + fi + + fi + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_deflate" >&5 +printf %s "checking whether to enable mod_deflate... " >&6; } + if test "$enable_deflate" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_deflate has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_deflate$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_deflate$_apmod_extra_msg" >&6; } + if test "$enable_deflate" != "no"; then + case "$enable_deflate" in + static*) + MODLIST="$MODLIST deflate" + if test "deflate" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES deflate" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},deflate" + fi + ;; + esac + + + if test -z ""; then + objects="mod_deflate.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_deflate.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_xml2enc... " >&6; } + # Check whether --enable-xml2enc was given. +if test ${enable_xml2enc+y} +then : + enableval=$enable_xml2enc; force_xml2enc=$enableval +else case e in #( + e) enable_xml2enc=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_xml2enc" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_xml2enc" = "static" -o "$enable_xml2enc" = "shared"; then + : + elif test "$enable_xml2enc" = "yes"; then + enable_xml2enc=$module_default + elif test "$enable_xml2enc" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_xml2enc=$module_default + else + enable_xml2enc=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_xml2enc" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_xml2enc=$module_default + else + enable_xml2enc=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_xml2enc" = "all" -o "$enable_xml2enc" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_xml2enc=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_xml2enc=no + fi + elif test "$enable_xml2enc" = "reallyall" -o "$enable_xml2enc" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_xml2enc" != "no" ; then + enable_xml2enc=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_xml2enc=no + fi + else + enable_xml2enc=no + fi + if test "$enable_xml2enc" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libxml2" >&5 +printf %s "checking for libxml2... " >&6; } +if test ${ac_cv_libxml2+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + +# Check whether --with-libxml2 was given. +if test ${with_libxml2+y} +then : + withval=$with_libxml2; test_paths="${with_libxml2}/include/libxml2 ${with_libxml2}/include ${with_libxml2}" +else case e in #( + e) test_paths="/usr/include/libxml2 /usr/local/include/libxml2 /usr/include /usr/local/include" + ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libxml2" >&5 +printf %s "checking for libxml2... " >&6; } + xml2_path="" + for x in ${test_paths}; do + if test -f "${x}/libxml/parser.h"; then + xml2_path="${x}" + break + fi + done + if test -n "${xml2_path}" ; then + ac_cv_libxml2=yes + XML2_INCLUDES="${xml2_path}" + else + ac_cv_libxml2=no + fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libxml2" >&5 +printf "%s\n" "$ac_cv_libxml2" >&6; } + + if test "$ac_cv_libxml2" = "yes" ; then + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"-I${XML2_INCLUDES}\"" + MOD_CFLAGS="-I${XML2_INCLUDES}" + else + apr_addto_bugger="-I${XML2_INCLUDES}" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + + if test "x$MOD_XML2ENC_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_XML2ENC_LDADD to \"-lxml2\"" + MOD_XML2ENC_LDADD="-lxml2" + else + apr_addto_bugger="-lxml2" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_XML2ENC_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_XML2ENC_LDADD" + MOD_XML2ENC_LDADD="$MOD_XML2ENC_LDADD $i" + fi + done + fi + + else + enable_xml2enc=no + fi + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_xml2enc" >&5 +printf %s "checking whether to enable mod_xml2enc... " >&6; } + if test "$enable_xml2enc" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_xml2enc has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_xml2enc$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_xml2enc$_apmod_extra_msg" >&6; } + if test "$enable_xml2enc" != "no"; then + case "$enable_xml2enc" in + static*) + MODLIST="$MODLIST xml2enc" + if test "xml2enc" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES xml2enc" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},xml2enc" + fi + ;; + esac + + + if test -z ""; then + objects="mod_xml2enc.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_xml2enc.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_proxy_html... " >&6; } + # Check whether --enable-proxy-html was given. +if test ${enable_proxy_html+y} +then : + enableval=$enable_proxy_html; force_proxy_html=$enableval +else case e in #( + e) enable_proxy_html=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy_html" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy_html" = "static" -o "$enable_proxy_html" = "shared"; then + : + elif test "$enable_proxy_html" = "yes"; then + enable_proxy_html=$module_default + elif test "$enable_proxy_html" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_html=$module_default + else + enable_proxy_html=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_html" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy_html=$module_default + else + enable_proxy_html=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_html" = "all" -o "$enable_proxy_html" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_html=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_html=no + fi + elif test "$enable_proxy_html" = "reallyall" -o "$enable_proxy_html" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy_html" != "no" ; then + enable_proxy_html=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_html=no + fi + else + enable_proxy_html=no + fi + if test "$enable_proxy_html" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libxml2" >&5 +printf %s "checking for libxml2... " >&6; } +if test ${ac_cv_libxml2+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + +# Check whether --with-libxml2 was given. +if test ${with_libxml2+y} +then : + withval=$with_libxml2; test_paths="${with_libxml2}/include/libxml2 ${with_libxml2}/include ${with_libxml2}" +else case e in #( + e) test_paths="/usr/include/libxml2 /usr/local/include/libxml2 /usr/include /usr/local/include" + ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libxml2" >&5 +printf %s "checking for libxml2... " >&6; } + xml2_path="" + for x in ${test_paths}; do + if test -f "${x}/libxml/parser.h"; then + xml2_path="${x}" + break + fi + done + if test -n "${xml2_path}" ; then + ac_cv_libxml2=yes + XML2_INCLUDES="${xml2_path}" + else + ac_cv_libxml2=no + fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libxml2" >&5 +printf "%s\n" "$ac_cv_libxml2" >&6; } + + if test "$ac_cv_libxml2" = "yes" ; then + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"-I${XML2_INCLUDES}\"" + MOD_CFLAGS="-I${XML2_INCLUDES}" + else + apr_addto_bugger="-I${XML2_INCLUDES}" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + + if test "x$MOD_PROXY_HTML_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_PROXY_HTML_LDADD to \"-lxml2\"" + MOD_PROXY_HTML_LDADD="-lxml2" + else + apr_addto_bugger="-lxml2" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_PROXY_HTML_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_PROXY_HTML_LDADD" + MOD_PROXY_HTML_LDADD="$MOD_PROXY_HTML_LDADD $i" + fi + done + fi + + else + enable_proxy_html=no + fi + + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_html" >&5 +printf %s "checking whether to enable mod_proxy_html... " >&6; } + if test "$enable_proxy_html" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_proxy_html has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy_html$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy_html$_apmod_extra_msg" >&6; } + if test "$enable_proxy_html" != "no"; then + case "$enable_proxy_html" in + static*) + MODLIST="$MODLIST proxy_html" + if test "proxy_html" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_html" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy_html" + fi + ;; + esac + + + if test -z ""; then + objects="mod_proxy_html.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy_html.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_brotli... " >&6; } + # Check whether --enable-brotli was given. +if test ${enable_brotli+y} +then : + enableval=$enable_brotli; force_brotli=$enableval +else case e in #( + e) enable_brotli=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_brotli" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_brotli" = "static" -o "$enable_brotli" = "shared"; then + : + elif test "$enable_brotli" = "yes"; then + enable_brotli=$module_default + elif test "$enable_brotli" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_brotli=$module_default + else + enable_brotli=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_brotli" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_brotli=$module_default + else + enable_brotli=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_brotli" = "all" -o "$enable_brotli" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_brotli=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_brotli=no + fi + elif test "$enable_brotli" = "reallyall" -o "$enable_brotli" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_brotli" != "no" ; then + enable_brotli=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_brotli=no + fi + else + enable_brotli=no + fi + if test "$enable_brotli" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + +# Check whether --with-brotli was given. +if test ${with_brotli+y} +then : + withval=$with_brotli; + if test "$withval" != "yes" -a "x$withval" != "x"; then + ap_brotli_base="$withval" + ap_brotli_with=yes + fi + +fi + + ap_brotli_found=no + if test -n "$ap_brotli_base"; then + ap_save_cppflags=$CPPFLAGS + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"-I${ap_brotli_base}/include\"" + CPPFLAGS="-I${ap_brotli_base}/include" + else + apr_addto_bugger="-I${ap_brotli_base}/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Brotli library >= 0.6.0 via prefix" >&5 +printf %s "checking for Brotli library >= 0.6.0 via prefix... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + +const uint8_t *o = BrotliEncoderTakeOutput((BrotliEncoderState*)0, (size_t*)0); +if (o) return *o; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ap_brotli_found=yes + ap_brotli_cflags="-I${ap_brotli_base}/include" + ap_brotli_libs="-L${ap_brotli_base}/lib -lbrotlienc -lbrotlicommon" +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CPPFLAGS=$ap_save_cppflags + else + if test -n "$PKGCONFIG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Brotli library >= 0.6.0 via pkg-config" >&5 +printf %s "checking for Brotli library >= 0.6.0 via pkg-config... " >&6; } + if $PKGCONFIG --exists "libbrotlienc >= 0.6.0"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ap_brotli_found=yes + ap_brotli_cflags=`$PKGCONFIG libbrotlienc --cflags` + ap_brotli_libs=`$PKGCONFIG libbrotlienc --libs` + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + fi + fi + if test "$ap_brotli_found" = "yes"; then + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"$ap_brotli_cflags\"" + MOD_CFLAGS="$ap_brotli_cflags" + else + apr_addto_bugger="$ap_brotli_cflags" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + + if test "x$MOD_BROTLI_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_BROTLI_LDADD to \"$ap_brotli_libs\"" + MOD_BROTLI_LDADD="$ap_brotli_libs" + else + apr_addto_bugger="$ap_brotli_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_BROTLI_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_BROTLI_LDADD" + MOD_BROTLI_LDADD="$MOD_BROTLI_LDADD $i" + fi + done + fi + + if test "$enable_brotli" = "shared"; then + + if test "x$MOD_BROTLI_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_BROTLI_LDADD to \"-export-symbols-regex brotli_module\"" + MOD_BROTLI_LDADD="-export-symbols-regex brotli_module" + else + apr_addto_bugger="-export-symbols-regex brotli_module" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_BROTLI_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_BROTLI_LDADD" + MOD_BROTLI_LDADD="$MOD_BROTLI_LDADD $i" + fi + done + fi + + fi + else + enable_brotli=no + if test "$ap_brotli_with" = "yes"; then + as_fn_error $? "Brotli library was missing or unusable" "$LINENO" 5 + fi + fi + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_brotli" >&5 +printf %s "checking whether to enable mod_brotli... " >&6; } + if test "$enable_brotli" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_brotli has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_brotli$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_brotli$_apmod_extra_msg" >&6; } + if test "$enable_brotli" != "no"; then + case "$enable_brotli" in + static*) + MODLIST="$MODLIST brotli" + if test "brotli" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES brotli" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},brotli" + fi + ;; + esac + + + if test -z ""; then + objects="mod_brotli.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_brotli.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + current_dir=http + modpath_current=modules/http + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d http || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +http_objects="http_core.lo http_protocol.lo http_request.lo http_filters.lo chunk_filter.lo byterange_filter.lo http_etag.lo" + +if test "$enable_http" = "yes"; then + enable_http="static" +elif test "$enable_http" = "shared"; then + as_fn_error $? "mod_http can not be built as a shared DSO" "$LINENO" 5 +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_http" >&5 +printf %s "checking whether to enable mod_http... " >&6; } + # Check whether --enable-http was given. +if test ${enable_http+y} +then : + enableval=$enable_http; force_http=$enableval +else case e in #( + e) enable_http=static ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_http" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_http" = "static" -o "$enable_http" = "shared"; then + : + elif test "$enable_http" = "yes"; then + enable_http=$module_default + elif test "$enable_http" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_http=$module_default + else + enable_http=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_http" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_http=$module_default + else + enable_http=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_http" = "all" -o "$enable_http" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_http=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_http=no + fi + elif test "$enable_http" = "reallyall" -o "$enable_http" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_http" != "no" ; then + enable_http=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_http=no + fi + else + enable_http=no + fi + if test "$enable_http" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_http$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_http$_apmod_extra_msg" >&6; } + if test "$enable_http" != "no"; then + case "$enable_http" in + static*) + MODLIST="$MODLIST http" + if test "http" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES http" + if test "static" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},http" + fi + ;; + esac + + + if test -z "$http_objects"; then + objects="mod_http.lo" + else + objects="$http_objects" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_http.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_mime... " >&6; } + # Check whether --enable-mime was given. +if test ${enable_mime+y} +then : + enableval=$enable_mime; force_mime=$enableval +else case e in #( + e) enable_mime=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_mime" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_mime" = "static" -o "$enable_mime" = "shared"; then + : + elif test "$enable_mime" = "yes"; then + enable_mime=$module_default + elif test "$enable_mime" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_mime=$module_default + else + enable_mime=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_mime" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_mime=$module_default + else + enable_mime=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_mime" = "all" -o "$enable_mime" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_mime=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_mime=no + fi + elif test "$enable_mime" = "reallyall" -o "$enable_mime" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_mime" != "no" ; then + enable_mime=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_mime=no + fi + else + enable_mime=no + fi + if test "$enable_mime" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_mime$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_mime$_apmod_extra_msg" >&6; } + if test "$enable_mime" != "no"; then + case "$enable_mime" in + static*) + MODLIST="$MODLIST mime" + if test "mime" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES mime" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},mime" + fi + ;; + esac + + + if test -z ""; then + objects="mod_mime.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_mime.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + + current_dir=ldap + modpath_current=modules/ldap + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d ldap || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +ldap_objects="util_ldap.lo util_ldap_cache.lo util_ldap_cache_mgr.lo" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_ldap" >&5 +printf %s "checking whether to enable mod_ldap... " >&6; } + # Check whether --enable-ldap was given. +if test ${enable_ldap+y} +then : + enableval=$enable_ldap; force_ldap=$enableval +else case e in #( + e) enable_ldap=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_ldap" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_ldap" = "static" -o "$enable_ldap" = "shared"; then + : + elif test "$enable_ldap" = "yes"; then + enable_ldap=$module_default + elif test "$enable_ldap" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_ldap=$module_default + else + enable_ldap=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ldap" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_ldap=$module_default + else + enable_ldap=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ldap" = "all" -o "$enable_ldap" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_ldap=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_ldap=no + fi + elif test "$enable_ldap" = "reallyall" -o "$enable_ldap" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_ldap" != "no" ; then + enable_ldap=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_ldap=no + fi + else + enable_ldap=no + fi + if test "$enable_ldap" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ldap support in apr/apr-util" >&5 +printf %s "checking for ldap support in apr/apr-util... " >&6; } +if test ${ac_cv_APR_HAS_LDAP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + apache_old_cppflags="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCLUDES" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if APR_HAS_LDAP +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP_TRADITIONAL "YES_IS_DEFINED" >/dev/null 2>&1 +then : + ac_cv_APR_HAS_LDAP=yes +else case e in #( + e) ac_cv_APR_HAS_LDAP=no ;; +esac +fi +rm -rf conftest* + + CPPFLAGS="$apache_old_cppflags" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_APR_HAS_LDAP" >&5 +printf "%s\n" "$ac_cv_APR_HAS_LDAP" >&6; } + + if test "$ac_cv_APR_HAS_LDAP" = "yes" ; then + if test -z "$apu_config" ; then + LDAP_LIBS="`$apr_config --ldap-libs`" + else + LDAP_LIBS="`$apu_config --ldap-libs`" + fi + + if test "x$MOD_LDAP_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDAP_LDADD to \"$LDAP_LIBS\"" + MOD_LDAP_LDADD="$LDAP_LIBS" + else + apr_addto_bugger="$LDAP_LIBS" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDAP_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDAP_LDADD" + MOD_LDAP_LDADD="$MOD_LDAP_LDADD $i" + fi + done + fi + + + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: apr/apr-util is compiled without ldap support" >&5 +printf "%s\n" "$as_me: WARNING: apr/apr-util is compiled without ldap support" >&2;} + enable_ldap=no + fi + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_ldap" >&5 +printf %s "checking whether to enable mod_ldap... " >&6; } + if test "$enable_ldap" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_ldap has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_ldap$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_ldap$_apmod_extra_msg" >&6; } + if test "$enable_ldap" != "no"; then + case "$enable_ldap" in + static*) + MODLIST="$MODLIST ldap" + if test "ldap" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES ldap" + if test "most " = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},ldap" + fi + ;; + esac + + + if test -z "$ldap_objects"; then + objects="mod_ldap.lo" + else + objects="$ldap_objects" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_ldap.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + + current_dir=loggers + modpath_current=modules/loggers + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d loggers || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_log_config" >&5 +printf %s "checking whether to enable mod_log_config... " >&6; } + # Check whether --enable-log-config was given. +if test ${enable_log_config+y} +then : + enableval=$enable_log_config; force_log_config=$enableval +else case e in #( + e) enable_log_config=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_log_config" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_log_config" = "static" -o "$enable_log_config" = "shared"; then + : + elif test "$enable_log_config" = "yes"; then + enable_log_config=$module_default + elif test "$enable_log_config" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_log_config=$module_default + else + enable_log_config=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_log_config" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_log_config=$module_default + else + enable_log_config=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_log_config" = "all" -o "$enable_log_config" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_log_config=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_log_config=no + fi + elif test "$enable_log_config" = "reallyall" -o "$enable_log_config" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_log_config" != "no" ; then + enable_log_config=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_log_config=no + fi + else + enable_log_config=no + fi + if test "$enable_log_config" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_log_config$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_log_config$_apmod_extra_msg" >&6; } + if test "$enable_log_config" != "no"; then + case "$enable_log_config" in + static*) + MODLIST="$MODLIST log_config" + if test "log_config" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES log_config" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},log_config" + fi + ;; + esac + + + if test -z ""; then + objects="mod_log_config.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_log_config.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_log_debug... " >&6; } + # Check whether --enable-log-debug was given. +if test ${enable_log_debug+y} +then : + enableval=$enable_log_debug; force_log_debug=$enableval +else case e in #( + e) enable_log_debug=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_log_debug" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_log_debug" = "static" -o "$enable_log_debug" = "shared"; then + : + elif test "$enable_log_debug" = "yes"; then + enable_log_debug=$module_default + elif test "$enable_log_debug" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_log_debug=$module_default + else + enable_log_debug=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_log_debug" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_log_debug=$module_default + else + enable_log_debug=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_log_debug" = "all" -o "$enable_log_debug" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_log_debug=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_log_debug=no + fi + elif test "$enable_log_debug" = "reallyall" -o "$enable_log_debug" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_log_debug" != "no" ; then + enable_log_debug=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_log_debug=no + fi + else + enable_log_debug=no + fi + if test "$enable_log_debug" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_log_debug$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_log_debug$_apmod_extra_msg" >&6; } + if test "$enable_log_debug" != "no"; then + case "$enable_log_debug" in + static*) + MODLIST="$MODLIST log_debug" + if test "log_debug" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES log_debug" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},log_debug" + fi + ;; + esac + + + if test -z ""; then + objects="mod_log_debug.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_log_debug.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_log_forensic... " >&6; } + # Check whether --enable-log-forensic was given. +if test ${enable_log_forensic+y} +then : + enableval=$enable_log_forensic; force_log_forensic=$enableval +else case e in #( + e) enable_log_forensic=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_log_forensic" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_log_forensic" = "static" -o "$enable_log_forensic" = "shared"; then + : + elif test "$enable_log_forensic" = "yes"; then + enable_log_forensic=$module_default + elif test "$enable_log_forensic" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_log_forensic=$module_default + else + enable_log_forensic=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_log_forensic" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_log_forensic=$module_default + else + enable_log_forensic=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_log_forensic" = "all" -o "$enable_log_forensic" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_log_forensic=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_log_forensic=no + fi + elif test "$enable_log_forensic" = "reallyall" -o "$enable_log_forensic" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_log_forensic" != "no" ; then + enable_log_forensic=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_log_forensic=no + fi + else + enable_log_forensic=no + fi + if test "$enable_log_forensic" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_log_forensic$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_log_forensic$_apmod_extra_msg" >&6; } + if test "$enable_log_forensic" != "no"; then + case "$enable_log_forensic" in + static*) + MODLIST="$MODLIST log_forensic" + if test "log_forensic" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES log_forensic" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},log_forensic" + fi + ;; + esac + + + if test -z ""; then + objects="mod_log_forensic.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_log_forensic.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_logio... " >&6; } + # Check whether --enable-logio was given. +if test ${enable_logio+y} +then : + enableval=$enable_logio; force_logio=$enableval +else case e in #( + e) enable_logio=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_logio" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_logio" = "static" -o "$enable_logio" = "shared"; then + : + elif test "$enable_logio" = "yes"; then + enable_logio=$module_default + elif test "$enable_logio" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_logio=$module_default + else + enable_logio=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_logio" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_logio=$module_default + else + enable_logio=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_logio" = "all" -o "$enable_logio" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_logio=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_logio=no + fi + elif test "$enable_logio" = "reallyall" -o "$enable_logio" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_logio" != "no" ; then + enable_logio=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_logio=no + fi + else + enable_logio=no + fi + if test "$enable_logio" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_logio$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_logio$_apmod_extra_msg" >&6; } + if test "$enable_logio" != "no"; then + case "$enable_logio" in + static*) + MODLIST="$MODLIST logio" + if test "logio" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES logio" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},logio" + fi + ;; + esac + + + if test -z ""; then + objects="mod_logio.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_logio.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + current_dir=lua + modpath_current=modules/lua + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d lua || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + + + +lua_objects="lua_apr.lo lua_config.lo mod_lua.lo lua_request.lo lua_vmprep.lo lua_dbd.lo lua_passwd.lo" + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_lua" >&5 +printf %s "checking whether to enable mod_lua... " >&6; } + # Check whether --enable-lua was given. +if test ${enable_lua+y} +then : + enableval=$enable_lua; force_lua=$enableval +else case e in #( + e) enable_lua=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_lua" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_lua" = "static" -o "$enable_lua" = "shared"; then + : + elif test "$enable_lua" = "yes"; then + enable_lua=$module_default + elif test "$enable_lua" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_lua=$module_default + else + enable_lua=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_lua" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_lua=$module_default + else + enable_lua=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_lua" = "all" -o "$enable_lua" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_lua=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_lua=no + fi + elif test "$enable_lua" = "reallyall" -o "$enable_lua" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_lua" != "no" ; then + enable_lua=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_lua=no + fi + else + enable_lua=no + fi + if test "$enable_lua" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + + +# Check whether --with-lua was given. +if test ${with_lua+y} +then : + withval=$with_lua; lua_path="$withval" +else case e in #( + e) : ;; +esac +fi + + +if test -z "$lua_path"; then + test_paths=". /usr/local /usr" +else + test_paths="${lua_path}" +fi + +for pklua in lua lua5.4 lua5.3 lua5.2 lua5.1; do + if test -n "$PKGCONFIG" -a -z "$lua_path" \ + && $PKGCONFIG --atleast-version=5.1 $pklua; then + LUA_LIBS="`$PKGCONFIG --libs $pklua`" + LUA_CFLAGS="`$PKGCONFIG --cflags $pklua`" + LUA_VERSION="`$PKGCONFIG --modversion $pklua`" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: using Lua $LUA_VERSION configuration from pkg-config" >&5 +printf "%s\n" "$as_me: using Lua $LUA_VERSION configuration from pkg-config" >&6;} + break + fi +done + +if test -z "$LUA_VERSION"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5 +printf %s "checking for pow in -lm... " >&6; } +if test ${ac_cv_lib_m_pow+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char pow (void); +int +main (void) +{ +return pow (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_m_pow=yes +else case e in #( + e) ac_cv_lib_m_pow=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_pow" >&5 +printf "%s\n" "$ac_cv_lib_m_pow" >&6; } +if test "x$ac_cv_lib_m_pow" = xyes +then : + lib_m="-lm" +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqrt in -lm" >&5 +printf %s "checking for sqrt in -lm... " >&6; } +if test ${ac_cv_lib_m_sqrt+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char sqrt (void); +int +main (void) +{ +return sqrt (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_m_sqrt=yes +else case e in #( + e) ac_cv_lib_m_sqrt=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sqrt" >&5 +printf "%s\n" "$ac_cv_lib_m_sqrt" >&6; } +if test "x$ac_cv_lib_m_sqrt" = xyes +then : + lib_m="-lm" +fi + + for x in $test_paths ; do + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lua.h in ${x}/include/lua-5.4" >&5 +printf %s "checking for lua.h in ${x}/include/lua-5.4... " >&6; } + if test -f ${x}/include/lua-5.4/lua.h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS" + LDFLAGS="-L${x}/lib/lua-5.4 $LDFLAGS $lib_m" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for luaL_newstate in -llua-5.4" >&5 +printf %s "checking for luaL_newstate in -llua-5.4... " >&6; } +if test ${ac_cv_lib_lua_5_4_luaL_newstate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-llua-5.4 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char luaL_newstate (void); +int +main (void) +{ +return luaL_newstate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_lua_5_4_luaL_newstate=yes +else case e in #( + e) ac_cv_lib_lua_5_4_luaL_newstate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lua_5_4_luaL_newstate" >&5 +printf "%s\n" "$ac_cv_lib_lua_5_4_luaL_newstate" >&6; } +if test "x$ac_cv_lib_lua_5_4_luaL_newstate" = xyes +then : + + LUA_LIBS="-L${x}/lib/lua-5.4 -llua-5.4 $lib_m" + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LUA_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LUA_LIBS to \"$ap_platform_runtime_link_flag${x}/lib/lua-5.4\"" + LUA_LIBS="$ap_platform_runtime_link_flag${x}/lib/lua-5.4" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${x}/lib/lua-5.4" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LUA_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LUA_LIBS" + LUA_LIBS="$LUA_LIBS $i" + fi + done + fi + + fi + LUA_CFLAGS="-I${x}/include/lua-5.4" + +fi + + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + + if test -n "${LUA_LIBS}"; then + break + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lua.h in ${x}/include/lua5.4" >&5 +printf %s "checking for lua.h in ${x}/include/lua5.4... " >&6; } + if test -f ${x}/include/lua5.4/lua.h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS" + LDFLAGS="-L${x}/lib $LDFLAGS $lib_m" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for luaL_newstate in -llua5.4" >&5 +printf %s "checking for luaL_newstate in -llua5.4... " >&6; } +if test ${ac_cv_lib_lua5_4_luaL_newstate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-llua5.4 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char luaL_newstate (void); +int +main (void) +{ +return luaL_newstate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_lua5_4_luaL_newstate=yes +else case e in #( + e) ac_cv_lib_lua5_4_luaL_newstate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lua5_4_luaL_newstate" >&5 +printf "%s\n" "$ac_cv_lib_lua5_4_luaL_newstate" >&6; } +if test "x$ac_cv_lib_lua5_4_luaL_newstate" = xyes +then : + + LUA_LIBS="-L${x}/lib -llua5.4 $lib_m" + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LUA_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LUA_LIBS to \"$ap_platform_runtime_link_flag${x}/lib\"" + LUA_LIBS="$ap_platform_runtime_link_flag${x}/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${x}/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LUA_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LUA_LIBS" + LUA_LIBS="$LUA_LIBS $i" + fi + done + fi + + fi + LUA_CFLAGS="-I${x}/include/lua5.4" + +fi + + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + + if test -n "${LUA_LIBS}"; then + break + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lua.h in ${x}/include/lua54" >&5 +printf %s "checking for lua.h in ${x}/include/lua54... " >&6; } + if test -f ${x}/include/lua54/lua.h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS" + LDFLAGS="-L${x}/lib/lua54 $LDFLAGS $lib_m" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for luaL_newstate in -llua" >&5 +printf %s "checking for luaL_newstate in -llua... " >&6; } +if test ${ac_cv_lib_lua_luaL_newstate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-llua $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char luaL_newstate (void); +int +main (void) +{ +return luaL_newstate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_lua_luaL_newstate=yes +else case e in #( + e) ac_cv_lib_lua_luaL_newstate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lua_luaL_newstate" >&5 +printf "%s\n" "$ac_cv_lib_lua_luaL_newstate" >&6; } +if test "x$ac_cv_lib_lua_luaL_newstate" = xyes +then : + + LUA_LIBS="-L${x}/lib/lua54 -llua $lib_m" + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LUA_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LUA_LIBS to \"$ap_platform_runtime_link_flag${x}/lib/lua54\"" + LUA_LIBS="$ap_platform_runtime_link_flag${x}/lib/lua54" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${x}/lib/lua54" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LUA_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LUA_LIBS" + LUA_LIBS="$LUA_LIBS $i" + fi + done + fi + + fi + LUA_CFLAGS="-I${x}/include/lua54" + +fi + + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + + if test -n "${LUA_LIBS}"; then + break + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lua.h in ${x}/include/lua-5.3" >&5 +printf %s "checking for lua.h in ${x}/include/lua-5.3... " >&6; } + if test -f ${x}/include/lua-5.3/lua.h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS" + LDFLAGS="-L${x}/lib/lua-5.3 $LDFLAGS $lib_m" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for luaL_newstate in -llua-5.3" >&5 +printf %s "checking for luaL_newstate in -llua-5.3... " >&6; } +if test ${ac_cv_lib_lua_5_3_luaL_newstate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-llua-5.3 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char luaL_newstate (void); +int +main (void) +{ +return luaL_newstate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_lua_5_3_luaL_newstate=yes +else case e in #( + e) ac_cv_lib_lua_5_3_luaL_newstate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lua_5_3_luaL_newstate" >&5 +printf "%s\n" "$ac_cv_lib_lua_5_3_luaL_newstate" >&6; } +if test "x$ac_cv_lib_lua_5_3_luaL_newstate" = xyes +then : + + LUA_LIBS="-L${x}/lib/lua-5.3 -llua-5.3 $lib_m" + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LUA_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LUA_LIBS to \"$ap_platform_runtime_link_flag${x}/lib/lua-5.3\"" + LUA_LIBS="$ap_platform_runtime_link_flag${x}/lib/lua-5.3" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${x}/lib/lua-5.3" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LUA_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LUA_LIBS" + LUA_LIBS="$LUA_LIBS $i" + fi + done + fi + + fi + LUA_CFLAGS="-I${x}/include/lua-5.3" + +fi + + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + + if test -n "${LUA_LIBS}"; then + break + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lua.h in ${x}/include/lua5.3" >&5 +printf %s "checking for lua.h in ${x}/include/lua5.3... " >&6; } + if test -f ${x}/include/lua5.3/lua.h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS" + LDFLAGS="-L${x}/lib $LDFLAGS $lib_m" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for luaL_newstate in -llua5.3" >&5 +printf %s "checking for luaL_newstate in -llua5.3... " >&6; } +if test ${ac_cv_lib_lua5_3_luaL_newstate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-llua5.3 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char luaL_newstate (void); +int +main (void) +{ +return luaL_newstate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_lua5_3_luaL_newstate=yes +else case e in #( + e) ac_cv_lib_lua5_3_luaL_newstate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lua5_3_luaL_newstate" >&5 +printf "%s\n" "$ac_cv_lib_lua5_3_luaL_newstate" >&6; } +if test "x$ac_cv_lib_lua5_3_luaL_newstate" = xyes +then : + + LUA_LIBS="-L${x}/lib -llua5.3 $lib_m" + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LUA_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LUA_LIBS to \"$ap_platform_runtime_link_flag${x}/lib\"" + LUA_LIBS="$ap_platform_runtime_link_flag${x}/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${x}/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LUA_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LUA_LIBS" + LUA_LIBS="$LUA_LIBS $i" + fi + done + fi + + fi + LUA_CFLAGS="-I${x}/include/lua5.3" + +fi + + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + + if test -n "${LUA_LIBS}"; then + break + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lua.h in ${x}/include/lua53" >&5 +printf %s "checking for lua.h in ${x}/include/lua53... " >&6; } + if test -f ${x}/include/lua53/lua.h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS" + LDFLAGS="-L${x}/lib/lua53 $LDFLAGS $lib_m" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for luaL_newstate in -llua" >&5 +printf %s "checking for luaL_newstate in -llua... " >&6; } +if test ${ac_cv_lib_lua_luaL_newstate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-llua $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char luaL_newstate (void); +int +main (void) +{ +return luaL_newstate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_lua_luaL_newstate=yes +else case e in #( + e) ac_cv_lib_lua_luaL_newstate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lua_luaL_newstate" >&5 +printf "%s\n" "$ac_cv_lib_lua_luaL_newstate" >&6; } +if test "x$ac_cv_lib_lua_luaL_newstate" = xyes +then : + + LUA_LIBS="-L${x}/lib/lua53 -llua $lib_m" + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LUA_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LUA_LIBS to \"$ap_platform_runtime_link_flag${x}/lib/lua53\"" + LUA_LIBS="$ap_platform_runtime_link_flag${x}/lib/lua53" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${x}/lib/lua53" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LUA_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LUA_LIBS" + LUA_LIBS="$LUA_LIBS $i" + fi + done + fi + + fi + LUA_CFLAGS="-I${x}/include/lua53" + +fi + + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + + if test -n "${LUA_LIBS}"; then + break + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lua.h in ${x}/include" >&5 +printf %s "checking for lua.h in ${x}/include... " >&6; } + if test -f ${x}/include/lua.h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS" + LDFLAGS="-L${x}/lib $LDFLAGS $lib_m" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for luaL_newstate in -llua" >&5 +printf %s "checking for luaL_newstate in -llua... " >&6; } +if test ${ac_cv_lib_lua_luaL_newstate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-llua $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char luaL_newstate (void); +int +main (void) +{ +return luaL_newstate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_lua_luaL_newstate=yes +else case e in #( + e) ac_cv_lib_lua_luaL_newstate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lua_luaL_newstate" >&5 +printf "%s\n" "$ac_cv_lib_lua_luaL_newstate" >&6; } +if test "x$ac_cv_lib_lua_luaL_newstate" = xyes +then : + + LUA_LIBS="-L${x}/lib -llua $lib_m" + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LUA_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LUA_LIBS to \"$ap_platform_runtime_link_flag${x}/lib\"" + LUA_LIBS="$ap_platform_runtime_link_flag${x}/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${x}/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LUA_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LUA_LIBS" + LUA_LIBS="$LUA_LIBS $i" + fi + done + fi + + fi + LUA_CFLAGS="-I${x}/include" + +fi + + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + + if test -n "${LUA_LIBS}"; then + break + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lua.h in ${x}/include/lua-5.2" >&5 +printf %s "checking for lua.h in ${x}/include/lua-5.2... " >&6; } + if test -f ${x}/include/lua-5.2/lua.h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS" + LDFLAGS="-L${x}/lib/lua-5.2 $LDFLAGS $lib_m" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for luaL_newstate in -llua-5.2" >&5 +printf %s "checking for luaL_newstate in -llua-5.2... " >&6; } +if test ${ac_cv_lib_lua_5_2_luaL_newstate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-llua-5.2 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char luaL_newstate (void); +int +main (void) +{ +return luaL_newstate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_lua_5_2_luaL_newstate=yes +else case e in #( + e) ac_cv_lib_lua_5_2_luaL_newstate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lua_5_2_luaL_newstate" >&5 +printf "%s\n" "$ac_cv_lib_lua_5_2_luaL_newstate" >&6; } +if test "x$ac_cv_lib_lua_5_2_luaL_newstate" = xyes +then : + + LUA_LIBS="-L${x}/lib/lua-5.2 -llua-5.2 $lib_m" + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LUA_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LUA_LIBS to \"$ap_platform_runtime_link_flag${x}/lib/lua-5.2\"" + LUA_LIBS="$ap_platform_runtime_link_flag${x}/lib/lua-5.2" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${x}/lib/lua-5.2" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LUA_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LUA_LIBS" + LUA_LIBS="$LUA_LIBS $i" + fi + done + fi + + fi + LUA_CFLAGS="-I${x}/include/lua-5.2" + +fi + + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + + if test -n "${LUA_LIBS}"; then + break + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lua.h in ${x}/include/lua5.2" >&5 +printf %s "checking for lua.h in ${x}/include/lua5.2... " >&6; } + if test -f ${x}/include/lua5.2/lua.h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS" + LDFLAGS="-L${x}/lib $LDFLAGS $lib_m" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for luaL_newstate in -llua5.2" >&5 +printf %s "checking for luaL_newstate in -llua5.2... " >&6; } +if test ${ac_cv_lib_lua5_2_luaL_newstate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-llua5.2 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char luaL_newstate (void); +int +main (void) +{ +return luaL_newstate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_lua5_2_luaL_newstate=yes +else case e in #( + e) ac_cv_lib_lua5_2_luaL_newstate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lua5_2_luaL_newstate" >&5 +printf "%s\n" "$ac_cv_lib_lua5_2_luaL_newstate" >&6; } +if test "x$ac_cv_lib_lua5_2_luaL_newstate" = xyes +then : + + LUA_LIBS="-L${x}/lib -llua5.2 $lib_m" + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LUA_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LUA_LIBS to \"$ap_platform_runtime_link_flag${x}/lib\"" + LUA_LIBS="$ap_platform_runtime_link_flag${x}/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${x}/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LUA_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LUA_LIBS" + LUA_LIBS="$LUA_LIBS $i" + fi + done + fi + + fi + LUA_CFLAGS="-I${x}/include/lua5.2" + +fi + + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + + if test -n "${LUA_LIBS}"; then + break + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lua.h in ${x}/include/lua52" >&5 +printf %s "checking for lua.h in ${x}/include/lua52... " >&6; } + if test -f ${x}/include/lua52/lua.h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS" + LDFLAGS="-L${x}/lib/lua52 $LDFLAGS $lib_m" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for luaL_newstate in -llua" >&5 +printf %s "checking for luaL_newstate in -llua... " >&6; } +if test ${ac_cv_lib_lua_luaL_newstate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-llua $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char luaL_newstate (void); +int +main (void) +{ +return luaL_newstate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_lua_luaL_newstate=yes +else case e in #( + e) ac_cv_lib_lua_luaL_newstate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lua_luaL_newstate" >&5 +printf "%s\n" "$ac_cv_lib_lua_luaL_newstate" >&6; } +if test "x$ac_cv_lib_lua_luaL_newstate" = xyes +then : + + LUA_LIBS="-L${x}/lib/lua52 -llua $lib_m" + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LUA_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LUA_LIBS to \"$ap_platform_runtime_link_flag${x}/lib/lua52\"" + LUA_LIBS="$ap_platform_runtime_link_flag${x}/lib/lua52" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${x}/lib/lua52" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LUA_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LUA_LIBS" + LUA_LIBS="$LUA_LIBS $i" + fi + done + fi + + fi + LUA_CFLAGS="-I${x}/include/lua52" + +fi + + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + + if test -n "${LUA_LIBS}"; then + break + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lua.h in ${x}/include/lua-5.1" >&5 +printf %s "checking for lua.h in ${x}/include/lua-5.1... " >&6; } + if test -f ${x}/include/lua-5.1/lua.h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS" + LDFLAGS="-L${x}/lib/lua-5.1 $LDFLAGS $lib_m" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for luaL_newstate in -llua-5.1" >&5 +printf %s "checking for luaL_newstate in -llua-5.1... " >&6; } +if test ${ac_cv_lib_lua_5_1_luaL_newstate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-llua-5.1 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char luaL_newstate (void); +int +main (void) +{ +return luaL_newstate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_lua_5_1_luaL_newstate=yes +else case e in #( + e) ac_cv_lib_lua_5_1_luaL_newstate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lua_5_1_luaL_newstate" >&5 +printf "%s\n" "$ac_cv_lib_lua_5_1_luaL_newstate" >&6; } +if test "x$ac_cv_lib_lua_5_1_luaL_newstate" = xyes +then : + + LUA_LIBS="-L${x}/lib/lua-5.1 -llua-5.1 $lib_m" + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LUA_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LUA_LIBS to \"$ap_platform_runtime_link_flag${x}/lib/lua-5.1\"" + LUA_LIBS="$ap_platform_runtime_link_flag${x}/lib/lua-5.1" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${x}/lib/lua-5.1" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LUA_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LUA_LIBS" + LUA_LIBS="$LUA_LIBS $i" + fi + done + fi + + fi + LUA_CFLAGS="-I${x}/include/lua-5.1" + +fi + + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + + if test -n "${LUA_LIBS}"; then + break + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lua.h in ${x}/include/lua5.1" >&5 +printf %s "checking for lua.h in ${x}/include/lua5.1... " >&6; } + if test -f ${x}/include/lua5.1/lua.h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS" + LDFLAGS="-L${x}/lib $LDFLAGS $lib_m" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for luaL_newstate in -llua5.1" >&5 +printf %s "checking for luaL_newstate in -llua5.1... " >&6; } +if test ${ac_cv_lib_lua5_1_luaL_newstate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-llua5.1 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char luaL_newstate (void); +int +main (void) +{ +return luaL_newstate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_lua5_1_luaL_newstate=yes +else case e in #( + e) ac_cv_lib_lua5_1_luaL_newstate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lua5_1_luaL_newstate" >&5 +printf "%s\n" "$ac_cv_lib_lua5_1_luaL_newstate" >&6; } +if test "x$ac_cv_lib_lua5_1_luaL_newstate" = xyes +then : + + LUA_LIBS="-L${x}/lib -llua5.1 $lib_m" + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LUA_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LUA_LIBS to \"$ap_platform_runtime_link_flag${x}/lib\"" + LUA_LIBS="$ap_platform_runtime_link_flag${x}/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${x}/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LUA_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LUA_LIBS" + LUA_LIBS="$LUA_LIBS $i" + fi + done + fi + + fi + LUA_CFLAGS="-I${x}/include/lua5.1" + +fi + + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + + if test -n "${LUA_LIBS}"; then + break + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lua.h in ${x}/include/lua51" >&5 +printf %s "checking for lua.h in ${x}/include/lua51... " >&6; } + if test -f ${x}/include/lua51/lua.h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS" + LDFLAGS="-L${x}/lib/lua51 $LDFLAGS $lib_m" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for luaL_newstate in -llua" >&5 +printf %s "checking for luaL_newstate in -llua... " >&6; } +if test ${ac_cv_lib_lua_luaL_newstate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-llua $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char luaL_newstate (void); +int +main (void) +{ +return luaL_newstate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_lua_luaL_newstate=yes +else case e in #( + e) ac_cv_lib_lua_luaL_newstate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lua_luaL_newstate" >&5 +printf "%s\n" "$ac_cv_lib_lua_luaL_newstate" >&6; } +if test "x$ac_cv_lib_lua_luaL_newstate" = xyes +then : + + LUA_LIBS="-L${x}/lib/lua51 -llua $lib_m" + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LUA_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LUA_LIBS to \"$ap_platform_runtime_link_flag${x}/lib/lua51\"" + LUA_LIBS="$ap_platform_runtime_link_flag${x}/lib/lua51" + else + apr_addto_bugger="$ap_platform_runtime_link_flag${x}/lib/lua51" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LUA_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LUA_LIBS" + LUA_LIBS="$LUA_LIBS $i" + fi + done + fi + + fi + LUA_CFLAGS="-I${x}/include/lua51" + +fi + + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + + if test -n "${LUA_LIBS}"; then + break + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + done +fi + + + + +if test -z "${LUA_LIBS}"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: *** Lua 5.4 5.3 5.2 or 5.1 library not found." >&5 +printf "%s\n" "$as_me: WARNING: *** Lua 5.4 5.3 5.2 or 5.1 library not found." >&2;} + enable_lua="no" + if test -z "${lua_path}"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Lua 5.4 5.3 5.2 or 5.1 library is required" >&5 +printf "%s\n" "$as_me: WARNING: Lua 5.4 5.3 5.2 or 5.1 library is required" >&2;} + else + as_fn_error $? "Lua 5.4 5.3 5.2 or 5.1 library is required" "$LINENO" 5 + fi +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: using '${LUA_LIBS}' for Lua Library" >&5 +printf "%s\n" "$as_me: using '${LUA_LIBS}' for Lua Library" >&6;} + # Check whether --enable-luajit was given. +if test ${enable_luajit+y} +then : + enableval=$enable_luajit; + if test "$enableval" = "yes"; then + + if test "x$MOD_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CPPFLAGS to \""-DAP_ENABLE_LUAJIT"\"" + MOD_CPPFLAGS=""-DAP_ENABLE_LUAJIT"" + else + apr_addto_bugger=""-DAP_ENABLE_LUAJIT"" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CPPFLAGS" + MOD_CPPFLAGS="$MOD_CPPFLAGS $i" + fi + done + fi + + fi + +fi + + +fi + + if test "x$enable_lua" != "xno" ; then + + if test "x$MOD_INCLUDES" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_INCLUDES to \"$LUA_CFLAGS\"" + MOD_INCLUDES="$LUA_CFLAGS" + else + apr_addto_bugger="$LUA_CFLAGS" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_INCLUDES; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_INCLUDES" + MOD_INCLUDES="$MOD_INCLUDES $i" + fi + done + fi + + + if test "x$MOD_LUA_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LUA_LDADD to \"$LUA_LIBS $CRYPT_LIBS\"" + MOD_LUA_LDADD="$LUA_LIBS $CRYPT_LIBS" + else + apr_addto_bugger="$LUA_LIBS $CRYPT_LIBS" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LUA_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LUA_LDADD" + MOD_LUA_LDADD="$MOD_LUA_LDADD $i" + fi + done + fi + + fi + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_lua" >&5 +printf %s "checking whether to enable mod_lua... " >&6; } + if test "$enable_lua" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_lua has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_lua$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_lua$_apmod_extra_msg" >&6; } + if test "$enable_lua" != "no"; then + case "$enable_lua" in + static*) + MODLIST="$MODLIST lua" + if test "lua" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES lua" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},lua" + fi + ;; + esac + + + if test -z "$lua_objects"; then + objects="mod_lua.lo" + else + objects="$lua_objects" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_lua.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + + current_dir=metadata + modpath_current=modules/metadata + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d metadata || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_env" >&5 +printf %s "checking whether to enable mod_env... " >&6; } + # Check whether --enable-env was given. +if test ${enable_env+y} +then : + enableval=$enable_env; force_env=$enableval +else case e in #( + e) enable_env=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_env" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_env" = "static" -o "$enable_env" = "shared"; then + : + elif test "$enable_env" = "yes"; then + enable_env=$module_default + elif test "$enable_env" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_env=$module_default + else + enable_env=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_env" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_env=$module_default + else + enable_env=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_env" = "all" -o "$enable_env" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_env=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_env=no + fi + elif test "$enable_env" = "reallyall" -o "$enable_env" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_env" != "no" ; then + enable_env=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_env=no + fi + else + enable_env=no + fi + if test "$enable_env" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_env$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_env$_apmod_extra_msg" >&6; } + if test "$enable_env" != "no"; then + case "$enable_env" in + static*) + MODLIST="$MODLIST env" + if test "env" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES env" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},env" + fi + ;; + esac + + + if test -z ""; then + objects="mod_env.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_env.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_mime_magic... " >&6; } + # Check whether --enable-mime-magic was given. +if test ${enable_mime_magic+y} +then : + enableval=$enable_mime_magic; force_mime_magic=$enableval +else case e in #( + e) enable_mime_magic=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_mime_magic" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_mime_magic" = "static" -o "$enable_mime_magic" = "shared"; then + : + elif test "$enable_mime_magic" = "yes"; then + enable_mime_magic=$module_default + elif test "$enable_mime_magic" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_mime_magic=$module_default + else + enable_mime_magic=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_mime_magic" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_mime_magic=$module_default + else + enable_mime_magic=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_mime_magic" = "all" -o "$enable_mime_magic" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_mime_magic=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_mime_magic=no + fi + elif test "$enable_mime_magic" = "reallyall" -o "$enable_mime_magic" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_mime_magic" != "no" ; then + enable_mime_magic=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_mime_magic=no + fi + else + enable_mime_magic=no + fi + if test "$enable_mime_magic" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_mime_magic$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_mime_magic$_apmod_extra_msg" >&6; } + if test "$enable_mime_magic" != "no"; then + case "$enable_mime_magic" in + static*) + MODLIST="$MODLIST mime_magic" + if test "mime_magic" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES mime_magic" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},mime_magic" + fi + ;; + esac + + + if test -z ""; then + objects="mod_mime_magic.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_mime_magic.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_cern_meta... " >&6; } + # Check whether --enable-cern-meta was given. +if test ${enable_cern_meta+y} +then : + enableval=$enable_cern_meta; force_cern_meta=$enableval +else case e in #( + e) enable_cern_meta=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_cern_meta" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_cern_meta" = "static" -o "$enable_cern_meta" = "shared"; then + : + elif test "$enable_cern_meta" = "yes"; then + enable_cern_meta=$module_default + elif test "$enable_cern_meta" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cern_meta=$module_default + else + enable_cern_meta=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cern_meta" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_cern_meta=$module_default + else + enable_cern_meta=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cern_meta" = "all" -o "$enable_cern_meta" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cern_meta=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cern_meta=no + fi + elif test "$enable_cern_meta" = "reallyall" -o "$enable_cern_meta" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_cern_meta" != "no" ; then + enable_cern_meta=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cern_meta=no + fi + else + enable_cern_meta=no + fi + if test "$enable_cern_meta" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_cern_meta$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_cern_meta$_apmod_extra_msg" >&6; } + if test "$enable_cern_meta" != "no"; then + case "$enable_cern_meta" in + static*) + MODLIST="$MODLIST cern_meta" + if test "cern_meta" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES cern_meta" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},cern_meta" + fi + ;; + esac + + + if test -z ""; then + objects="mod_cern_meta.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_cern_meta.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_expires... " >&6; } + # Check whether --enable-expires was given. +if test ${enable_expires+y} +then : + enableval=$enable_expires; force_expires=$enableval +else case e in #( + e) enable_expires=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_expires" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_expires" = "static" -o "$enable_expires" = "shared"; then + : + elif test "$enable_expires" = "yes"; then + enable_expires=$module_default + elif test "$enable_expires" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_expires=$module_default + else + enable_expires=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_expires" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_expires=$module_default + else + enable_expires=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_expires" = "all" -o "$enable_expires" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_expires=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_expires=no + fi + elif test "$enable_expires" = "reallyall" -o "$enable_expires" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_expires" != "no" ; then + enable_expires=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_expires=no + fi + else + enable_expires=no + fi + if test "$enable_expires" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_expires$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_expires$_apmod_extra_msg" >&6; } + if test "$enable_expires" != "no"; then + case "$enable_expires" in + static*) + MODLIST="$MODLIST expires" + if test "expires" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES expires" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},expires" + fi + ;; + esac + + + if test -z ""; then + objects="mod_expires.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_expires.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_headers... " >&6; } + # Check whether --enable-headers was given. +if test ${enable_headers+y} +then : + enableval=$enable_headers; force_headers=$enableval +else case e in #( + e) enable_headers=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_headers" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_headers" = "static" -o "$enable_headers" = "shared"; then + : + elif test "$enable_headers" = "yes"; then + enable_headers=$module_default + elif test "$enable_headers" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_headers=$module_default + else + enable_headers=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_headers" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_headers=$module_default + else + enable_headers=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_headers" = "all" -o "$enable_headers" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_headers=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_headers=no + fi + elif test "$enable_headers" = "reallyall" -o "$enable_headers" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_headers" != "no" ; then + enable_headers=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_headers=no + fi + else + enable_headers=no + fi + if test "$enable_headers" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_headers$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_headers$_apmod_extra_msg" >&6; } + if test "$enable_headers" != "no"; then + case "$enable_headers" in + static*) + MODLIST="$MODLIST headers" + if test "headers" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES headers" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},headers" + fi + ;; + esac + + + if test -z ""; then + objects="mod_headers.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_headers.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_ident... " >&6; } + # Check whether --enable-ident was given. +if test ${enable_ident+y} +then : + enableval=$enable_ident; force_ident=$enableval +else case e in #( + e) enable_ident=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_ident" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_ident" = "static" -o "$enable_ident" = "shared"; then + : + elif test "$enable_ident" = "yes"; then + enable_ident=$module_default + elif test "$enable_ident" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_ident=$module_default + else + enable_ident=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ident" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_ident=$module_default + else + enable_ident=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ident" = "all" -o "$enable_ident" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_ident=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_ident=no + fi + elif test "$enable_ident" = "reallyall" -o "$enable_ident" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_ident" != "no" ; then + enable_ident=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_ident=no + fi + else + enable_ident=no + fi + if test "$enable_ident" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_ident$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_ident$_apmod_extra_msg" >&6; } + if test "$enable_ident" != "no"; then + case "$enable_ident" in + static*) + MODLIST="$MODLIST ident" + if test "ident" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES ident" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},ident" + fi + ;; + esac + + + if test -z ""; then + objects="mod_ident.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_ident.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_usertrack... " >&6; } + # Check whether --enable-usertrack was given. +if test ${enable_usertrack+y} +then : + enableval=$enable_usertrack; force_usertrack=$enableval +else case e in #( + e) enable_usertrack=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_usertrack" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_usertrack" = "static" -o "$enable_usertrack" = "shared"; then + : + elif test "$enable_usertrack" = "yes"; then + enable_usertrack=$module_default + elif test "$enable_usertrack" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_usertrack=$module_default + else + enable_usertrack=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_usertrack" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_usertrack=$module_default + else + enable_usertrack=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_usertrack" = "all" -o "$enable_usertrack" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_usertrack=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_usertrack=no + fi + elif test "$enable_usertrack" = "reallyall" -o "$enable_usertrack" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_usertrack" != "no" ; then + enable_usertrack=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_usertrack=no + fi + else + enable_usertrack=no + fi + if test "$enable_usertrack" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + ac_fn_c_check_header_compile "$LINENO" "sys/times.h" "ac_cv_header_sys_times_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_times_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TIMES_H 1" >>confdefs.h + +fi + + ac_fn_c_check_func "$LINENO" "times" "ac_cv_func_times" +if test "x$ac_cv_func_times" = xyes +then : + printf "%s\n" "#define HAVE_TIMES 1" >>confdefs.h + +fi + + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_usertrack" >&5 +printf %s "checking whether to enable mod_usertrack... " >&6; } + if test "$enable_usertrack" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_usertrack has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_usertrack$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_usertrack$_apmod_extra_msg" >&6; } + if test "$enable_usertrack" != "no"; then + case "$enable_usertrack" in + static*) + MODLIST="$MODLIST usertrack" + if test "usertrack" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES usertrack" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},usertrack" + fi + ;; + esac + + + if test -z ""; then + objects="mod_usertrack.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_usertrack.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_unique_id... " >&6; } + # Check whether --enable-unique-id was given. +if test ${enable_unique_id+y} +then : + enableval=$enable_unique_id; force_unique_id=$enableval +else case e in #( + e) enable_unique_id=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_unique_id" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_unique_id" = "static" -o "$enable_unique_id" = "shared"; then + : + elif test "$enable_unique_id" = "yes"; then + enable_unique_id=$module_default + elif test "$enable_unique_id" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_unique_id=$module_default + else + enable_unique_id=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_unique_id" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_unique_id=$module_default + else + enable_unique_id=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_unique_id" = "all" -o "$enable_unique_id" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_unique_id=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_unique_id=no + fi + elif test "$enable_unique_id" = "reallyall" -o "$enable_unique_id" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_unique_id" != "no" ; then + enable_unique_id=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_unique_id=no + fi + else + enable_unique_id=no + fi + if test "$enable_unique_id" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_unique_id$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_unique_id$_apmod_extra_msg" >&6; } + if test "$enable_unique_id" != "no"; then + case "$enable_unique_id" in + static*) + MODLIST="$MODLIST unique_id" + if test "unique_id" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES unique_id" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},unique_id" + fi + ;; + esac + + + if test -z ""; then + objects="mod_unique_id.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_unique_id.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_setenvif... " >&6; } + # Check whether --enable-setenvif was given. +if test ${enable_setenvif+y} +then : + enableval=$enable_setenvif; force_setenvif=$enableval +else case e in #( + e) enable_setenvif=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_setenvif" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_setenvif" = "static" -o "$enable_setenvif" = "shared"; then + : + elif test "$enable_setenvif" = "yes"; then + enable_setenvif=$module_default + elif test "$enable_setenvif" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_setenvif=$module_default + else + enable_setenvif=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_setenvif" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_setenvif=$module_default + else + enable_setenvif=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_setenvif" = "all" -o "$enable_setenvif" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_setenvif=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_setenvif=no + fi + elif test "$enable_setenvif" = "reallyall" -o "$enable_setenvif" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_setenvif" != "no" ; then + enable_setenvif=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_setenvif=no + fi + else + enable_setenvif=no + fi + if test "$enable_setenvif" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_setenvif$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_setenvif$_apmod_extra_msg" >&6; } + if test "$enable_setenvif" != "no"; then + case "$enable_setenvif" in + static*) + MODLIST="$MODLIST setenvif" + if test "setenvif" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES setenvif" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},setenvif" + fi + ;; + esac + + + if test -z ""; then + objects="mod_setenvif.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_setenvif.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_version... " >&6; } + # Check whether --enable-version was given. +if test ${enable_version+y} +then : + enableval=$enable_version; force_version=$enableval +else case e in #( + e) enable_version=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_version" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_version" = "static" -o "$enable_version" = "shared"; then + : + elif test "$enable_version" = "yes"; then + enable_version=$module_default + elif test "$enable_version" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_version=$module_default + else + enable_version=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_version" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_version=$module_default + else + enable_version=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_version" = "all" -o "$enable_version" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_version=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_version=no + fi + elif test "$enable_version" = "reallyall" -o "$enable_version" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_version" != "no" ; then + enable_version=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_version=no + fi + else + enable_version=no + fi + if test "$enable_version" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_version$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_version$_apmod_extra_msg" >&6; } + if test "$enable_version" != "no"; then + case "$enable_version" in + static*) + MODLIST="$MODLIST version" + if test "version" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES version" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},version" + fi + ;; + esac + + + if test -z ""; then + objects="mod_version.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_version.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_remoteip... " >&6; } + # Check whether --enable-remoteip was given. +if test ${enable_remoteip+y} +then : + enableval=$enable_remoteip; force_remoteip=$enableval +else case e in #( + e) enable_remoteip=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_remoteip" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_remoteip" = "static" -o "$enable_remoteip" = "shared"; then + : + elif test "$enable_remoteip" = "yes"; then + enable_remoteip=$module_default + elif test "$enable_remoteip" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_remoteip=$module_default + else + enable_remoteip=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_remoteip" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_remoteip=$module_default + else + enable_remoteip=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_remoteip" = "all" -o "$enable_remoteip" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_remoteip=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_remoteip=no + fi + elif test "$enable_remoteip" = "reallyall" -o "$enable_remoteip" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_remoteip" != "no" ; then + enable_remoteip=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_remoteip=no + fi + else + enable_remoteip=no + fi + if test "$enable_remoteip" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_remoteip$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_remoteip$_apmod_extra_msg" >&6; } + if test "$enable_remoteip" != "no"; then + case "$enable_remoteip" in + static*) + MODLIST="$MODLIST remoteip" + if test "remoteip" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES remoteip" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},remoteip" + fi + ;; + esac + + + if test -z ""; then + objects="mod_remoteip.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_remoteip.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + current_dir=proxy + modpath_current=modules/proxy + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d proxy || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +proxy_objs="mod_proxy.lo proxy_util.lo" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy" >&5 +printf %s "checking whether to enable mod_proxy... " >&6; } + # Check whether --enable-proxy was given. +if test ${enable_proxy+y} +then : + enableval=$enable_proxy; force_proxy=$enableval +else case e in #( + e) enable_proxy=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy" = "static" -o "$enable_proxy" = "shared"; then + : + elif test "$enable_proxy" = "yes"; then + enable_proxy=$module_default + elif test "$enable_proxy" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy=$module_default + else + enable_proxy=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy=$module_default + else + enable_proxy=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy" = "all" -o "$enable_proxy" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy=no + fi + elif test "$enable_proxy" = "reallyall" -o "$enable_proxy" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy" != "no" ; then + enable_proxy=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy=no + fi + else + enable_proxy=no + fi + if test "$enable_proxy" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy$_apmod_extra_msg" >&6; } + if test "$enable_proxy" != "no"; then + case "$enable_proxy" in + static*) + MODLIST="$MODLIST proxy" + if test "proxy" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy" + fi + ;; + esac + + + if test -z "$proxy_objs"; then + objects="mod_proxy.lo" + else + objects="$proxy_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_proxy_connect... " >&6; } + # Check whether --enable-proxy-connect was given. +if test ${enable_proxy_connect+y} +then : + enableval=$enable_proxy_connect; force_proxy_connect=$enableval +else case e in #( + e) enable_proxy_connect=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy_connect" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy_connect" = "static" -o "$enable_proxy_connect" = "shared"; then + : + elif test "$enable_proxy_connect" = "yes"; then + enable_proxy_connect=$module_default + elif test "$enable_proxy_connect" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_connect=$module_default + else + enable_proxy_connect=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_connect" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy_connect=$module_default + else + enable_proxy_connect=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_connect" = "all" -o "$enable_proxy_connect" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_connect=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_connect=no + fi + elif test "$enable_proxy_connect" = "reallyall" -o "$enable_proxy_connect" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy_connect" != "no" ; then + enable_proxy_connect=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_connect=no + fi + else + enable_proxy_connect=no + fi + if test "$enable_proxy_connect" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy" = "no" ; then + enable_proxy_connect=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy is disabled but required for mod_proxy_connect\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy is disabled but required for mod_proxy_connect\"" >&2;} + elif test "$enable_proxy_connect" = "static" && test "$enable_proxy" != "static" ; then + enable_proxy_connect=$enable_proxy + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_proxy_connect shared because mod_proxy is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_proxy_connect shared because mod_proxy is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_connect" >&5 +printf %s "checking whether to enable mod_proxy_connect... " >&6; } + if test "$enable_proxy_connect" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_proxy_connect has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy_connect$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy_connect$_apmod_extra_msg" >&6; } + if test "$enable_proxy_connect" != "no"; then + case "$enable_proxy_connect" in + static*) + MODLIST="$MODLIST proxy_connect" + if test "proxy_connect" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_connect" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy_connect" + fi + ;; + esac + + + if test -z "$proxy_connect_objs"; then + objects="mod_proxy_connect.lo" + else + objects="$proxy_connect_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy_connect.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_proxy_ftp... " >&6; } + # Check whether --enable-proxy-ftp was given. +if test ${enable_proxy_ftp+y} +then : + enableval=$enable_proxy_ftp; force_proxy_ftp=$enableval +else case e in #( + e) enable_proxy_ftp=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy_ftp" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy_ftp" = "static" -o "$enable_proxy_ftp" = "shared"; then + : + elif test "$enable_proxy_ftp" = "yes"; then + enable_proxy_ftp=$module_default + elif test "$enable_proxy_ftp" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_ftp=$module_default + else + enable_proxy_ftp=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_ftp" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy_ftp=$module_default + else + enable_proxy_ftp=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_ftp" = "all" -o "$enable_proxy_ftp" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_ftp=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_ftp=no + fi + elif test "$enable_proxy_ftp" = "reallyall" -o "$enable_proxy_ftp" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy_ftp" != "no" ; then + enable_proxy_ftp=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_ftp=no + fi + else + enable_proxy_ftp=no + fi + if test "$enable_proxy_ftp" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy" = "no" ; then + enable_proxy_ftp=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy is disabled but required for mod_proxy_ftp\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy is disabled but required for mod_proxy_ftp\"" >&2;} + elif test "$enable_proxy_ftp" = "static" && test "$enable_proxy" != "static" ; then + enable_proxy_ftp=$enable_proxy + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_proxy_ftp shared because mod_proxy is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_proxy_ftp shared because mod_proxy is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_ftp" >&5 +printf %s "checking whether to enable mod_proxy_ftp... " >&6; } + if test "$enable_proxy_ftp" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_proxy_ftp has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy_ftp$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy_ftp$_apmod_extra_msg" >&6; } + if test "$enable_proxy_ftp" != "no"; then + case "$enable_proxy_ftp" in + static*) + MODLIST="$MODLIST proxy_ftp" + if test "proxy_ftp" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_ftp" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy_ftp" + fi + ;; + esac + + + if test -z "$proxy_ftp_objs"; then + objects="mod_proxy_ftp.lo" + else + objects="$proxy_ftp_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy_ftp.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_proxy_http... " >&6; } + # Check whether --enable-proxy-http was given. +if test ${enable_proxy_http+y} +then : + enableval=$enable_proxy_http; force_proxy_http=$enableval +else case e in #( + e) enable_proxy_http=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy_http" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy_http" = "static" -o "$enable_proxy_http" = "shared"; then + : + elif test "$enable_proxy_http" = "yes"; then + enable_proxy_http=$module_default + elif test "$enable_proxy_http" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_http=$module_default + else + enable_proxy_http=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_http" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy_http=$module_default + else + enable_proxy_http=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_http" = "all" -o "$enable_proxy_http" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_http=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_http=no + fi + elif test "$enable_proxy_http" = "reallyall" -o "$enable_proxy_http" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy_http" != "no" ; then + enable_proxy_http=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_http=no + fi + else + enable_proxy_http=no + fi + if test "$enable_proxy_http" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy" = "no" ; then + enable_proxy_http=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy is disabled but required for mod_proxy_http\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy is disabled but required for mod_proxy_http\"" >&2;} + elif test "$enable_proxy_http" = "static" && test "$enable_proxy" != "static" ; then + enable_proxy_http=$enable_proxy + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_proxy_http shared because mod_proxy is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_proxy_http shared because mod_proxy is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_http" >&5 +printf %s "checking whether to enable mod_proxy_http... " >&6; } + if test "$enable_proxy_http" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_proxy_http has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy_http$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy_http$_apmod_extra_msg" >&6; } + if test "$enable_proxy_http" != "no"; then + case "$enable_proxy_http" in + static*) + MODLIST="$MODLIST proxy_http" + if test "proxy_http" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_http" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy_http" + fi + ;; + esac + + + if test -z "$proxy_http_objs"; then + objects="mod_proxy_http.lo" + else + objects="$proxy_http_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy_http.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_proxy_fcgi... " >&6; } + # Check whether --enable-proxy-fcgi was given. +if test ${enable_proxy_fcgi+y} +then : + enableval=$enable_proxy_fcgi; force_proxy_fcgi=$enableval +else case e in #( + e) enable_proxy_fcgi=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy_fcgi" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy_fcgi" = "static" -o "$enable_proxy_fcgi" = "shared"; then + : + elif test "$enable_proxy_fcgi" = "yes"; then + enable_proxy_fcgi=$module_default + elif test "$enable_proxy_fcgi" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_fcgi=$module_default + else + enable_proxy_fcgi=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_fcgi" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy_fcgi=$module_default + else + enable_proxy_fcgi=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_fcgi" = "all" -o "$enable_proxy_fcgi" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_fcgi=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_fcgi=no + fi + elif test "$enable_proxy_fcgi" = "reallyall" -o "$enable_proxy_fcgi" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy_fcgi" != "no" ; then + enable_proxy_fcgi=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_fcgi=no + fi + else + enable_proxy_fcgi=no + fi + if test "$enable_proxy_fcgi" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy" = "no" ; then + enable_proxy_fcgi=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy is disabled but required for mod_proxy_fcgi\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy is disabled but required for mod_proxy_fcgi\"" >&2;} + elif test "$enable_proxy_fcgi" = "static" && test "$enable_proxy" != "static" ; then + enable_proxy_fcgi=$enable_proxy + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_proxy_fcgi shared because mod_proxy is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_proxy_fcgi shared because mod_proxy is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_fcgi" >&5 +printf %s "checking whether to enable mod_proxy_fcgi... " >&6; } + if test "$enable_proxy_fcgi" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_proxy_fcgi has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy_fcgi$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy_fcgi$_apmod_extra_msg" >&6; } + if test "$enable_proxy_fcgi" != "no"; then + case "$enable_proxy_fcgi" in + static*) + MODLIST="$MODLIST proxy_fcgi" + if test "proxy_fcgi" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_fcgi" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy_fcgi" + fi + ;; + esac + + + if test -z "$proxy_fcgi_objs"; then + objects="mod_proxy_fcgi.lo" + else + objects="$proxy_fcgi_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy_fcgi.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_proxy_scgi... " >&6; } + # Check whether --enable-proxy-scgi was given. +if test ${enable_proxy_scgi+y} +then : + enableval=$enable_proxy_scgi; force_proxy_scgi=$enableval +else case e in #( + e) enable_proxy_scgi=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy_scgi" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy_scgi" = "static" -o "$enable_proxy_scgi" = "shared"; then + : + elif test "$enable_proxy_scgi" = "yes"; then + enable_proxy_scgi=$module_default + elif test "$enable_proxy_scgi" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_scgi=$module_default + else + enable_proxy_scgi=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_scgi" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy_scgi=$module_default + else + enable_proxy_scgi=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_scgi" = "all" -o "$enable_proxy_scgi" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_scgi=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_scgi=no + fi + elif test "$enable_proxy_scgi" = "reallyall" -o "$enable_proxy_scgi" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy_scgi" != "no" ; then + enable_proxy_scgi=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_scgi=no + fi + else + enable_proxy_scgi=no + fi + if test "$enable_proxy_scgi" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy" = "no" ; then + enable_proxy_scgi=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy is disabled but required for mod_proxy_scgi\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy is disabled but required for mod_proxy_scgi\"" >&2;} + elif test "$enable_proxy_scgi" = "static" && test "$enable_proxy" != "static" ; then + enable_proxy_scgi=$enable_proxy + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_proxy_scgi shared because mod_proxy is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_proxy_scgi shared because mod_proxy is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_scgi" >&5 +printf %s "checking whether to enable mod_proxy_scgi... " >&6; } + if test "$enable_proxy_scgi" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_proxy_scgi has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy_scgi$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy_scgi$_apmod_extra_msg" >&6; } + if test "$enable_proxy_scgi" != "no"; then + case "$enable_proxy_scgi" in + static*) + MODLIST="$MODLIST proxy_scgi" + if test "proxy_scgi" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_scgi" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy_scgi" + fi + ;; + esac + + + if test -z "$proxy_scgi_objs"; then + objects="mod_proxy_scgi.lo" + else + objects="$proxy_scgi_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy_scgi.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_proxy_uwsgi... " >&6; } + # Check whether --enable-proxy-uwsgi was given. +if test ${enable_proxy_uwsgi+y} +then : + enableval=$enable_proxy_uwsgi; force_proxy_uwsgi=$enableval +else case e in #( + e) enable_proxy_uwsgi=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy_uwsgi" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy_uwsgi" = "static" -o "$enable_proxy_uwsgi" = "shared"; then + : + elif test "$enable_proxy_uwsgi" = "yes"; then + enable_proxy_uwsgi=$module_default + elif test "$enable_proxy_uwsgi" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_uwsgi=$module_default + else + enable_proxy_uwsgi=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_uwsgi" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy_uwsgi=$module_default + else + enable_proxy_uwsgi=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_uwsgi" = "all" -o "$enable_proxy_uwsgi" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_uwsgi=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_uwsgi=no + fi + elif test "$enable_proxy_uwsgi" = "reallyall" -o "$enable_proxy_uwsgi" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy_uwsgi" != "no" ; then + enable_proxy_uwsgi=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_uwsgi=no + fi + else + enable_proxy_uwsgi=no + fi + if test "$enable_proxy_uwsgi" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy" = "no" ; then + enable_proxy_uwsgi=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy is disabled but required for mod_proxy_uwsgi\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy is disabled but required for mod_proxy_uwsgi\"" >&2;} + elif test "$enable_proxy_uwsgi" = "static" && test "$enable_proxy" != "static" ; then + enable_proxy_uwsgi=$enable_proxy + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_proxy_uwsgi shared because mod_proxy is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_proxy_uwsgi shared because mod_proxy is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_uwsgi" >&5 +printf %s "checking whether to enable mod_proxy_uwsgi... " >&6; } + if test "$enable_proxy_uwsgi" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_proxy_uwsgi has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy_uwsgi$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy_uwsgi$_apmod_extra_msg" >&6; } + if test "$enable_proxy_uwsgi" != "no"; then + case "$enable_proxy_uwsgi" in + static*) + MODLIST="$MODLIST proxy_uwsgi" + if test "proxy_uwsgi" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_uwsgi" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy_uwsgi" + fi + ;; + esac + + + if test -z "$proxy_uwsgi_objs"; then + objects="mod_proxy_uwsgi.lo" + else + objects="$proxy_uwsgi_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy_uwsgi.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } +if test ${ac_cv_c_undeclared_builtin_options+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_save_CFLAGS=$CFLAGS + ac_cv_c_undeclared_builtin_options='cannot detect' + for ac_arg in '' -fno-builtin; do + CFLAGS="$ac_save_CFLAGS $ac_arg" + # This test program should *not* compile successfully. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +(void) strchr; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else case e in #( + e) # This test program should compile successfully. + # No library function is consistently available on + # freestanding implementations, so test against a dummy + # declaration. Include always-available headers on the + # off chance that they somehow elicit warnings. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +extern void ac_decl (int, char *); + +int +main (void) +{ +(void) ac_decl (0, (char *) 0); + (void) ac_decl; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + if test x"$ac_arg" = x +then : + ac_cv_c_undeclared_builtin_options='none needed' +else case e in #( + e) ac_cv_c_undeclared_builtin_options=$ac_arg ;; +esac +fi + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + CFLAGS=$ac_save_CFLAGS + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 +printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } + case $ac_cv_c_undeclared_builtin_options in #( + 'cannot detect') : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "cannot make $CC report undeclared builtins +See 'config.log' for more details" "$LINENO" 5; } ;; #( + 'none needed') : + ac_c_undeclared_builtin_options='' ;; #( + *) : + ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; +esac + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_fdpass" >&5 +printf %s "checking whether to enable mod_proxy_fdpass... " >&6; } + # Check whether --enable-proxy-fdpass was given. +if test ${enable_proxy_fdpass+y} +then : + enableval=$enable_proxy_fdpass; force_proxy_fdpass=$enableval +else case e in #( + e) enable_proxy_fdpass=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy_fdpass" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy_fdpass" = "static" -o "$enable_proxy_fdpass" = "shared"; then + : + elif test "$enable_proxy_fdpass" = "yes"; then + enable_proxy_fdpass=$module_default + elif test "$enable_proxy_fdpass" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_fdpass=$module_default + else + enable_proxy_fdpass=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_fdpass" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy_fdpass=$module_default + else + enable_proxy_fdpass=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_fdpass" = "all" -o "$enable_proxy_fdpass" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_fdpass=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_fdpass=no + fi + elif test "$enable_proxy_fdpass" = "reallyall" -o "$enable_proxy_fdpass" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy_fdpass" != "no" ; then + enable_proxy_fdpass=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_fdpass=no + fi + else + enable_proxy_fdpass=no + fi + if test "$enable_proxy_fdpass" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy" = "no" ; then + enable_proxy_fdpass=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy is disabled but required for mod_proxy_fdpass\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy is disabled but required for mod_proxy_fdpass\"" >&2;} + elif test "$enable_proxy_fdpass" = "static" && test "$enable_proxy" != "static" ; then + enable_proxy_fdpass=$enable_proxy + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_proxy_fdpass shared because mod_proxy is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_proxy_fdpass shared because mod_proxy is built shared\"" >&2;} + else + + ac_fn_check_decl "$LINENO" "CMSG_DATA" "ac_cv_have_decl_CMSG_DATA" " + #include + #include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_CMSG_DATA" = xyes +then : + +fi + if test $ac_cv_have_decl_CMSG_DATA = "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Your system does not support CMSG_DATA." >&5 +printf "%s\n" "$as_me: WARNING: Your system does not support CMSG_DATA." >&2;} + enable_proxy_fdpass=no + fi + + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_fdpass" >&5 +printf %s "checking whether to enable mod_proxy_fdpass... " >&6; } + if test "$enable_proxy_fdpass" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_proxy_fdpass has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy_fdpass$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy_fdpass$_apmod_extra_msg" >&6; } + if test "$enable_proxy_fdpass" != "no"; then + case "$enable_proxy_fdpass" in + static*) + MODLIST="$MODLIST proxy_fdpass" + if test "proxy_fdpass" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_fdpass" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy_fdpass" + fi + ;; + esac + + + if test -z "$proxy_fdpass_objs"; then + objects="mod_proxy_fdpass.lo" + else + objects="$proxy_fdpass_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy_fdpass.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_proxy_wstunnel... " >&6; } + # Check whether --enable-proxy-wstunnel was given. +if test ${enable_proxy_wstunnel+y} +then : + enableval=$enable_proxy_wstunnel; force_proxy_wstunnel=$enableval +else case e in #( + e) enable_proxy_wstunnel=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy_wstunnel" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy_wstunnel" = "static" -o "$enable_proxy_wstunnel" = "shared"; then + : + elif test "$enable_proxy_wstunnel" = "yes"; then + enable_proxy_wstunnel=$module_default + elif test "$enable_proxy_wstunnel" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_wstunnel=$module_default + else + enable_proxy_wstunnel=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_wstunnel" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy_wstunnel=$module_default + else + enable_proxy_wstunnel=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_wstunnel" = "all" -o "$enable_proxy_wstunnel" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_wstunnel=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_wstunnel=no + fi + elif test "$enable_proxy_wstunnel" = "reallyall" -o "$enable_proxy_wstunnel" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy_wstunnel" != "no" ; then + enable_proxy_wstunnel=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_wstunnel=no + fi + else + enable_proxy_wstunnel=no + fi + if test "$enable_proxy_wstunnel" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy" = "no" ; then + enable_proxy_wstunnel=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy is disabled but required for mod_proxy_wstunnel\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy is disabled but required for mod_proxy_wstunnel\"" >&2;} + elif test "$enable_proxy_wstunnel" = "static" && test "$enable_proxy" != "static" ; then + enable_proxy_wstunnel=$enable_proxy + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_proxy_wstunnel shared because mod_proxy is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_proxy_wstunnel shared because mod_proxy is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_wstunnel" >&5 +printf %s "checking whether to enable mod_proxy_wstunnel... " >&6; } + if test "$enable_proxy_wstunnel" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_proxy_wstunnel has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy_wstunnel$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy_wstunnel$_apmod_extra_msg" >&6; } + if test "$enable_proxy_wstunnel" != "no"; then + case "$enable_proxy_wstunnel" in + static*) + MODLIST="$MODLIST proxy_wstunnel" + if test "proxy_wstunnel" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_wstunnel" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy_wstunnel" + fi + ;; + esac + + + if test -z "$proxy_wstunnel_objs"; then + objects="mod_proxy_wstunnel.lo" + else + objects="$proxy_wstunnel_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy_wstunnel.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_proxy_ajp... " >&6; } + # Check whether --enable-proxy-ajp was given. +if test ${enable_proxy_ajp+y} +then : + enableval=$enable_proxy_ajp; force_proxy_ajp=$enableval +else case e in #( + e) enable_proxy_ajp=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy_ajp" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy_ajp" = "static" -o "$enable_proxy_ajp" = "shared"; then + : + elif test "$enable_proxy_ajp" = "yes"; then + enable_proxy_ajp=$module_default + elif test "$enable_proxy_ajp" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_ajp=$module_default + else + enable_proxy_ajp=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_ajp" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy_ajp=$module_default + else + enable_proxy_ajp=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_ajp" = "all" -o "$enable_proxy_ajp" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_ajp=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_ajp=no + fi + elif test "$enable_proxy_ajp" = "reallyall" -o "$enable_proxy_ajp" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy_ajp" != "no" ; then + enable_proxy_ajp=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_ajp=no + fi + else + enable_proxy_ajp=no + fi + if test "$enable_proxy_ajp" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy" = "no" ; then + enable_proxy_ajp=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy is disabled but required for mod_proxy_ajp\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy is disabled but required for mod_proxy_ajp\"" >&2;} + elif test "$enable_proxy_ajp" = "static" && test "$enable_proxy" != "static" ; then + enable_proxy_ajp=$enable_proxy + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_proxy_ajp shared because mod_proxy is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_proxy_ajp shared because mod_proxy is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_ajp" >&5 +printf %s "checking whether to enable mod_proxy_ajp... " >&6; } + if test "$enable_proxy_ajp" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_proxy_ajp has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy_ajp$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy_ajp$_apmod_extra_msg" >&6; } + if test "$enable_proxy_ajp" != "no"; then + case "$enable_proxy_ajp" in + static*) + MODLIST="$MODLIST proxy_ajp" + if test "proxy_ajp" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_ajp" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy_ajp" + fi + ;; + esac + + + if test -z "$proxy_ajp_objs"; then + objects="mod_proxy_ajp.lo" + else + objects="$proxy_ajp_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy_ajp.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_proxy_balancer... " >&6; } + # Check whether --enable-proxy-balancer was given. +if test ${enable_proxy_balancer+y} +then : + enableval=$enable_proxy_balancer; force_proxy_balancer=$enableval +else case e in #( + e) enable_proxy_balancer=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy_balancer" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy_balancer" = "static" -o "$enable_proxy_balancer" = "shared"; then + : + elif test "$enable_proxy_balancer" = "yes"; then + enable_proxy_balancer=$module_default + elif test "$enable_proxy_balancer" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_balancer=$module_default + else + enable_proxy_balancer=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_balancer" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy_balancer=$module_default + else + enable_proxy_balancer=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_balancer" = "all" -o "$enable_proxy_balancer" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_balancer=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_balancer=no + fi + elif test "$enable_proxy_balancer" = "reallyall" -o "$enable_proxy_balancer" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy_balancer" != "no" ; then + enable_proxy_balancer=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_balancer=no + fi + else + enable_proxy_balancer=no + fi + if test "$enable_proxy_balancer" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy" = "no" ; then + enable_proxy_balancer=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy is disabled but required for mod_proxy_balancer\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy is disabled but required for mod_proxy_balancer\"" >&2;} + elif test "$enable_proxy_balancer" = "static" && test "$enable_proxy" != "static" ; then + enable_proxy_balancer=$enable_proxy + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_proxy_balancer shared because mod_proxy is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_proxy_balancer shared because mod_proxy is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_balancer" >&5 +printf %s "checking whether to enable mod_proxy_balancer... " >&6; } + if test "$enable_proxy_balancer" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_proxy_balancer has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy_balancer$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy_balancer$_apmod_extra_msg" >&6; } + if test "$enable_proxy_balancer" != "no"; then + case "$enable_proxy_balancer" in + static*) + MODLIST="$MODLIST proxy_balancer" + if test "proxy_balancer" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_balancer" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy_balancer" + fi + ;; + esac + + + if test -z "$proxy_balancer_objs"; then + objects="mod_proxy_balancer.lo" + else + objects="$proxy_balancer_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy_balancer.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_proxy_express... " >&6; } + # Check whether --enable-proxy-express was given. +if test ${enable_proxy_express+y} +then : + enableval=$enable_proxy_express; force_proxy_express=$enableval +else case e in #( + e) enable_proxy_express=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy_express" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy_express" = "static" -o "$enable_proxy_express" = "shared"; then + : + elif test "$enable_proxy_express" = "yes"; then + enable_proxy_express=$module_default + elif test "$enable_proxy_express" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_express=$module_default + else + enable_proxy_express=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_express" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy_express=$module_default + else + enable_proxy_express=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_express" = "all" -o "$enable_proxy_express" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_express=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_express=no + fi + elif test "$enable_proxy_express" = "reallyall" -o "$enable_proxy_express" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy_express" != "no" ; then + enable_proxy_express=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_express=no + fi + else + enable_proxy_express=no + fi + if test "$enable_proxy_express" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy" = "no" ; then + enable_proxy_express=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy is disabled but required for mod_proxy_express\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy is disabled but required for mod_proxy_express\"" >&2;} + elif test "$enable_proxy_express" = "static" && test "$enable_proxy" != "static" ; then + enable_proxy_express=$enable_proxy + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_proxy_express shared because mod_proxy is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_proxy_express shared because mod_proxy is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_express" >&5 +printf %s "checking whether to enable mod_proxy_express... " >&6; } + if test "$enable_proxy_express" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_proxy_express has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy_express$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy_express$_apmod_extra_msg" >&6; } + if test "$enable_proxy_express" != "no"; then + case "$enable_proxy_express" in + static*) + MODLIST="$MODLIST proxy_express" + if test "proxy_express" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_express" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy_express" + fi + ;; + esac + + + if test -z ""; then + objects="mod_proxy_express.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy_express.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_proxy_hcheck... " >&6; } + # Check whether --enable-proxy-hcheck was given. +if test ${enable_proxy_hcheck+y} +then : + enableval=$enable_proxy_hcheck; force_proxy_hcheck=$enableval +else case e in #( + e) enable_proxy_hcheck=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy_hcheck" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy_hcheck" = "static" -o "$enable_proxy_hcheck" = "shared"; then + : + elif test "$enable_proxy_hcheck" = "yes"; then + enable_proxy_hcheck=$module_default + elif test "$enable_proxy_hcheck" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_hcheck=$module_default + else + enable_proxy_hcheck=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_hcheck" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy_hcheck=$module_default + else + enable_proxy_hcheck=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_hcheck" = "all" -o "$enable_proxy_hcheck" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_hcheck=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_hcheck=no + fi + elif test "$enable_proxy_hcheck" = "reallyall" -o "$enable_proxy_hcheck" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy_hcheck" != "no" ; then + enable_proxy_hcheck=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_hcheck=no + fi + else + enable_proxy_hcheck=no + fi + if test "$enable_proxy_hcheck" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy" = "no" ; then + enable_proxy_hcheck=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy is disabled but required for mod_proxy_hcheck\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy is disabled but required for mod_proxy_hcheck\"" >&2;} + elif test "$enable_proxy_hcheck" = "static" && test "$enable_proxy" != "static" ; then + enable_proxy_hcheck=$enable_proxy + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_proxy_hcheck shared because mod_proxy is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_proxy_hcheck shared because mod_proxy is built shared\"" >&2;} + elif test "$enable_watchdog" = "no" ; then + enable_proxy_hcheck=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_watchdog is disabled but required for mod_proxy_hcheck\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_watchdog is disabled but required for mod_proxy_hcheck\"" >&2;} + elif test "$enable_proxy_hcheck" = "static" && test "$enable_watchdog" != "static" ; then + enable_proxy_hcheck=$enable_watchdog + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_proxy_hcheck shared because mod_watchdog is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_proxy_hcheck shared because mod_watchdog is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_hcheck" >&5 +printf %s "checking whether to enable mod_proxy_hcheck... " >&6; } + if test "$enable_proxy_hcheck" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_proxy_hcheck has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy_hcheck$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy_hcheck$_apmod_extra_msg" >&6; } + if test "$enable_proxy_hcheck" != "no"; then + case "$enable_proxy_hcheck" in + static*) + MODLIST="$MODLIST proxy_hcheck" + if test "proxy_hcheck" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_hcheck" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy_hcheck" + fi + ;; + esac + + + if test -z ""; then + objects="mod_proxy_hcheck.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy_hcheck.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + +if test -z "$enable_session" ; then + session_mods_enable=most +else + session_mods_enable=$enable_session +fi + + + + + current_dir=session + modpath_current=modules/session + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d session || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +session_cookie_objects='mod_session_cookie.lo' +session_crypto_objects='mod_session_crypto.lo' +session_dbd_objects='mod_session_dbd.lo' + +case "$host" in + *os2*) + # OS/2 DLLs must resolve all symbols at build time + # and we need some from main session module + session_cookie_objects="$session_cookie_objects mod_session.la" + session_crypto_objects="$session_crypto_objects mod_session.la" + session_dbd_objects="$session_dbd_objects mod_session.la" + ;; +esac + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_session" >&5 +printf %s "checking whether to enable mod_session... " >&6; } + # Check whether --enable-session was given. +if test ${enable_session+y} +then : + enableval=$enable_session; force_session=$enableval +else case e in #( + e) enable_session=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_session" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_session" = "static" -o "$enable_session" = "shared"; then + : + elif test "$enable_session" = "yes"; then + enable_session=$module_default + elif test "$enable_session" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_session=$module_default + else + enable_session=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_session" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_session=$module_default + else + enable_session=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_session" = "all" -o "$enable_session" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_session=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_session=no + fi + elif test "$enable_session" = "reallyall" -o "$enable_session" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_session" != "no" ; then + enable_session=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_session=no + fi + else + enable_session=no + fi + if test "$enable_session" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_session$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_session$_apmod_extra_msg" >&6; } + if test "$enable_session" != "no"; then + case "$enable_session" in + static*) + MODLIST="$MODLIST session" + if test "session" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES session" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},session" + fi + ;; + esac + + + if test -z ""; then + objects="mod_session.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_session.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_session_cookie... " >&6; } + # Check whether --enable-session-cookie was given. +if test ${enable_session_cookie+y} +then : + enableval=$enable_session_cookie; force_session_cookie=$enableval +else case e in #( + e) enable_session_cookie=$session_mods_enable ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_session_cookie" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_session_cookie" = "static" -o "$enable_session_cookie" = "shared"; then + : + elif test "$enable_session_cookie" = "yes"; then + enable_session_cookie=$module_default + elif test "$enable_session_cookie" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_session_cookie=$module_default + else + enable_session_cookie=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_session_cookie" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_session_cookie=$module_default + else + enable_session_cookie=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_session_cookie" = "all" -o "$enable_session_cookie" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_session_cookie=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_session_cookie=no + fi + elif test "$enable_session_cookie" = "reallyall" -o "$enable_session_cookie" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_session_cookie" != "no" ; then + enable_session_cookie=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_session_cookie=no + fi + else + enable_session_cookie=no + fi + if test "$enable_session_cookie" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_session" = "no" ; then + enable_session_cookie=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_session is disabled but required for mod_session_cookie\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_session is disabled but required for mod_session_cookie\"" >&2;} + elif test "$enable_session_cookie" = "static" && test "$enable_session" != "static" ; then + enable_session_cookie=$enable_session + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_session_cookie shared because mod_session is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_session_cookie shared because mod_session is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_session_cookie" >&5 +printf %s "checking whether to enable mod_session_cookie... " >&6; } + if test "$enable_session_cookie" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_session_cookie has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_session_cookie$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_session_cookie$_apmod_extra_msg" >&6; } + if test "$enable_session_cookie" != "no"; then + case "$enable_session_cookie" in + static*) + MODLIST="$MODLIST session_cookie" + if test "session_cookie" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES session_cookie" + if test "$session_mods_enable" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},session_cookie" + fi + ;; + esac + + + if test -z "$session_cookie_objects"; then + objects="mod_session_cookie.lo" + else + objects="$session_cookie_objects" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_session_cookie.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + +#if APU_HAVE_CRYPTO == 0 +#error no crypto support +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ap_HAVE_APR_CRYPTO="yes" +else case e in #( + e) ap_HAVE_APR_CRYPTO="no" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CPPFLAGS="$saved_CPPFLAGS" + if test $ap_HAVE_APR_CRYPTO = "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Your APR does not include SSL/EVP support. To enable it: configure --with-crypto" >&5 +printf "%s\n" "$as_me: WARNING: Your APR does not include SSL/EVP support. To enable it: configure --with-crypto" >&2;} + if test "$enable_session_crypto" != "" -a "$enable_session_crypto" != "no"; then + as_fn_error $? "mod_session_crypto cannot be enabled" "$LINENO" 5 + fi + session_mods_enable_crypto="no" + fi +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_session_crypto" >&5 +printf %s "checking whether to enable mod_session_crypto... " >&6; } + # Check whether --enable-session-crypto was given. +if test ${enable_session_crypto+y} +then : + enableval=$enable_session_crypto; force_session_crypto=$enableval +else case e in #( + e) enable_session_crypto=$session_mods_enable_crypto ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_session_crypto" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_session_crypto" = "static" -o "$enable_session_crypto" = "shared"; then + : + elif test "$enable_session_crypto" = "yes"; then + enable_session_crypto=$module_default + elif test "$enable_session_crypto" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_session_crypto=$module_default + else + enable_session_crypto=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_session_crypto" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_session_crypto=$module_default + else + enable_session_crypto=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_session_crypto" = "all" -o "$enable_session_crypto" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_session_crypto=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_session_crypto=no + fi + elif test "$enable_session_crypto" = "reallyall" -o "$enable_session_crypto" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_session_crypto" != "no" ; then + enable_session_crypto=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_session_crypto=no + fi + else + enable_session_crypto=no + fi + if test "$enable_session_crypto" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_session" = "no" ; then + enable_session_crypto=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_session is disabled but required for mod_session_crypto\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_session is disabled but required for mod_session_crypto\"" >&2;} + elif test "$enable_session_crypto" = "static" && test "$enable_session" != "static" ; then + enable_session_crypto=$enable_session + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_session_crypto shared because mod_session is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_session_crypto shared because mod_session is built shared\"" >&2;} + else + +if test "$session_mods_enable_crypto" = "no" ; then + enable_session_crypto=no +fi + + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_session_crypto" >&5 +printf %s "checking whether to enable mod_session_crypto... " >&6; } + if test "$enable_session_crypto" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_session_crypto has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_session_crypto$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_session_crypto$_apmod_extra_msg" >&6; } + if test "$enable_session_crypto" != "no"; then + case "$enable_session_crypto" in + static*) + MODLIST="$MODLIST session_crypto" + if test "session_crypto" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES session_crypto" + if test "$session_mods_enable_crypto" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},session_crypto" + fi + ;; + esac + + + if test -z "$session_crypto_objects"; then + objects="mod_session_crypto.lo" + else + objects="$session_crypto_objects" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_session_crypto.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_session_dbd... " >&6; } + # Check whether --enable-session-dbd was given. +if test ${enable_session_dbd+y} +then : + enableval=$enable_session_dbd; force_session_dbd=$enableval +else case e in #( + e) enable_session_dbd=$session_mods_enable ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_session_dbd" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_session_dbd" = "static" -o "$enable_session_dbd" = "shared"; then + : + elif test "$enable_session_dbd" = "yes"; then + enable_session_dbd=$module_default + elif test "$enable_session_dbd" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_session_dbd=$module_default + else + enable_session_dbd=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_session_dbd" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_session_dbd=$module_default + else + enable_session_dbd=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_session_dbd" = "all" -o "$enable_session_dbd" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_session_dbd=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_session_dbd=no + fi + elif test "$enable_session_dbd" = "reallyall" -o "$enable_session_dbd" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_session_dbd" != "no" ; then + enable_session_dbd=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_session_dbd=no + fi + else + enable_session_dbd=no + fi + if test "$enable_session_dbd" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_session" = "no" ; then + enable_session_dbd=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_session is disabled but required for mod_session_dbd\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_session is disabled but required for mod_session_dbd\"" >&2;} + elif test "$enable_session_dbd" = "static" && test "$enable_session" != "static" ; then + enable_session_dbd=$enable_session + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_session_dbd shared because mod_session is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_session_dbd shared because mod_session is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_session_dbd" >&5 +printf %s "checking whether to enable mod_session_dbd... " >&6; } + if test "$enable_session_dbd" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_session_dbd has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_session_dbd$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_session_dbd$_apmod_extra_msg" >&6; } + if test "$enable_session_dbd" != "no"; then + case "$enable_session_dbd" in + static*) + MODLIST="$MODLIST session_dbd" + if test "session_dbd" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES session_dbd" + if test "$session_mods_enable" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},session_dbd" + fi + ;; + esac + + + if test -z "$session_dbd_objects"; then + objects="mod_session_dbd.lo" + else + objects="$session_dbd_objects" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_session_dbd.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + + + current_dir=slotmem + modpath_current=modules/slotmem + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d slotmem || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_slotmem_shm" >&5 +printf %s "checking whether to enable mod_slotmem_shm... " >&6; } + # Check whether --enable-slotmem-shm was given. +if test ${enable_slotmem_shm+y} +then : + enableval=$enable_slotmem_shm; force_slotmem_shm=$enableval +else case e in #( + e) enable_slotmem_shm=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_slotmem_shm" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_slotmem_shm" = "static" -o "$enable_slotmem_shm" = "shared"; then + : + elif test "$enable_slotmem_shm" = "yes"; then + enable_slotmem_shm=$module_default + elif test "$enable_slotmem_shm" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_slotmem_shm=$module_default + else + enable_slotmem_shm=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_slotmem_shm" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_slotmem_shm=$module_default + else + enable_slotmem_shm=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_slotmem_shm" = "all" -o "$enable_slotmem_shm" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_slotmem_shm=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_slotmem_shm=no + fi + elif test "$enable_slotmem_shm" = "reallyall" -o "$enable_slotmem_shm" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_slotmem_shm" != "no" ; then + enable_slotmem_shm=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_slotmem_shm=no + fi + else + enable_slotmem_shm=no + fi + if test "$enable_slotmem_shm" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_slotmem_shm$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_slotmem_shm$_apmod_extra_msg" >&6; } + if test "$enable_slotmem_shm" != "no"; then + case "$enable_slotmem_shm" in + static*) + MODLIST="$MODLIST slotmem_shm" + if test "slotmem_shm" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES slotmem_shm" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},slotmem_shm" + fi + ;; + esac + + + if test -z ""; then + objects="mod_slotmem_shm.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_slotmem_shm.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_slotmem_plain... " >&6; } + # Check whether --enable-slotmem-plain was given. +if test ${enable_slotmem_plain+y} +then : + enableval=$enable_slotmem_plain; force_slotmem_plain=$enableval +else case e in #( + e) enable_slotmem_plain=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_slotmem_plain" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_slotmem_plain" = "static" -o "$enable_slotmem_plain" = "shared"; then + : + elif test "$enable_slotmem_plain" = "yes"; then + enable_slotmem_plain=$module_default + elif test "$enable_slotmem_plain" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_slotmem_plain=$module_default + else + enable_slotmem_plain=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_slotmem_plain" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_slotmem_plain=$module_default + else + enable_slotmem_plain=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_slotmem_plain" = "all" -o "$enable_slotmem_plain" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_slotmem_plain=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_slotmem_plain=no + fi + elif test "$enable_slotmem_plain" = "reallyall" -o "$enable_slotmem_plain" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_slotmem_plain" != "no" ; then + enable_slotmem_plain=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_slotmem_plain=no + fi + else + enable_slotmem_plain=no + fi + if test "$enable_slotmem_plain" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_slotmem_plain$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_slotmem_plain$_apmod_extra_msg" >&6; } + if test "$enable_slotmem_plain" != "no"; then + case "$enable_slotmem_plain" in + static*) + MODLIST="$MODLIST slotmem_plain" + if test "slotmem_plain" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES slotmem_plain" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},slotmem_plain" + fi + ;; + esac + + + if test -z ""; then + objects="mod_slotmem_plain.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_slotmem_plain.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + current_dir=ssl + modpath_current=modules/ssl + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d ssl || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +ssl_objs="mod_ssl.lo ssl_engine_config.lo ssl_engine_init.lo ssl_engine_io.lo ssl_engine_kernel.lo ssl_engine_log.lo ssl_engine_mutex.lo ssl_engine_pphrase.lo ssl_engine_rand.lo ssl_engine_vars.lo ssl_scache.lo ssl_util_stapling.lo ssl_util.lo ssl_util_ssl.lo ssl_engine_ocsp.lo ssl_util_ocsp.lo " + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_ssl" >&5 +printf %s "checking whether to enable mod_ssl... " >&6; } + # Check whether --enable-ssl was given. +if test ${enable_ssl+y} +then : + enableval=$enable_ssl; force_ssl=$enableval +else case e in #( + e) enable_ssl=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_ssl" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_ssl" = "static" -o "$enable_ssl" = "shared"; then + : + elif test "$enable_ssl" = "yes"; then + enable_ssl=$module_default + elif test "$enable_ssl" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_ssl=$module_default + else + enable_ssl=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ssl" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_ssl=$module_default + else + enable_ssl=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ssl" = "all" -o "$enable_ssl" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_ssl=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_ssl=no + fi + elif test "$enable_ssl" = "reallyall" -o "$enable_ssl" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_ssl" != "no" ; then + enable_ssl=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_ssl=no + fi + else + enable_ssl=no + fi + if test "$enable_ssl" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OpenSSL" >&5 +printf %s "checking for OpenSSL... " >&6; } +if test ${ac_cv_openssl+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + ac_cv_openssl=no + ap_openssl_found="" + ap_openssl_base="" + ap_openssl_libs="" + ap_openssl_mod_cflags="" + ap_openssl_mod_ldflags="" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for user-provided OpenSSL base directory" >&5 +printf %s "checking for user-provided OpenSSL base directory... " >&6; } + +# Check whether --with-ssl was given. +if test ${with_ssl+y} +then : + withval=$with_ssl; + if test "x$withval" != "xyes" -a "x$withval" != "x"; then + ap_openssl_base="`cd $withval ; pwd`" + fi + +fi + + if test "x$ap_openssl_base" = "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_openssl_base" >&5 +printf "%s\n" "$ap_openssl_base" >&6; } + fi + + saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" + saved_LDFLAGS="$LDFLAGS" + + if test -n "$PKGCONFIG"; then + saved_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" + if test "x$ap_openssl_base" != "x"; then + if test -f "${ap_openssl_base}/lib/pkgconfig/openssl.pc"; then + PKG_CONFIG_PATH="${ap_openssl_base}/lib/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + elif test -f "${ap_openssl_base}/lib64/pkgconfig/openssl.pc"; then + PKG_CONFIG_PATH="${ap_openssl_base}/lib64/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + fi + fi + # Check whether --enable-ssl-staticlib-deps was given. +if test ${enable_ssl_staticlib_deps+y} +then : + enableval=$enable_ssl_staticlib_deps; + if test "$enableval" = "yes"; then + PKGCONFIG_LIBOPTS="--static" + fi + +fi + + ap_openssl_libs="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-l --silence-errors openssl`" + if test $? -eq 0; then + ap_openssl_found="yes" + pkglookup="`$PKGCONFIG --cflags-only-I openssl`" + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$pkglookup\"" + CPPFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"$pkglookup\"" + MOD_CFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + + if test "x$ab_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting ab_CFLAGS to \"$pkglookup\"" + ab_CFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $ab_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to ab_CFLAGS" + ab_CFLAGS="$ab_CFLAGS $i" + fi + done + fi + + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-L openssl`" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pkglookup\"" + LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$pkglookup\"" + MOD_LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-other openssl`" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pkglookup\"" + LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$pkglookup\"" + MOD_LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + fi + PKG_CONFIG_PATH="$saved_PKG_CONFIG_PATH" + fi + + if test "x$ap_openssl_base" != "x" -a "x$ap_openssl_found" = "x"; then + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"-I$ap_openssl_base/include\"" + CPPFLAGS="-I$ap_openssl_base/include" + else + apr_addto_bugger="-I$ap_openssl_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"-I$ap_openssl_base/include\"" + MOD_CFLAGS="-I$ap_openssl_base/include" + else + apr_addto_bugger="-I$ap_openssl_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + + if test "x$ab_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting ab_CFLAGS to \"-I$ap_openssl_base/include\"" + ab_CFLAGS="-I$ap_openssl_base/include" + else + apr_addto_bugger="-I$ap_openssl_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $ab_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to ab_CFLAGS" + ab_CFLAGS="$ab_CFLAGS $i" + fi + done + fi + + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"-L$ap_openssl_base/lib\"" + LDFLAGS="-L$ap_openssl_base/lib" + else + apr_addto_bugger="-L$ap_openssl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"-L$ap_openssl_base/lib\"" + MOD_LDFLAGS="-L$ap_openssl_base/lib" + else + apr_addto_bugger="-L$ap_openssl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$ap_platform_runtime_link_flag$ap_openssl_base/lib\"" + LDFLAGS="$ap_platform_runtime_link_flag$ap_openssl_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_openssl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_platform_runtime_link_flag$ap_openssl_base/lib\"" + MOD_LDFLAGS="$ap_platform_runtime_link_flag$ap_openssl_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_openssl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + fi + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OpenSSL version >= 0.9.8a" >&5 +printf %s "checking for OpenSSL version >= 0.9.8a... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + +#if !defined(OPENSSL_VERSION_NUMBER) +#error "Missing OpenSSL version" +#endif +#if OPENSSL_VERSION_NUMBER < 0x0090801f +#error "Unsupported OpenSSL version " OPENSSL_VERSION_TEXT +#endif + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: OK" >&5 +printf "%s\n" "OK" >&6; } + ac_cv_openssl=yes +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: FAILED" >&5 +printf "%s\n" "FAILED" >&6; } ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + + if test "x$ac_cv_openssl" = "xyes"; then + ap_openssl_libs="${ap_openssl_libs:--lssl -lcrypto} `$apr_config --libs`" + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_openssl_libs\"" + MOD_LDFLAGS="$ap_openssl_libs" + else + apr_addto_bugger="$ap_openssl_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LIBS to \"$ap_openssl_libs\"" + LIBS="$ap_openssl_libs" + else + apr_addto_bugger="$ap_openssl_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + + test "x$silent" != "xyes" && echo " forcing ab_LIBS to \"$MOD_LDFLAGS\"" + ab_LIBS="$MOD_LDFLAGS" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST ab_CFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST ab_LIBS" + + + + liberrors="" + ac_fn_c_check_header_compile "$LINENO" "openssl/engine.h" "ac_cv_header_openssl_engine_h" "$ac_includes_default" +if test "x$ac_cv_header_openssl_engine_h" = xyes +then : + printf "%s\n" "#define HAVE_OPENSSL_ENGINE_H 1" >>confdefs.h + +fi + + + for ac_func in SSL_CTX_new +do : + ac_fn_c_check_func "$LINENO" "SSL_CTX_new" "ac_cv_func_SSL_CTX_new" +if test "x$ac_cv_func_SSL_CTX_new" = xyes +then : + printf "%s\n" "#define HAVE_SSL_CTX_NEW 1" >>confdefs.h + +else case e in #( + e) liberrors="yes" ;; +esac +fi + +done + ac_fn_c_check_func "$LINENO" "OPENSSL_init_ssl" "ac_cv_func_OPENSSL_init_ssl" +if test "x$ac_cv_func_OPENSSL_init_ssl" = xyes +then : + printf "%s\n" "#define HAVE_OPENSSL_INIT_SSL 1" >>confdefs.h + +fi + + ac_fn_c_check_func "$LINENO" "ENGINE_init" "ac_cv_func_ENGINE_init" +if test "x$ac_cv_func_ENGINE_init" = xyes +then : + printf "%s\n" "#define HAVE_ENGINE_INIT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "ENGINE_load_builtin_engines" "ac_cv_func_ENGINE_load_builtin_engines" +if test "x$ac_cv_func_ENGINE_load_builtin_engines" = xyes +then : + printf "%s\n" "#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "RAND_egd" "ac_cv_func_RAND_egd" +if test "x$ac_cv_func_RAND_egd" = xyes +then : + printf "%s\n" "#define HAVE_RAND_EGD 1" >>confdefs.h + +fi + + if test "x$liberrors" != "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: OpenSSL libraries are unusable" >&5 +printf "%s\n" "$as_me: WARNING: OpenSSL libraries are unusable" >&2;} + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: OpenSSL version is too old" >&5 +printf "%s\n" "$as_me: WARNING: OpenSSL version is too old" >&2;} + fi + + CPPFLAGS="$saved_CPPFLAGS" + LIBS="$saved_LIBS" + LDFLAGS="$saved_LDFLAGS" + + ap_openssl_mod_cflags=$MOD_CFLAGS + ap_openssl_mod_ldflags=$MOD_LDFLAGS + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_openssl" >&5 +printf "%s\n" "$ac_cv_openssl" >&6; } + if test "x$ac_cv_openssl" = "xyes"; then + +printf "%s\n" "#define HAVE_OPENSSL 1" >>confdefs.h + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_openssl_mod_ldflags\"" + MOD_LDFLAGS="$ap_openssl_mod_ldflags" + else + apr_addto_bugger="$ap_openssl_mod_ldflags" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"$ap_openssl_mod_cflags\"" + MOD_CFLAGS="$ap_openssl_mod_cflags" + else + apr_addto_bugger="$ap_openssl_mod_cflags" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + fi + + if test "$ac_cv_openssl" = "yes" ; then + if test "x$enable_ssl" = "xshared"; then + # The only symbol which needs to be exported is the module + # structure, so ask libtool to hide everything else: + + if test "x$MOD_SSL_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_SSL_LDADD to \"-export-symbols-regex ssl_module\"" + MOD_SSL_LDADD="-export-symbols-regex ssl_module" + else + apr_addto_bugger="-export-symbols-regex ssl_module" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_SSL_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_SSL_LDADD" + MOD_SSL_LDADD="$MOD_SSL_LDADD $i" + fi + done + fi + + fi + else + enable_ssl=no + fi + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_ssl" >&5 +printf %s "checking whether to enable mod_ssl... " >&6; } + if test "$enable_ssl" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_ssl has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_ssl$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_ssl$_apmod_extra_msg" >&6; } + if test "$enable_ssl" != "no"; then + case "$enable_ssl" in + static*) + MODLIST="$MODLIST ssl" + if test "ssl" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES ssl" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},ssl" + fi + ;; + esac + + + if test -z "$ssl_objs"; then + objects="mod_ssl.lo" + else + objects="$ssl_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_ssl.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + + current_dir=test + modpath_current=modules/test + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d test || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_optional_hook_export" >&5 +printf %s "checking whether to enable mod_optional_hook_export... " >&6; } + # Check whether --enable-optional-hook-export was given. +if test ${enable_optional_hook_export+y} +then : + enableval=$enable_optional_hook_export; force_optional_hook_export=$enableval +else case e in #( + e) enable_optional_hook_export=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_optional_hook_export" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_optional_hook_export" = "static" -o "$enable_optional_hook_export" = "shared"; then + : + elif test "$enable_optional_hook_export" = "yes"; then + enable_optional_hook_export=$module_default + elif test "$enable_optional_hook_export" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_optional_hook_export=$module_default + else + enable_optional_hook_export=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_hook_export" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_optional_hook_export=$module_default + else + enable_optional_hook_export=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_hook_export" = "all" -o "$enable_optional_hook_export" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_optional_hook_export=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_optional_hook_export=no + fi + elif test "$enable_optional_hook_export" = "reallyall" -o "$enable_optional_hook_export" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_optional_hook_export" != "no" ; then + enable_optional_hook_export=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_optional_hook_export=no + fi + else + enable_optional_hook_export=no + fi + if test "$enable_optional_hook_export" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_optional_hook_export$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_optional_hook_export$_apmod_extra_msg" >&6; } + if test "$enable_optional_hook_export" != "no"; then + case "$enable_optional_hook_export" in + static*) + MODLIST="$MODLIST optional_hook_export" + if test "optional_hook_export" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES optional_hook_export" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},optional_hook_export" + fi + ;; + esac + + + if test -z ""; then + objects="mod_optional_hook_export.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_optional_hook_export.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_optional_hook_import... " >&6; } + # Check whether --enable-optional-hook-import was given. +if test ${enable_optional_hook_import+y} +then : + enableval=$enable_optional_hook_import; force_optional_hook_import=$enableval +else case e in #( + e) enable_optional_hook_import=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_optional_hook_import" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_optional_hook_import" = "static" -o "$enable_optional_hook_import" = "shared"; then + : + elif test "$enable_optional_hook_import" = "yes"; then + enable_optional_hook_import=$module_default + elif test "$enable_optional_hook_import" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_optional_hook_import=$module_default + else + enable_optional_hook_import=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_hook_import" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_optional_hook_import=$module_default + else + enable_optional_hook_import=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_hook_import" = "all" -o "$enable_optional_hook_import" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_optional_hook_import=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_optional_hook_import=no + fi + elif test "$enable_optional_hook_import" = "reallyall" -o "$enable_optional_hook_import" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_optional_hook_import" != "no" ; then + enable_optional_hook_import=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_optional_hook_import=no + fi + else + enable_optional_hook_import=no + fi + if test "$enable_optional_hook_import" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_optional_hook_import$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_optional_hook_import$_apmod_extra_msg" >&6; } + if test "$enable_optional_hook_import" != "no"; then + case "$enable_optional_hook_import" in + static*) + MODLIST="$MODLIST optional_hook_import" + if test "optional_hook_import" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES optional_hook_import" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},optional_hook_import" + fi + ;; + esac + + + if test -z ""; then + objects="mod_optional_hook_import.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_optional_hook_import.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_optional_fn_import... " >&6; } + # Check whether --enable-optional-fn-import was given. +if test ${enable_optional_fn_import+y} +then : + enableval=$enable_optional_fn_import; force_optional_fn_import=$enableval +else case e in #( + e) enable_optional_fn_import=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_optional_fn_import" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_optional_fn_import" = "static" -o "$enable_optional_fn_import" = "shared"; then + : + elif test "$enable_optional_fn_import" = "yes"; then + enable_optional_fn_import=$module_default + elif test "$enable_optional_fn_import" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_optional_fn_import=$module_default + else + enable_optional_fn_import=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_fn_import" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_optional_fn_import=$module_default + else + enable_optional_fn_import=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_fn_import" = "all" -o "$enable_optional_fn_import" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_optional_fn_import=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_optional_fn_import=no + fi + elif test "$enable_optional_fn_import" = "reallyall" -o "$enable_optional_fn_import" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_optional_fn_import" != "no" ; then + enable_optional_fn_import=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_optional_fn_import=no + fi + else + enable_optional_fn_import=no + fi + if test "$enable_optional_fn_import" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_optional_fn_import$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_optional_fn_import$_apmod_extra_msg" >&6; } + if test "$enable_optional_fn_import" != "no"; then + case "$enable_optional_fn_import" in + static*) + MODLIST="$MODLIST optional_fn_import" + if test "optional_fn_import" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES optional_fn_import" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},optional_fn_import" + fi + ;; + esac + + + if test -z ""; then + objects="mod_optional_fn_import.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_optional_fn_import.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_optional_fn_export... " >&6; } + # Check whether --enable-optional-fn-export was given. +if test ${enable_optional_fn_export+y} +then : + enableval=$enable_optional_fn_export; force_optional_fn_export=$enableval +else case e in #( + e) enable_optional_fn_export=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_optional_fn_export" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_optional_fn_export" = "static" -o "$enable_optional_fn_export" = "shared"; then + : + elif test "$enable_optional_fn_export" = "yes"; then + enable_optional_fn_export=$module_default + elif test "$enable_optional_fn_export" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_optional_fn_export=$module_default + else + enable_optional_fn_export=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_fn_export" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_optional_fn_export=$module_default + else + enable_optional_fn_export=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_fn_export" = "all" -o "$enable_optional_fn_export" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_optional_fn_export=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_optional_fn_export=no + fi + elif test "$enable_optional_fn_export" = "reallyall" -o "$enable_optional_fn_export" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_optional_fn_export" != "no" ; then + enable_optional_fn_export=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_optional_fn_export=no + fi + else + enable_optional_fn_export=no + fi + if test "$enable_optional_fn_export" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_optional_fn_export$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_optional_fn_export$_apmod_extra_msg" >&6; } + if test "$enable_optional_fn_export" != "no"; then + case "$enable_optional_fn_export" in + static*) + MODLIST="$MODLIST optional_fn_export" + if test "optional_fn_export" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES optional_fn_export" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},optional_fn_export" + fi + ;; + esac + + + if test -z ""; then + objects="mod_optional_fn_export.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_optional_fn_export.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_dialup... " >&6; } + # Check whether --enable-dialup was given. +if test ${enable_dialup+y} +then : + enableval=$enable_dialup; force_dialup=$enableval +else case e in #( + e) enable_dialup=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_dialup" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_dialup" = "static" -o "$enable_dialup" = "shared"; then + : + elif test "$enable_dialup" = "yes"; then + enable_dialup=$module_default + elif test "$enable_dialup" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_dialup=$module_default + else + enable_dialup=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dialup" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_dialup=$module_default + else + enable_dialup=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dialup" = "all" -o "$enable_dialup" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_dialup=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_dialup=no + fi + elif test "$enable_dialup" = "reallyall" -o "$enable_dialup" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_dialup" != "no" ; then + enable_dialup=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_dialup=no + fi + else + enable_dialup=no + fi + if test "$enable_dialup" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_dialup$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_dialup$_apmod_extra_msg" >&6; } + if test "$enable_dialup" != "no"; then + case "$enable_dialup" in + static*) + MODLIST="$MODLIST dialup" + if test "dialup" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES dialup" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},dialup" + fi + ;; + esac + + + if test -z ""; then + objects="mod_dialup.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_dialup.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for target platform" >&5 +printf %s "checking for target platform... " >&6; } + +case $host in +*pc-os2-emx*) + OS="os2" + OS_DIR=$OS + ;; +bs2000*) + OS="unix" + OS_DIR=$OS + ;; +*cygwin*) + OS="cygwin" + OS_DIR="unix" + ;; +*mingw32*) + OS="win32" + OS_DIR=$OS + ;; +*) + OS="unix" + OS_DIR=$OS;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OS" >&5 +printf "%s\n" "$OS" >&6; } + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES os/${OS_DIR}/Makefile" + + +if test "$OS" = "os2" ; then + + if test "x$CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CFLAGS to \"-DOS2 -O2\"" + CFLAGS="-DOS2 -O2" + else + apr_addto_bugger="-DOS2 -O2" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + +fi + +if test "$OS" = "unix" ; then + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for rlim_t" >&5 +printf %s "checking for rlim_t... " >&6; } +if test ${ac_cv_type_rlim_t+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +int +main (void) +{ +rlim_t spoon; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + ac_cv_type_rlim_t=yes + +else case e in #( + e) ac_cv_type_rlim_t=no + ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_rlim_t" >&5 +printf "%s\n" "$ac_cv_type_rlim_t" >&6; } + if test "$ac_cv_type_rlim_t" = "no" ; then + +printf "%s\n" "#define rlim_t int" >>confdefs.h + + fi + + + ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_time_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/resource.h" "ac_cv_header_sys_resource_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_resource_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_RESOURCE_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/sem.h" "ac_cv_header_sys_sem_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_sem_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SEM_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/ipc.h" "ac_cv_header_sys_ipc_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ipc_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_IPC_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_func "$LINENO" "setsid" "ac_cv_func_setsid" +if test "x$ac_cv_func_setsid" = xyes +then : + printf "%s\n" "#define HAVE_SETSID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "killpg" "ac_cv_func_killpg" +if test "x$ac_cv_func_killpg" = xyes +then : + printf "%s\n" "#define HAVE_KILLPG 1" >>confdefs.h + +fi + +fi + + + +ac_fn_c_check_header_compile "$LINENO" "bstring.h" "ac_cv_header_bstring_h" "$ac_includes_default" +if test "x$ac_cv_header_bstring_h" = xyes +then : + printf "%s\n" "#define HAVE_BSTRING_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +if test "x$ac_cv_header_unistd_h" = xyes +then : + printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h + +fi + + + + +ac_fn_c_check_func "$LINENO" "syslog" "ac_cv_func_syslog" +if test "x$ac_cv_func_syslog" = xyes +then : + printf "%s\n" "#define HAVE_SYSLOG 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_compile "$LINENO" "sys/times.h" "ac_cv_header_sys_times_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_times_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TIMES_H 1" >>confdefs.h + +fi + + ac_fn_c_check_func "$LINENO" "times" "ac_cv_func_times" +if test "x$ac_cv_func_times" = xyes +then : + printf "%s\n" "#define HAVE_TIMES 1" >>confdefs.h + +fi + + +# util_expr needs header files in server source dir + + if test "x$INCLUDES" = "x"; then + test "x$silent" != "xyes" && echo " setting INCLUDES to \"-I\$(top_srcdir)/server\"" + INCLUDES="-I\$(top_srcdir)/server" + else + apr_addto_bugger="-I\$(top_srcdir)/server" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $INCLUDES; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + + + + +apr_old_cppflags=$CPPFLAGS +CPPFLAGS="$CPPFLAGS $INCLUDES" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if APR_HAS_THREADS +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP_TRADITIONAL "YES_IS_DEFINED" >/dev/null 2>&1 +then : + ac_cv_define_APR_HAS_THREADS=yes +else case e in #( + e) ac_cv_define_APR_HAS_THREADS=no ;; +esac +fi +rm -rf conftest* + +CPPFLAGS=$apr_old_cppflags + + +have_threaded_sig_graceful=yes +case $host in + *-linux-*) + case `uname -r` in + 2.0* ) + have_threaded_sig_graceful=no + ;; + esac + ;; +esac + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether APR supports thread-safe pollsets" >&5 +printf %s "checking whether APR supports thread-safe pollsets... " >&6; } +if test ${ac_cv_have_threadsafe_pollset+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + case $host in + *-apple-darwin[1-9].*) + + if test -z "$ac_cv_func_kqueue"; then + test "x$silent" != "xyes" && echo " setting ac_cv_func_kqueue to \"no\"" + ac_cv_func_kqueue="no" + fi + + ;; + esac + ac_fn_c_check_func "$LINENO" "kqueue" "ac_cv_func_kqueue" +if test "x$ac_cv_func_kqueue" = xyes +then : + printf "%s\n" "#define HAVE_KQUEUE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "port_create" "ac_cv_func_port_create" +if test "x$ac_cv_func_port_create" = xyes +then : + printf "%s\n" "#define HAVE_PORT_CREATE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "epoll_create" "ac_cv_func_epoll_create" +if test "x$ac_cv_func_epoll_create" = xyes +then : + printf "%s\n" "#define HAVE_EPOLL_CREATE 1" >>confdefs.h + +fi + + if test "$ac_cv_func_kqueue$ac_cv_func_port_create$ac_cv_func_epoll_create" != "nonono"; then + ac_cv_have_threadsafe_pollset=yes + else + ac_cv_have_threadsafe_pollset=no + fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_threadsafe_pollset" >&5 +printf "%s\n" "$ac_cv_have_threadsafe_pollset" >&6; } + +case $APR_VERSION in + 1.4*) + apr_has_skiplist=no + ;; + *) + apr_has_skiplist=yes +esac + +case $host in + *mingw32* | *os2-emx*) + forking_mpms_supported=no + ;; + *) + forking_mpms_supported=yes + ;; +esac + + + +ap_mpm_is_supported () +{ + eval "tmp=\$ap_supported_mpm_$1" + if test -z "$tmp"; then + return 1 + else + return 0 + fi +} + +ap_mpm_supports_shared () +{ + eval "tmp=\$ap_supported_mpm_$1" + if test "$tmp" = "shared"; then + return 0 + else + return 1 + fi +} + +ap_mpm_is_threaded () +{ + if test "$mpm_build" = "shared" -a ac_cv_define_APR_HAS_THREADS = "yes"; then + return 0 + fi + + for mpm in $ap_enabled_mpms; do + eval "tmp=\$ap_threaded_mpm_$mpm" + if test "$tmp" = "yes"; then + return 0 + fi + done + return 1 +} + +ap_mpm_is_enabled () +{ + eval "tmp=\$ap_enabled_mpm_$1" + if test "$tmp" = "yes"; then + return 0 + else + return 1 + fi +} + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if event MPM supports this platform" >&5 +printf %s "checking if event MPM supports this platform... " >&6; } +if test $forking_mpms_supported != yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no - This is not a forking platform" >&5 +printf "%s\n" "no - This is not a forking platform" >&6; } +elif test $ac_cv_define_APR_HAS_THREADS != yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no - APR does not support threads" >&5 +printf "%s\n" "no - APR does not support threads" >&6; } +elif test $have_threaded_sig_graceful != yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no - SIG_GRACEFUL cannot be used with a threaded MPM" >&5 +printf "%s\n" "no - SIG_GRACEFUL cannot be used with a threaded MPM" >&6; } +elif test $ac_cv_have_threadsafe_pollset != yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no - APR_POLLSET_THREADSAFE is not supported" >&5 +printf "%s\n" "no - APR_POLLSET_THREADSAFE is not supported" >&6; } +elif test $apr_has_skiplist != yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no - APR skiplist is not available" >&5 +printf "%s\n" "no - APR skiplist is not available" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + + if test "yes" = "yes"; then + eval "ap_supported_mpm_event=shared" + ap_supported_shared_mpms="$ap_supported_shared_mpms event " + else + eval "ap_supported_mpm_event=static" + fi + if test "yes" = "yes"; then + eval "ap_threaded_mpm_event=yes" + fi + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if mpmt_os2 MPM supports this platform" >&5 +printf %s "checking if mpmt_os2 MPM supports this platform... " >&6; } +case $host in + *os2-emx*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + + if test "no" = "yes"; then + eval "ap_supported_mpm_mpmt_os2=shared" + ap_supported_shared_mpms="$ap_supported_shared_mpms mpmt_os2 " + else + eval "ap_supported_mpm_mpmt_os2=static" + fi + if test "yes" = "yes"; then + eval "ap_threaded_mpm_mpmt_os2=yes" + fi + + ;; + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if prefork MPM supports this platform" >&5 +printf %s "checking if prefork MPM supports this platform... " >&6; } +if test $forking_mpms_supported != yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no - This is not a forking platform" >&5 +printf "%s\n" "no - This is not a forking platform" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + + if test "yes" = "yes"; then + eval "ap_supported_mpm_prefork=shared" + ap_supported_shared_mpms="$ap_supported_shared_mpms prefork " + else + eval "ap_supported_mpm_prefork=static" + fi + if test "no" = "yes"; then + eval "ap_threaded_mpm_prefork=yes" + fi + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if WinNT MPM supports this platform" >&5 +printf %s "checking if WinNT MPM supports this platform... " >&6; } +case $host in + *mingw32*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + + if test "no" = "yes"; then + eval "ap_supported_mpm_winnt=shared" + ap_supported_shared_mpms="$ap_supported_shared_mpms winnt " + else + eval "ap_supported_mpm_winnt=static" + fi + if test "yes" = "yes"; then + eval "ap_threaded_mpm_winnt=yes" + fi + + ;; + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if worker MPM supports this platform" >&5 +printf %s "checking if worker MPM supports this platform... " >&6; } +if test $forking_mpms_supported != yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no - This is not a forking platform" >&5 +printf "%s\n" "no - This is not a forking platform" >&6; } +elif test $ac_cv_define_APR_HAS_THREADS != yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no - APR does not support threads" >&5 +printf "%s\n" "no - APR does not support threads" >&6; } +elif test $have_threaded_sig_graceful != yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no - SIG_GRACEFUL cannot be used with a threaded MPM" >&5 +printf "%s\n" "no - SIG_GRACEFUL cannot be used with a threaded MPM" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + + if test "yes" = "yes"; then + eval "ap_supported_mpm_worker=shared" + ap_supported_shared_mpms="$ap_supported_shared_mpms worker " + else + eval "ap_supported_mpm_worker=static" + fi + if test "yes" = "yes"; then + eval "ap_threaded_mpm_worker=yes" + fi + +fi + +htpasswd_LTFLAGS="" +htdigest_LTFLAGS="" +rotatelogs_LTFLAGS="" +logresolve_LTFLAGS="" +htdbm_LTFLAGS="" +ab_LTFLAGS="" +checkgid_LTFLAGS="" +htcacheclean_LTFLAGS="" +httxt2dbm_LTFLAGS="" +fcgistarter_LTFLAGS="" + +# Check whether --enable-static-support was given. +if test ${enable_static_support+y} +then : + enableval=$enable_static_support; +if test "$enableval" = "yes" ; then + + if test "x$htpasswd_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting htpasswd_LTFLAGS to \"-static\"" + htpasswd_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $htpasswd_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to htpasswd_LTFLAGS" + htpasswd_LTFLAGS="$htpasswd_LTFLAGS $i" + fi + done + fi + + + if test "x$htdigest_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting htdigest_LTFLAGS to \"-static\"" + htdigest_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $htdigest_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to htdigest_LTFLAGS" + htdigest_LTFLAGS="$htdigest_LTFLAGS $i" + fi + done + fi + + + if test "x$rotatelogs_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting rotatelogs_LTFLAGS to \"-static\"" + rotatelogs_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $rotatelogs_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to rotatelogs_LTFLAGS" + rotatelogs_LTFLAGS="$rotatelogs_LTFLAGS $i" + fi + done + fi + + + if test "x$logresolve_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting logresolve_LTFLAGS to \"-static\"" + logresolve_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $logresolve_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to logresolve_LTFLAGS" + logresolve_LTFLAGS="$logresolve_LTFLAGS $i" + fi + done + fi + + + if test "x$htdbm_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting htdbm_LTFLAGS to \"-static\"" + htdbm_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $htdbm_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to htdbm_LTFLAGS" + htdbm_LTFLAGS="$htdbm_LTFLAGS $i" + fi + done + fi + + + if test "x$ab_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting ab_LTFLAGS to \"-static\"" + ab_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $ab_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to ab_LTFLAGS" + ab_LTFLAGS="$ab_LTFLAGS $i" + fi + done + fi + + + if test "x$checkgid_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting checkgid_LTFLAGS to \"-static\"" + checkgid_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $checkgid_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to checkgid_LTFLAGS" + checkgid_LTFLAGS="$checkgid_LTFLAGS $i" + fi + done + fi + + + if test "x$htcacheclean_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting htcacheclean_LTFLAGS to \"-static\"" + htcacheclean_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $htcacheclean_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to htcacheclean_LTFLAGS" + htcacheclean_LTFLAGS="$htcacheclean_LTFLAGS $i" + fi + done + fi + + + if test "x$httxt2dbm_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting httxt2dbm_LTFLAGS to \"-static\"" + httxt2dbm_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $httxt2dbm_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to httxt2dbm_LTFLAGS" + httxt2dbm_LTFLAGS="$httxt2dbm_LTFLAGS $i" + fi + done + fi + + + if test "x$fcgistarter_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting fcgistarter_LTFLAGS to \"-static\"" + fcgistarter_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $fcgistarter_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to fcgistarter_LTFLAGS" + fcgistarter_LTFLAGS="$fcgistarter_LTFLAGS $i" + fi + done + fi + +fi + +fi + + +# Check whether --enable-static-htpasswd was given. +if test ${enable_static_htpasswd+y} +then : + enableval=$enable_static_htpasswd; +if test "$enableval" = "yes" ; then + + if test "x$htpasswd_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting htpasswd_LTFLAGS to \"-static\"" + htpasswd_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $htpasswd_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to htpasswd_LTFLAGS" + htpasswd_LTFLAGS="$htpasswd_LTFLAGS $i" + fi + done + fi + +else + + if test "x$htpasswd_LTFLAGS" = "x-static"; then + test "x$silent" != "xyes" && echo " nulling htpasswd_LTFLAGS" + htpasswd_LTFLAGS="" + else + apr_new_bugger="" + apr_removed=0 + for i in $htpasswd_LTFLAGS; do + if test "x$i" != "x-static"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + test "x$silent" != "xyes" && echo " removed \"-static\" from htpasswd_LTFLAGS" + htpasswd_LTFLAGS=$apr_new_bugger + fi + fi + +fi + +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST htpasswd_LTFLAGS" + + + +# Check whether --enable-static-htdigest was given. +if test ${enable_static_htdigest+y} +then : + enableval=$enable_static_htdigest; +if test "$enableval" = "yes" ; then + + if test "x$htdigest_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting htdigest_LTFLAGS to \"-static\"" + htdigest_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $htdigest_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to htdigest_LTFLAGS" + htdigest_LTFLAGS="$htdigest_LTFLAGS $i" + fi + done + fi + +else + + if test "x$htdigest_LTFLAGS" = "x-static"; then + test "x$silent" != "xyes" && echo " nulling htdigest_LTFLAGS" + htdigest_LTFLAGS="" + else + apr_new_bugger="" + apr_removed=0 + for i in $htdigest_LTFLAGS; do + if test "x$i" != "x-static"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + test "x$silent" != "xyes" && echo " removed \"-static\" from htdigest_LTFLAGS" + htdigest_LTFLAGS=$apr_new_bugger + fi + fi + +fi + +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST htdigest_LTFLAGS" + + + +# Check whether --enable-static-rotatelogs was given. +if test ${enable_static_rotatelogs+y} +then : + enableval=$enable_static_rotatelogs; +if test "$enableval" = "yes" ; then + + if test "x$rotatelogs_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting rotatelogs_LTFLAGS to \"-static\"" + rotatelogs_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $rotatelogs_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to rotatelogs_LTFLAGS" + rotatelogs_LTFLAGS="$rotatelogs_LTFLAGS $i" + fi + done + fi + +else + + if test "x$rotatelogs_LTFLAGS" = "x-static"; then + test "x$silent" != "xyes" && echo " nulling rotatelogs_LTFLAGS" + rotatelogs_LTFLAGS="" + else + apr_new_bugger="" + apr_removed=0 + for i in $rotatelogs_LTFLAGS; do + if test "x$i" != "x-static"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + test "x$silent" != "xyes" && echo " removed \"-static\" from rotatelogs_LTFLAGS" + rotatelogs_LTFLAGS=$apr_new_bugger + fi + fi + +fi + +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST rotatelogs_LTFLAGS" + + + +# Check whether --enable-static-logresolve was given. +if test ${enable_static_logresolve+y} +then : + enableval=$enable_static_logresolve; +if test "$enableval" = "yes" ; then + + if test "x$logresolve_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting logresolve_LTFLAGS to \"-static\"" + logresolve_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $logresolve_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to logresolve_LTFLAGS" + logresolve_LTFLAGS="$logresolve_LTFLAGS $i" + fi + done + fi + +else + + if test "x$logresolve_LTFLAGS" = "x-static"; then + test "x$silent" != "xyes" && echo " nulling logresolve_LTFLAGS" + logresolve_LTFLAGS="" + else + apr_new_bugger="" + apr_removed=0 + for i in $logresolve_LTFLAGS; do + if test "x$i" != "x-static"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + test "x$silent" != "xyes" && echo " removed \"-static\" from logresolve_LTFLAGS" + logresolve_LTFLAGS=$apr_new_bugger + fi + fi + +fi + +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST logresolve_LTFLAGS" + + + +# Check whether --enable-static-htdbm was given. +if test ${enable_static_htdbm+y} +then : + enableval=$enable_static_htdbm; +if test "$enableval" = "yes" ; then + + if test "x$htdbm_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting htdbm_LTFLAGS to \"-static\"" + htdbm_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $htdbm_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to htdbm_LTFLAGS" + htdbm_LTFLAGS="$htdbm_LTFLAGS $i" + fi + done + fi + +else + + if test "x$htdbm_LTFLAGS" = "x-static"; then + test "x$silent" != "xyes" && echo " nulling htdbm_LTFLAGS" + htdbm_LTFLAGS="" + else + apr_new_bugger="" + apr_removed=0 + for i in $htdbm_LTFLAGS; do + if test "x$i" != "x-static"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + test "x$silent" != "xyes" && echo " removed \"-static\" from htdbm_LTFLAGS" + htdbm_LTFLAGS=$apr_new_bugger + fi + fi + +fi + +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST htdbm_LTFLAGS" + + + +# Check whether --enable-static-ab was given. +if test ${enable_static_ab+y} +then : + enableval=$enable_static_ab; +if test "$enableval" = "yes" ; then + + if test "x$ab_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting ab_LTFLAGS to \"-static\"" + ab_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $ab_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to ab_LTFLAGS" + ab_LTFLAGS="$ab_LTFLAGS $i" + fi + done + fi + +else + + if test "x$ab_LTFLAGS" = "x-static"; then + test "x$silent" != "xyes" && echo " nulling ab_LTFLAGS" + ab_LTFLAGS="" + else + apr_new_bugger="" + apr_removed=0 + for i in $ab_LTFLAGS; do + if test "x$i" != "x-static"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + test "x$silent" != "xyes" && echo " removed \"-static\" from ab_LTFLAGS" + ab_LTFLAGS=$apr_new_bugger + fi + fi + +fi + +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST ab_LTFLAGS" + + + +# Check whether --enable-static-checkgid was given. +if test ${enable_static_checkgid+y} +then : + enableval=$enable_static_checkgid; +if test "$enableval" = "yes" ; then + + if test "x$checkgid_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting checkgid_LTFLAGS to \"-static\"" + checkgid_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $checkgid_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to checkgid_LTFLAGS" + checkgid_LTFLAGS="$checkgid_LTFLAGS $i" + fi + done + fi + +else + + if test "x$checkgid_LTFLAGS" = "x-static"; then + test "x$silent" != "xyes" && echo " nulling checkgid_LTFLAGS" + checkgid_LTFLAGS="" + else + apr_new_bugger="" + apr_removed=0 + for i in $checkgid_LTFLAGS; do + if test "x$i" != "x-static"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + test "x$silent" != "xyes" && echo " removed \"-static\" from checkgid_LTFLAGS" + checkgid_LTFLAGS=$apr_new_bugger + fi + fi + +fi + +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST checkgid_LTFLAGS" + + + +# Check whether --enable-static-htcacheclean was given. +if test ${enable_static_htcacheclean+y} +then : + enableval=$enable_static_htcacheclean; +if test "$enableval" = "yes" ; then + + if test "x$htcacheclean_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting htcacheclean_LTFLAGS to \"-static\"" + htcacheclean_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $htcacheclean_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to htcacheclean_LTFLAGS" + htcacheclean_LTFLAGS="$htcacheclean_LTFLAGS $i" + fi + done + fi + +else + + if test "x$htcacheclean_LTFLAGS" = "x-static"; then + test "x$silent" != "xyes" && echo " nulling htcacheclean_LTFLAGS" + htcacheclean_LTFLAGS="" + else + apr_new_bugger="" + apr_removed=0 + for i in $htcacheclean_LTFLAGS; do + if test "x$i" != "x-static"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + test "x$silent" != "xyes" && echo " removed \"-static\" from htcacheclean_LTFLAGS" + htcacheclean_LTFLAGS=$apr_new_bugger + fi + fi + +fi + +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST htcacheclean_LTFLAGS" + + + +# Check whether --enable-static-httxt2dbm was given. +if test ${enable_static_httxt2dbm+y} +then : + enableval=$enable_static_httxt2dbm; +if test "$enableval" = "yes" ; then + + if test "x$httxt2dbm_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting httxt2dbm_LTFLAGS to \"-static\"" + httxt2dbm_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $httxt2dbm_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to httxt2dbm_LTFLAGS" + httxt2dbm_LTFLAGS="$httxt2dbm_LTFLAGS $i" + fi + done + fi + +else + + if test "x$httxt2dbm" = "x-static"; then + test "x$silent" != "xyes" && echo " nulling httxt2dbm" + httxt2dbm="" + else + apr_new_bugger="" + apr_removed=0 + for i in $httxt2dbm; do + if test "x$i" != "x-static"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + test "x$silent" != "xyes" && echo " removed \"-static\" from httxt2dbm" + httxt2dbm=$apr_new_bugger + fi + fi + +fi + +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST httxt2dbm_LTFLAGS" + + + +# Check whether --enable-static-fcgistarter was given. +if test ${enable_static_fcgistarter+y} +then : + enableval=$enable_static_fcgistarter; +if test "$enableval" = "yes" ; then + + if test "x$fcgistarter_LTFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting fcgistarter_LTFLAGS to \"-static\"" + fcgistarter_LTFLAGS="-static" + else + apr_addto_bugger="-static" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $fcgistarter_LTFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to fcgistarter_LTFLAGS" + fcgistarter_LTFLAGS="$fcgistarter_LTFLAGS $i" + fi + done + fi + +else + + if test "x$fcgistarter" = "x-static"; then + test "x$silent" != "xyes" && echo " nulling fcgistarter" + fcgistarter="" + else + apr_new_bugger="" + apr_removed=0 + for i in $fcgistarter; do + if test "x$i" != "x-static"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + test "x$silent" != "xyes" && echo " removed \"-static\" from fcgistarter" + fcgistarter=$apr_new_bugger + fi + fi + +fi + +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST fcgistarter_LTFLAGS" + + + +# Configure or check which of the non-portable support programs can be enabled. + +NONPORTABLE_SUPPORT="" +case $host in + *mingw*) + ;; + *) + NONPORTABLE_SUPPORT="checkgid fcgistarter" + ;; +esac + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST NONPORTABLE_SUPPORT" + + + +# Configure the ulimit -n command used by apachectl. + +case $host in + *aix*) + # this works in any locale, unlike the default command below, which + # fails in a non-English locale if the hard limit is unlimited + # since the display of the limit will translate "unlimited", but + # ulimit only accepts English "unlimited" on input + APACHECTL_ULIMIT="ulimit -S -n unlimited" + ;; + *alpha*-dec-osf*) + # Tru64: -H is for setting, not retrieving + APACHECTL_ULIMIT="ulimit -S -n \`ulimit -h -n\`" + ;; + *) + if TMP_ULIMIT=`ulimit -H -n` && ulimit -S -n $TMP_ULIMIT >/dev/null 2>&1; then + APACHECTL_ULIMIT="ulimit -S -n \`ulimit -H -n\`" + else + APACHECTL_ULIMIT="" + fi + ;; +esac + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST APACHECTL_ULIMIT" + + + + + + current_dir=http2 + modpath_current=modules/http2 + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d http2 || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +http2_objs="mod_http2.lo h2_bucket_beam.lo h2_bucket_eos.lo h2_c1.lo h2_c1_io.lo h2_c2.lo h2_c2_filter.lo h2_config.lo h2_conn_ctx.lo h2_headers.lo h2_mplx.lo h2_protocol.lo h2_push.lo h2_request.lo h2_session.lo h2_stream.lo h2_switch.lo h2_util.lo h2_workers.lo h2_ws.lo " + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_http2" >&5 +printf %s "checking whether to enable mod_http2... " >&6; } + # Check whether --enable-http2 was given. +if test ${enable_http2+y} +then : + enableval=$enable_http2; force_http2=$enableval +else case e in #( + e) enable_http2=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_http2" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_http2" = "static" -o "$enable_http2" = "shared"; then + : + elif test "$enable_http2" = "yes"; then + enable_http2=$module_default + elif test "$enable_http2" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_http2=$module_default + else + enable_http2=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_http2" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_http2=$module_default + else + enable_http2=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_http2" = "all" -o "$enable_http2" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_http2=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_http2=no + fi + elif test "$enable_http2" = "reallyall" -o "$enable_http2" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_http2" != "no" ; then + enable_http2=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_http2=no + fi + else + enable_http2=no + fi + if test "$enable_http2" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OpenSSL" >&5 +printf %s "checking for OpenSSL... " >&6; } +if test ${ac_cv_openssl+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + ac_cv_openssl=no + ap_openssl_found="" + ap_openssl_base="" + ap_openssl_libs="" + ap_openssl_mod_cflags="" + ap_openssl_mod_ldflags="" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for user-provided OpenSSL base directory" >&5 +printf %s "checking for user-provided OpenSSL base directory... " >&6; } + +# Check whether --with-ssl was given. +if test ${with_ssl+y} +then : + withval=$with_ssl; + if test "x$withval" != "xyes" -a "x$withval" != "x"; then + ap_openssl_base="`cd $withval ; pwd`" + fi + +fi + + if test "x$ap_openssl_base" = "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_openssl_base" >&5 +printf "%s\n" "$ap_openssl_base" >&6; } + fi + + saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" + saved_LDFLAGS="$LDFLAGS" + + if test -n "$PKGCONFIG"; then + saved_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" + if test "x$ap_openssl_base" != "x"; then + if test -f "${ap_openssl_base}/lib/pkgconfig/openssl.pc"; then + PKG_CONFIG_PATH="${ap_openssl_base}/lib/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + elif test -f "${ap_openssl_base}/lib64/pkgconfig/openssl.pc"; then + PKG_CONFIG_PATH="${ap_openssl_base}/lib64/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + fi + fi + # Check whether --enable-ssl-staticlib-deps was given. +if test ${enable_ssl_staticlib_deps+y} +then : + enableval=$enable_ssl_staticlib_deps; + if test "$enableval" = "yes"; then + PKGCONFIG_LIBOPTS="--static" + fi + +fi + + ap_openssl_libs="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-l --silence-errors openssl`" + if test $? -eq 0; then + ap_openssl_found="yes" + pkglookup="`$PKGCONFIG --cflags-only-I openssl`" + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$pkglookup\"" + CPPFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"$pkglookup\"" + MOD_CFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + + if test "x$ab_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting ab_CFLAGS to \"$pkglookup\"" + ab_CFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $ab_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to ab_CFLAGS" + ab_CFLAGS="$ab_CFLAGS $i" + fi + done + fi + + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-L openssl`" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pkglookup\"" + LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$pkglookup\"" + MOD_LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-other openssl`" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pkglookup\"" + LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$pkglookup\"" + MOD_LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + fi + PKG_CONFIG_PATH="$saved_PKG_CONFIG_PATH" + fi + + if test "x$ap_openssl_base" != "x" -a "x$ap_openssl_found" = "x"; then + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"-I$ap_openssl_base/include\"" + CPPFLAGS="-I$ap_openssl_base/include" + else + apr_addto_bugger="-I$ap_openssl_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"-I$ap_openssl_base/include\"" + MOD_CFLAGS="-I$ap_openssl_base/include" + else + apr_addto_bugger="-I$ap_openssl_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + + if test "x$ab_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting ab_CFLAGS to \"-I$ap_openssl_base/include\"" + ab_CFLAGS="-I$ap_openssl_base/include" + else + apr_addto_bugger="-I$ap_openssl_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $ab_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to ab_CFLAGS" + ab_CFLAGS="$ab_CFLAGS $i" + fi + done + fi + + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"-L$ap_openssl_base/lib\"" + LDFLAGS="-L$ap_openssl_base/lib" + else + apr_addto_bugger="-L$ap_openssl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"-L$ap_openssl_base/lib\"" + MOD_LDFLAGS="-L$ap_openssl_base/lib" + else + apr_addto_bugger="-L$ap_openssl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$ap_platform_runtime_link_flag$ap_openssl_base/lib\"" + LDFLAGS="$ap_platform_runtime_link_flag$ap_openssl_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_openssl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_platform_runtime_link_flag$ap_openssl_base/lib\"" + MOD_LDFLAGS="$ap_platform_runtime_link_flag$ap_openssl_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_openssl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + fi + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OpenSSL version >= 0.9.8a" >&5 +printf %s "checking for OpenSSL version >= 0.9.8a... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + +#if !defined(OPENSSL_VERSION_NUMBER) +#error "Missing OpenSSL version" +#endif +#if OPENSSL_VERSION_NUMBER < 0x0090801f +#error "Unsupported OpenSSL version " OPENSSL_VERSION_TEXT +#endif + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: OK" >&5 +printf "%s\n" "OK" >&6; } + ac_cv_openssl=yes +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: FAILED" >&5 +printf "%s\n" "FAILED" >&6; } ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + + if test "x$ac_cv_openssl" = "xyes"; then + ap_openssl_libs="${ap_openssl_libs:--lssl -lcrypto} `$apr_config --libs`" + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_openssl_libs\"" + MOD_LDFLAGS="$ap_openssl_libs" + else + apr_addto_bugger="$ap_openssl_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LIBS to \"$ap_openssl_libs\"" + LIBS="$ap_openssl_libs" + else + apr_addto_bugger="$ap_openssl_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + + test "x$silent" != "xyes" && echo " forcing ab_LIBS to \"$MOD_LDFLAGS\"" + ab_LIBS="$MOD_LDFLAGS" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST ab_CFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST ab_LIBS" + + + + liberrors="" + ac_fn_c_check_header_compile "$LINENO" "openssl/engine.h" "ac_cv_header_openssl_engine_h" "$ac_includes_default" +if test "x$ac_cv_header_openssl_engine_h" = xyes +then : + printf "%s\n" "#define HAVE_OPENSSL_ENGINE_H 1" >>confdefs.h + +fi + + + for ac_func in SSL_CTX_new +do : + ac_fn_c_check_func "$LINENO" "SSL_CTX_new" "ac_cv_func_SSL_CTX_new" +if test "x$ac_cv_func_SSL_CTX_new" = xyes +then : + printf "%s\n" "#define HAVE_SSL_CTX_NEW 1" >>confdefs.h + +else case e in #( + e) liberrors="yes" ;; +esac +fi + +done + ac_fn_c_check_func "$LINENO" "OPENSSL_init_ssl" "ac_cv_func_OPENSSL_init_ssl" +if test "x$ac_cv_func_OPENSSL_init_ssl" = xyes +then : + printf "%s\n" "#define HAVE_OPENSSL_INIT_SSL 1" >>confdefs.h + +fi + + ac_fn_c_check_func "$LINENO" "ENGINE_init" "ac_cv_func_ENGINE_init" +if test "x$ac_cv_func_ENGINE_init" = xyes +then : + printf "%s\n" "#define HAVE_ENGINE_INIT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "ENGINE_load_builtin_engines" "ac_cv_func_ENGINE_load_builtin_engines" +if test "x$ac_cv_func_ENGINE_load_builtin_engines" = xyes +then : + printf "%s\n" "#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "RAND_egd" "ac_cv_func_RAND_egd" +if test "x$ac_cv_func_RAND_egd" = xyes +then : + printf "%s\n" "#define HAVE_RAND_EGD 1" >>confdefs.h + +fi + + if test "x$liberrors" != "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: OpenSSL libraries are unusable" >&5 +printf "%s\n" "$as_me: WARNING: OpenSSL libraries are unusable" >&2;} + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: OpenSSL version is too old" >&5 +printf "%s\n" "$as_me: WARNING: OpenSSL version is too old" >&2;} + fi + + CPPFLAGS="$saved_CPPFLAGS" + LIBS="$saved_LIBS" + LDFLAGS="$saved_LDFLAGS" + + ap_openssl_mod_cflags=$MOD_CFLAGS + ap_openssl_mod_ldflags=$MOD_LDFLAGS + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_openssl" >&5 +printf "%s\n" "$ac_cv_openssl" >&6; } + if test "x$ac_cv_openssl" = "xyes"; then + +printf "%s\n" "#define HAVE_OPENSSL 1" >>confdefs.h + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_openssl_mod_ldflags\"" + MOD_LDFLAGS="$ap_openssl_mod_ldflags" + else + apr_addto_bugger="$ap_openssl_mod_ldflags" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"$ap_openssl_mod_cflags\"" + MOD_CFLAGS="$ap_openssl_mod_cflags" + else + apr_addto_bugger="$ap_openssl_mod_cflags" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + fi + + if test "$ac_cv_openssl" = "yes" ; then + + if test "x$MOD_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CPPFLAGS to \""-DH2_OPENSSL"\"" + MOD_CPPFLAGS=""-DH2_OPENSSL"" + else + apr_addto_bugger=""-DH2_OPENSSL"" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CPPFLAGS" + MOD_CPPFLAGS="$MOD_CPPFLAGS $i" + fi + done + fi + + fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nghttp2" >&5 +printf %s "checking for nghttp2... " >&6; } +if test ${ac_cv_nghttp2+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + ac_cv_nghttp2=no + ap_nghttp2_found="" + ap_nghttp2_base="" + ap_nghttp2_libs="" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for user-provided nghttp2 base directory" >&5 +printf %s "checking for user-provided nghttp2 base directory... " >&6; } + +# Check whether --with-nghttp2 was given. +if test ${with_nghttp2+y} +then : + withval=$with_nghttp2; + if test "x$withval" != "xyes" -a "x$withval" != "x"; then + ap_nghttp2_base="`cd $withval ; pwd`" + fi + +fi + + if test "x$ap_nghttp2_base" = "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_nghttp2_base" >&5 +printf "%s\n" "$ap_nghttp2_base" >&6; } + fi + + saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" + saved_LDFLAGS="$LDFLAGS" + + if test -n "$PKGCONFIG"; then + saved_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pkg-config along $PKG_CONFIG_PATH" >&5 +printf %s "checking for pkg-config along $PKG_CONFIG_PATH... " >&6; } + if test "x$ap_nghttp2_base" != "x" ; then + if test -f "${ap_nghttp2_base}/lib/pkgconfig/libnghttp2.pc"; then + PKG_CONFIG_PATH="${ap_nghttp2_base}/lib/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + elif test -f "${ap_nghttp2_base}/lib64/pkgconfig/libnghttp2.pc"; then + PKG_CONFIG_PATH="${ap_nghttp2_base}/lib64/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + fi + fi + # Check whether --enable-nghttp2-staticlib-deps was given. +if test ${enable_nghttp2_staticlib_deps+y} +then : + enableval=$enable_nghttp2_staticlib_deps; + if test "$enableval" = "yes"; then + PKGCONFIG_LIBOPTS="--static" + fi + +fi + + ap_nghttp2_libs="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-l --silence-errors libnghttp2`" + if test $? -eq 0; then + ap_nghttp2_found="yes" + pkglookup="`$PKGCONFIG --cflags-only-I libnghttp2`" + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$pkglookup\"" + CPPFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"$pkglookup\"" + MOD_CFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-L libnghttp2`" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pkglookup\"" + LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$pkglookup\"" + MOD_LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-other libnghttp2`" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pkglookup\"" + LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$pkglookup\"" + MOD_LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + fi + PKG_CONFIG_PATH="$saved_PKG_CONFIG_PATH" + fi + + if test "x$ap_nghttp2_base" != "x" -a "x$ap_nghttp2_found" = "x"; then + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"-I$ap_nghttp2_base/include\"" + CPPFLAGS="-I$ap_nghttp2_base/include" + else + apr_addto_bugger="-I$ap_nghttp2_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"-I$ap_nghttp2_base/include\"" + MOD_CFLAGS="-I$ap_nghttp2_base/include" + else + apr_addto_bugger="-I$ap_nghttp2_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"-L$ap_nghttp2_base/lib\"" + LDFLAGS="-L$ap_nghttp2_base/lib" + else + apr_addto_bugger="-L$ap_nghttp2_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"-L$ap_nghttp2_base/lib\"" + MOD_LDFLAGS="-L$ap_nghttp2_base/lib" + else + apr_addto_bugger="-L$ap_nghttp2_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$ap_platform_runtime_link_flag$ap_nghttp2_base/lib\"" + LDFLAGS="$ap_platform_runtime_link_flag$ap_nghttp2_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_nghttp2_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_platform_runtime_link_flag$ap_nghttp2_base/lib\"" + MOD_LDFLAGS="$ap_platform_runtime_link_flag$ap_nghttp2_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_nghttp2_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + fi + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nghttp2 version >= 1.2.1" >&5 +printf %s "checking for nghttp2 version >= 1.2.1... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + +#if !defined(NGHTTP2_VERSION_NUM) +#error "Missing nghttp2 version" +#endif +#if NGHTTP2_VERSION_NUM < 0x010201 +#error "Unsupported nghttp2 version " NGHTTP2_VERSION_TEXT +#endif + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: OK" >&5 +printf "%s\n" "OK" >&6; } + ac_cv_nghttp2=yes +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: FAILED" >&5 +printf "%s\n" "FAILED" >&6; } ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + + if test "x$ac_cv_nghttp2" = "xyes"; then + ap_nghttp2_libs="${ap_nghttp2_libs:--lnghttp2} `$apr_config --libs`" + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_nghttp2_libs\"" + MOD_LDFLAGS="$ap_nghttp2_libs" + else + apr_addto_bugger="$ap_nghttp2_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LIBS to \"$ap_nghttp2_libs\"" + LIBS="$ap_nghttp2_libs" + else + apr_addto_bugger="$ap_nghttp2_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + + liberrors="" + ac_fn_c_check_header_compile "$LINENO" "nghttp2/nghttp2.h" "ac_cv_header_nghttp2_nghttp2_h" "$ac_includes_default" +if test "x$ac_cv_header_nghttp2_nghttp2_h" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_NGHTTP2_H 1" >>confdefs.h + +fi + + + for ac_func in nghttp2_session_server_new2 +do : + ac_fn_c_check_func "$LINENO" "nghttp2_session_server_new2" "ac_cv_func_nghttp2_session_server_new2" +if test "x$ac_cv_func_nghttp2_session_server_new2" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_SESSION_SERVER_NEW2 1" >>confdefs.h + +else case e in #( + e) liberrors="yes" ;; +esac +fi + +done + if test "x$liberrors" != "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: nghttp2 library is unusable" >&5 +printf "%s\n" "$as_me: WARNING: nghttp2 library is unusable" >&2;} + fi + + for ac_func in nghttp2_stream_get_weight +do : + ac_fn_c_check_func "$LINENO" "nghttp2_stream_get_weight" "ac_cv_func_nghttp2_stream_get_weight" +if test "x$ac_cv_func_nghttp2_stream_get_weight" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_STREAM_GET_WEIGHT 1" >>confdefs.h + +else case e in #( + e) liberrors="yes" ;; +esac +fi + +done + if test "x$liberrors" != "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: nghttp2 version >= 1.3.0 is required" >&5 +printf "%s\n" "$as_me: WARNING: nghttp2 version >= 1.3.0 is required" >&2;} + fi + + for ac_func in nghttp2_session_change_stream_priority +do : + ac_fn_c_check_func "$LINENO" "nghttp2_session_change_stream_priority" "ac_cv_func_nghttp2_session_change_stream_priority" +if test "x$ac_cv_func_nghttp2_session_change_stream_priority" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_SESSION_CHANGE_STREAM_PRIORITY 1" >>confdefs.h + + if test "x$MOD_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CPPFLAGS to \""-DH2_NG2_CHANGE_PRIO"\"" + MOD_CPPFLAGS=""-DH2_NG2_CHANGE_PRIO"" + else + apr_addto_bugger=""-DH2_NG2_CHANGE_PRIO"" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CPPFLAGS" + MOD_CPPFLAGS="$MOD_CPPFLAGS $i" + fi + done + fi + +fi + +done + + for ac_func in nghttp2_session_callbacks_set_on_invalid_header_callback +do : + ac_fn_c_check_func "$LINENO" "nghttp2_session_callbacks_set_on_invalid_header_callback" "ac_cv_func_nghttp2_session_callbacks_set_on_invalid_header_callback" +if test "x$ac_cv_func_nghttp2_session_callbacks_set_on_invalid_header_callback" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_SESSION_CALLBACKS_SET_ON_INVALID_HEADER_CALLBACK 1" >>confdefs.h + + if test "x$MOD_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CPPFLAGS to \""-DH2_NG2_INVALID_HEADER_CB"\"" + MOD_CPPFLAGS=""-DH2_NG2_INVALID_HEADER_CB"" + else + apr_addto_bugger=""-DH2_NG2_INVALID_HEADER_CB"" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CPPFLAGS" + MOD_CPPFLAGS="$MOD_CPPFLAGS $i" + fi + done + fi + +fi + +done + + for ac_func in nghttp2_session_get_stream_local_window_size +do : + ac_fn_c_check_func "$LINENO" "nghttp2_session_get_stream_local_window_size" "ac_cv_func_nghttp2_session_get_stream_local_window_size" +if test "x$ac_cv_func_nghttp2_session_get_stream_local_window_size" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_SESSION_GET_STREAM_LOCAL_WINDOW_SIZE 1" >>confdefs.h + + if test "x$MOD_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CPPFLAGS to \""-DH2_NG2_LOCAL_WIN_SIZE"\"" + MOD_CPPFLAGS=""-DH2_NG2_LOCAL_WIN_SIZE"" + else + apr_addto_bugger=""-DH2_NG2_LOCAL_WIN_SIZE"" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CPPFLAGS" + MOD_CPPFLAGS="$MOD_CPPFLAGS $i" + fi + done + fi + +fi + +done + + for ac_func in nghttp2_option_set_no_closed_streams +do : + ac_fn_c_check_func "$LINENO" "nghttp2_option_set_no_closed_streams" "ac_cv_func_nghttp2_option_set_no_closed_streams" +if test "x$ac_cv_func_nghttp2_option_set_no_closed_streams" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_OPTION_SET_NO_CLOSED_STREAMS 1" >>confdefs.h + + if test "x$MOD_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CPPFLAGS to \""-DH2_NG2_NO_CLOSED_STREAMS"\"" + MOD_CPPFLAGS=""-DH2_NG2_NO_CLOSED_STREAMS"" + else + apr_addto_bugger=""-DH2_NG2_NO_CLOSED_STREAMS"" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CPPFLAGS" + MOD_CPPFLAGS="$MOD_CPPFLAGS $i" + fi + done + fi + +fi + +done + + for ac_func in nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation +do : + ac_fn_c_check_func "$LINENO" "nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation" "ac_cv_func_nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation" +if test "x$ac_cv_func_nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_OPTION_SET_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION 1" >>confdefs.h + + if test "x$MOD_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CPPFLAGS to \""-DH2_NG2_RFC9113_STRICTNESS"\"" + MOD_CPPFLAGS=""-DH2_NG2_RFC9113_STRICTNESS"" + else + apr_addto_bugger=""-DH2_NG2_RFC9113_STRICTNESS"" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CPPFLAGS" + MOD_CPPFLAGS="$MOD_CPPFLAGS $i" + fi + done + fi + +fi + +done + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: nghttp2 version is too old" >&5 +printf "%s\n" "$as_me: WARNING: nghttp2 version is too old" >&2;} + fi + + CPPFLAGS="$saved_CPPFLAGS" + LIBS="$saved_LIBS" + LDFLAGS="$saved_LDFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_nghttp2" >&5 +printf "%s\n" "$ac_cv_nghttp2" >&6; } + if test "x$ac_cv_nghttp2" = "xyes"; then + +printf "%s\n" "#define HAVE_NGHTTP2 1" >>confdefs.h + + fi + + if test "$ac_cv_nghttp2" = "yes" ; then + if test "x$enable_http2" = "xshared"; then + # The only symbol which needs to be exported is the module + # structure, so ask libtool to hide everything else: + + if test "x$MOD_HTTP2_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_HTTP2_LDADD to \"-export-symbols-regex http2_module\"" + MOD_HTTP2_LDADD="-export-symbols-regex http2_module" + else + apr_addto_bugger="-export-symbols-regex http2_module" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_HTTP2_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_HTTP2_LDADD" + MOD_HTTP2_LDADD="$MOD_HTTP2_LDADD $i" + fi + done + fi + + fi + else + enable_http2=no + fi + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_http2" >&5 +printf %s "checking whether to enable mod_http2... " >&6; } + if test "$enable_http2" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_http2 has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_http2$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_http2$_apmod_extra_msg" >&6; } + if test "$enable_http2" != "no"; then + case "$enable_http2" in + static*) + MODLIST="$MODLIST http2" + if test "http2" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES http2" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},http2" + fi + ;; + esac + + + if test -z "$http2_objs"; then + objects="mod_http2.lo" + else + objects="$http2_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_http2.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_proxy_http2... " >&6; } + # Check whether --enable-proxy-http2 was given. +if test ${enable_proxy_http2+y} +then : + enableval=$enable_proxy_http2; force_proxy_http2=$enableval +else case e in #( + e) enable_proxy_http2=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_proxy_http2" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_proxy_http2" = "static" -o "$enable_proxy_http2" = "shared"; then + : + elif test "$enable_proxy_http2" = "yes"; then + enable_proxy_http2=$module_default + elif test "$enable_proxy_http2" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_http2=$module_default + else + enable_proxy_http2=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_http2" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_proxy_http2=$module_default + else + enable_proxy_http2=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_http2" = "all" -o "$enable_proxy_http2" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_proxy_http2=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_http2=no + fi + elif test "$enable_proxy_http2" = "reallyall" -o "$enable_proxy_http2" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_proxy_http2" != "no" ; then + enable_proxy_http2=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_proxy_http2=no + fi + else + enable_proxy_http2=no + fi + if test "$enable_proxy_http2" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy" = "no" ; then + enable_proxy_http2=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy is disabled but required for mod_proxy_http2\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy is disabled but required for mod_proxy_http2\"" >&2;} + elif test "$enable_proxy_http2" = "static" && test "$enable_proxy" != "static" ; then + enable_proxy_http2=$enable_proxy + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_proxy_http2 shared because mod_proxy is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_proxy_http2 shared because mod_proxy is built shared\"" >&2;} + else + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nghttp2" >&5 +printf %s "checking for nghttp2... " >&6; } +if test ${ac_cv_nghttp2+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + ac_cv_nghttp2=no + ap_nghttp2_found="" + ap_nghttp2_base="" + ap_nghttp2_libs="" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for user-provided nghttp2 base directory" >&5 +printf %s "checking for user-provided nghttp2 base directory... " >&6; } + +# Check whether --with-nghttp2 was given. +if test ${with_nghttp2+y} +then : + withval=$with_nghttp2; + if test "x$withval" != "xyes" -a "x$withval" != "x"; then + ap_nghttp2_base="`cd $withval ; pwd`" + fi + +fi + + if test "x$ap_nghttp2_base" = "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_nghttp2_base" >&5 +printf "%s\n" "$ap_nghttp2_base" >&6; } + fi + + saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" + saved_LDFLAGS="$LDFLAGS" + + if test -n "$PKGCONFIG"; then + saved_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pkg-config along $PKG_CONFIG_PATH" >&5 +printf %s "checking for pkg-config along $PKG_CONFIG_PATH... " >&6; } + if test "x$ap_nghttp2_base" != "x" ; then + if test -f "${ap_nghttp2_base}/lib/pkgconfig/libnghttp2.pc"; then + PKG_CONFIG_PATH="${ap_nghttp2_base}/lib/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + elif test -f "${ap_nghttp2_base}/lib64/pkgconfig/libnghttp2.pc"; then + PKG_CONFIG_PATH="${ap_nghttp2_base}/lib64/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + fi + fi + # Check whether --enable-nghttp2-staticlib-deps was given. +if test ${enable_nghttp2_staticlib_deps+y} +then : + enableval=$enable_nghttp2_staticlib_deps; + if test "$enableval" = "yes"; then + PKGCONFIG_LIBOPTS="--static" + fi + +fi + + ap_nghttp2_libs="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-l --silence-errors libnghttp2`" + if test $? -eq 0; then + ap_nghttp2_found="yes" + pkglookup="`$PKGCONFIG --cflags-only-I libnghttp2`" + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$pkglookup\"" + CPPFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"$pkglookup\"" + MOD_CFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-L libnghttp2`" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pkglookup\"" + LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$pkglookup\"" + MOD_LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-other libnghttp2`" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pkglookup\"" + LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$pkglookup\"" + MOD_LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + fi + PKG_CONFIG_PATH="$saved_PKG_CONFIG_PATH" + fi + + if test "x$ap_nghttp2_base" != "x" -a "x$ap_nghttp2_found" = "x"; then + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"-I$ap_nghttp2_base/include\"" + CPPFLAGS="-I$ap_nghttp2_base/include" + else + apr_addto_bugger="-I$ap_nghttp2_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"-I$ap_nghttp2_base/include\"" + MOD_CFLAGS="-I$ap_nghttp2_base/include" + else + apr_addto_bugger="-I$ap_nghttp2_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"-L$ap_nghttp2_base/lib\"" + LDFLAGS="-L$ap_nghttp2_base/lib" + else + apr_addto_bugger="-L$ap_nghttp2_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"-L$ap_nghttp2_base/lib\"" + MOD_LDFLAGS="-L$ap_nghttp2_base/lib" + else + apr_addto_bugger="-L$ap_nghttp2_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$ap_platform_runtime_link_flag$ap_nghttp2_base/lib\"" + LDFLAGS="$ap_platform_runtime_link_flag$ap_nghttp2_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_nghttp2_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_platform_runtime_link_flag$ap_nghttp2_base/lib\"" + MOD_LDFLAGS="$ap_platform_runtime_link_flag$ap_nghttp2_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_nghttp2_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + fi + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nghttp2 version >= 1.2.1" >&5 +printf %s "checking for nghttp2 version >= 1.2.1... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + +#if !defined(NGHTTP2_VERSION_NUM) +#error "Missing nghttp2 version" +#endif +#if NGHTTP2_VERSION_NUM < 0x010201 +#error "Unsupported nghttp2 version " NGHTTP2_VERSION_TEXT +#endif + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: OK" >&5 +printf "%s\n" "OK" >&6; } + ac_cv_nghttp2=yes +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: FAILED" >&5 +printf "%s\n" "FAILED" >&6; } ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + + if test "x$ac_cv_nghttp2" = "xyes"; then + ap_nghttp2_libs="${ap_nghttp2_libs:--lnghttp2} `$apr_config --libs`" + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_nghttp2_libs\"" + MOD_LDFLAGS="$ap_nghttp2_libs" + else + apr_addto_bugger="$ap_nghttp2_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LIBS to \"$ap_nghttp2_libs\"" + LIBS="$ap_nghttp2_libs" + else + apr_addto_bugger="$ap_nghttp2_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + + liberrors="" + ac_fn_c_check_header_compile "$LINENO" "nghttp2/nghttp2.h" "ac_cv_header_nghttp2_nghttp2_h" "$ac_includes_default" +if test "x$ac_cv_header_nghttp2_nghttp2_h" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_NGHTTP2_H 1" >>confdefs.h + +fi + + + for ac_func in nghttp2_session_server_new2 +do : + ac_fn_c_check_func "$LINENO" "nghttp2_session_server_new2" "ac_cv_func_nghttp2_session_server_new2" +if test "x$ac_cv_func_nghttp2_session_server_new2" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_SESSION_SERVER_NEW2 1" >>confdefs.h + +else case e in #( + e) liberrors="yes" ;; +esac +fi + +done + if test "x$liberrors" != "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: nghttp2 library is unusable" >&5 +printf "%s\n" "$as_me: WARNING: nghttp2 library is unusable" >&2;} + fi + + for ac_func in nghttp2_stream_get_weight +do : + ac_fn_c_check_func "$LINENO" "nghttp2_stream_get_weight" "ac_cv_func_nghttp2_stream_get_weight" +if test "x$ac_cv_func_nghttp2_stream_get_weight" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_STREAM_GET_WEIGHT 1" >>confdefs.h + +else case e in #( + e) liberrors="yes" ;; +esac +fi + +done + if test "x$liberrors" != "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: nghttp2 version >= 1.3.0 is required" >&5 +printf "%s\n" "$as_me: WARNING: nghttp2 version >= 1.3.0 is required" >&2;} + fi + + for ac_func in nghttp2_session_change_stream_priority +do : + ac_fn_c_check_func "$LINENO" "nghttp2_session_change_stream_priority" "ac_cv_func_nghttp2_session_change_stream_priority" +if test "x$ac_cv_func_nghttp2_session_change_stream_priority" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_SESSION_CHANGE_STREAM_PRIORITY 1" >>confdefs.h + + if test "x$MOD_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CPPFLAGS to \""-DH2_NG2_CHANGE_PRIO"\"" + MOD_CPPFLAGS=""-DH2_NG2_CHANGE_PRIO"" + else + apr_addto_bugger=""-DH2_NG2_CHANGE_PRIO"" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CPPFLAGS" + MOD_CPPFLAGS="$MOD_CPPFLAGS $i" + fi + done + fi + +fi + +done + + for ac_func in nghttp2_session_callbacks_set_on_invalid_header_callback +do : + ac_fn_c_check_func "$LINENO" "nghttp2_session_callbacks_set_on_invalid_header_callback" "ac_cv_func_nghttp2_session_callbacks_set_on_invalid_header_callback" +if test "x$ac_cv_func_nghttp2_session_callbacks_set_on_invalid_header_callback" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_SESSION_CALLBACKS_SET_ON_INVALID_HEADER_CALLBACK 1" >>confdefs.h + + if test "x$MOD_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CPPFLAGS to \""-DH2_NG2_INVALID_HEADER_CB"\"" + MOD_CPPFLAGS=""-DH2_NG2_INVALID_HEADER_CB"" + else + apr_addto_bugger=""-DH2_NG2_INVALID_HEADER_CB"" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CPPFLAGS" + MOD_CPPFLAGS="$MOD_CPPFLAGS $i" + fi + done + fi + +fi + +done + + for ac_func in nghttp2_session_get_stream_local_window_size +do : + ac_fn_c_check_func "$LINENO" "nghttp2_session_get_stream_local_window_size" "ac_cv_func_nghttp2_session_get_stream_local_window_size" +if test "x$ac_cv_func_nghttp2_session_get_stream_local_window_size" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_SESSION_GET_STREAM_LOCAL_WINDOW_SIZE 1" >>confdefs.h + + if test "x$MOD_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CPPFLAGS to \""-DH2_NG2_LOCAL_WIN_SIZE"\"" + MOD_CPPFLAGS=""-DH2_NG2_LOCAL_WIN_SIZE"" + else + apr_addto_bugger=""-DH2_NG2_LOCAL_WIN_SIZE"" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CPPFLAGS" + MOD_CPPFLAGS="$MOD_CPPFLAGS $i" + fi + done + fi + +fi + +done + + for ac_func in nghttp2_option_set_no_closed_streams +do : + ac_fn_c_check_func "$LINENO" "nghttp2_option_set_no_closed_streams" "ac_cv_func_nghttp2_option_set_no_closed_streams" +if test "x$ac_cv_func_nghttp2_option_set_no_closed_streams" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_OPTION_SET_NO_CLOSED_STREAMS 1" >>confdefs.h + + if test "x$MOD_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CPPFLAGS to \""-DH2_NG2_NO_CLOSED_STREAMS"\"" + MOD_CPPFLAGS=""-DH2_NG2_NO_CLOSED_STREAMS"" + else + apr_addto_bugger=""-DH2_NG2_NO_CLOSED_STREAMS"" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CPPFLAGS" + MOD_CPPFLAGS="$MOD_CPPFLAGS $i" + fi + done + fi + +fi + +done + + for ac_func in nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation +do : + ac_fn_c_check_func "$LINENO" "nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation" "ac_cv_func_nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation" +if test "x$ac_cv_func_nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation" = xyes +then : + printf "%s\n" "#define HAVE_NGHTTP2_OPTION_SET_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION 1" >>confdefs.h + + if test "x$MOD_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CPPFLAGS to \""-DH2_NG2_RFC9113_STRICTNESS"\"" + MOD_CPPFLAGS=""-DH2_NG2_RFC9113_STRICTNESS"" + else + apr_addto_bugger=""-DH2_NG2_RFC9113_STRICTNESS"" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CPPFLAGS" + MOD_CPPFLAGS="$MOD_CPPFLAGS $i" + fi + done + fi + +fi + +done + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: nghttp2 version is too old" >&5 +printf "%s\n" "$as_me: WARNING: nghttp2 version is too old" >&2;} + fi + + CPPFLAGS="$saved_CPPFLAGS" + LIBS="$saved_LIBS" + LDFLAGS="$saved_LDFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_nghttp2" >&5 +printf "%s\n" "$ac_cv_nghttp2" >&6; } + if test "x$ac_cv_nghttp2" = "xyes"; then + +printf "%s\n" "#define HAVE_NGHTTP2 1" >>confdefs.h + + fi + + if test "$ac_cv_nghttp2" = "yes" ; then + if test "x$enable_http2" = "xshared"; then + # The only symbol which needs to be exported is the module + # structure, so ask libtool to hide everything else: + + if test "x$MOD_PROXY_HTTP2_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_PROXY_HTTP2_LDADD to \"-export-symbols-regex proxy_http2_module\"" + MOD_PROXY_HTTP2_LDADD="-export-symbols-regex proxy_http2_module" + else + apr_addto_bugger="-export-symbols-regex proxy_http2_module" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_PROXY_HTTP2_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_PROXY_HTTP2_LDADD" + MOD_PROXY_HTTP2_LDADD="$MOD_PROXY_HTTP2_LDADD $i" + fi + done + fi + + fi + else + enable_proxy_http2=no + fi + + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_proxy_http2" >&5 +printf %s "checking whether to enable mod_proxy_http2... " >&6; } + if test "$enable_proxy_http2" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_proxy_http2 has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_proxy_http2$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_proxy_http2$_apmod_extra_msg" >&6; } + if test "$enable_proxy_http2" != "no"; then + case "$enable_proxy_http2" in + static*) + MODLIST="$MODLIST proxy_http2" + if test "proxy_http2" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_http2" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},proxy_http2" + fi + ;; + esac + + + if test -z "$proxy_http2_objs"; then + objects="mod_proxy_http2.lo" + else + objects="$proxy_http2_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_proxy_http2.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + + + + + + + + current_dir=md + modpath_current=modules/md + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d md || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +md_objs="md_acme.lo md_acme_acct.lo md_acme_authz.lo md_acme_drive.lo md_acmev2_drive.lo md_acme_order.lo md_core.lo md_curl.lo md_crypt.lo md_event.lo md_http.lo md_json.lo md_jws.lo md_log.lo md_ocsp.lo md_result.lo md_reg.lo md_status.lo md_store.lo md_store_fs.lo md_tailscale.lo md_time.lo md_util.lo mod_md.lo mod_md_config.lo mod_md_drive.lo mod_md_ocsp.lo mod_md_os.lo mod_md_status.lo " + +# Ensure that other modules can pick up mod_md.h + + if test "x$INCLUDES" = "x"; then + test "x$silent" != "xyes" && echo " setting INCLUDES to \"-I\$(top_srcdir)/$modpath_current\"" + INCLUDES="-I\$(top_srcdir)/$modpath_current" + else + apr_addto_bugger="-I\$(top_srcdir)/$modpath_current" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $INCLUDES; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_md" >&5 +printf %s "checking whether to enable mod_md... " >&6; } + # Check whether --enable-md was given. +if test ${enable_md+y} +then : + enableval=$enable_md; force_md=$enableval +else case e in #( + e) enable_md=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_md" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_md" = "static" -o "$enable_md" = "shared"; then + : + elif test "$enable_md" = "yes"; then + enable_md=$module_default + elif test "$enable_md" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_md=$module_default + else + enable_md=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_md" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_md=$module_default + else + enable_md=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_md" = "all" -o "$enable_md" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_md=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_md=no + fi + elif test "$enable_md" = "reallyall" -o "$enable_md" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_md" != "no" ; then + enable_md=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_md=no + fi + else + enable_md=no + fi + if test "$enable_md" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OpenSSL" >&5 +printf %s "checking for OpenSSL... " >&6; } +if test ${ac_cv_openssl+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + ac_cv_openssl=no + ap_openssl_found="" + ap_openssl_base="" + ap_openssl_libs="" + ap_openssl_mod_cflags="" + ap_openssl_mod_ldflags="" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for user-provided OpenSSL base directory" >&5 +printf %s "checking for user-provided OpenSSL base directory... " >&6; } + +# Check whether --with-ssl was given. +if test ${with_ssl+y} +then : + withval=$with_ssl; + if test "x$withval" != "xyes" -a "x$withval" != "x"; then + ap_openssl_base="`cd $withval ; pwd`" + fi + +fi + + if test "x$ap_openssl_base" = "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_openssl_base" >&5 +printf "%s\n" "$ap_openssl_base" >&6; } + fi + + saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" + saved_LDFLAGS="$LDFLAGS" + + if test -n "$PKGCONFIG"; then + saved_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" + if test "x$ap_openssl_base" != "x"; then + if test -f "${ap_openssl_base}/lib/pkgconfig/openssl.pc"; then + PKG_CONFIG_PATH="${ap_openssl_base}/lib/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + elif test -f "${ap_openssl_base}/lib64/pkgconfig/openssl.pc"; then + PKG_CONFIG_PATH="${ap_openssl_base}/lib64/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + fi + fi + # Check whether --enable-ssl-staticlib-deps was given. +if test ${enable_ssl_staticlib_deps+y} +then : + enableval=$enable_ssl_staticlib_deps; + if test "$enableval" = "yes"; then + PKGCONFIG_LIBOPTS="--static" + fi + +fi + + ap_openssl_libs="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-l --silence-errors openssl`" + if test $? -eq 0; then + ap_openssl_found="yes" + pkglookup="`$PKGCONFIG --cflags-only-I openssl`" + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$pkglookup\"" + CPPFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"$pkglookup\"" + MOD_CFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + + if test "x$ab_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting ab_CFLAGS to \"$pkglookup\"" + ab_CFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $ab_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to ab_CFLAGS" + ab_CFLAGS="$ab_CFLAGS $i" + fi + done + fi + + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-L openssl`" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pkglookup\"" + LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$pkglookup\"" + MOD_LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-other openssl`" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pkglookup\"" + LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$pkglookup\"" + MOD_LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + fi + PKG_CONFIG_PATH="$saved_PKG_CONFIG_PATH" + fi + + if test "x$ap_openssl_base" != "x" -a "x$ap_openssl_found" = "x"; then + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"-I$ap_openssl_base/include\"" + CPPFLAGS="-I$ap_openssl_base/include" + else + apr_addto_bugger="-I$ap_openssl_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"-I$ap_openssl_base/include\"" + MOD_CFLAGS="-I$ap_openssl_base/include" + else + apr_addto_bugger="-I$ap_openssl_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + + if test "x$ab_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting ab_CFLAGS to \"-I$ap_openssl_base/include\"" + ab_CFLAGS="-I$ap_openssl_base/include" + else + apr_addto_bugger="-I$ap_openssl_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $ab_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to ab_CFLAGS" + ab_CFLAGS="$ab_CFLAGS $i" + fi + done + fi + + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"-L$ap_openssl_base/lib\"" + LDFLAGS="-L$ap_openssl_base/lib" + else + apr_addto_bugger="-L$ap_openssl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"-L$ap_openssl_base/lib\"" + MOD_LDFLAGS="-L$ap_openssl_base/lib" + else + apr_addto_bugger="-L$ap_openssl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$ap_platform_runtime_link_flag$ap_openssl_base/lib\"" + LDFLAGS="$ap_platform_runtime_link_flag$ap_openssl_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_openssl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_platform_runtime_link_flag$ap_openssl_base/lib\"" + MOD_LDFLAGS="$ap_platform_runtime_link_flag$ap_openssl_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_openssl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + fi + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OpenSSL version >= 0.9.8a" >&5 +printf %s "checking for OpenSSL version >= 0.9.8a... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + +#if !defined(OPENSSL_VERSION_NUMBER) +#error "Missing OpenSSL version" +#endif +#if OPENSSL_VERSION_NUMBER < 0x0090801f +#error "Unsupported OpenSSL version " OPENSSL_VERSION_TEXT +#endif + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: OK" >&5 +printf "%s\n" "OK" >&6; } + ac_cv_openssl=yes +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: FAILED" >&5 +printf "%s\n" "FAILED" >&6; } ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + + if test "x$ac_cv_openssl" = "xyes"; then + ap_openssl_libs="${ap_openssl_libs:--lssl -lcrypto} `$apr_config --libs`" + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_openssl_libs\"" + MOD_LDFLAGS="$ap_openssl_libs" + else + apr_addto_bugger="$ap_openssl_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LIBS to \"$ap_openssl_libs\"" + LIBS="$ap_openssl_libs" + else + apr_addto_bugger="$ap_openssl_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + + test "x$silent" != "xyes" && echo " forcing ab_LIBS to \"$MOD_LDFLAGS\"" + ab_LIBS="$MOD_LDFLAGS" + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST ab_CFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST ab_LIBS" + + + + liberrors="" + ac_fn_c_check_header_compile "$LINENO" "openssl/engine.h" "ac_cv_header_openssl_engine_h" "$ac_includes_default" +if test "x$ac_cv_header_openssl_engine_h" = xyes +then : + printf "%s\n" "#define HAVE_OPENSSL_ENGINE_H 1" >>confdefs.h + +fi + + + for ac_func in SSL_CTX_new +do : + ac_fn_c_check_func "$LINENO" "SSL_CTX_new" "ac_cv_func_SSL_CTX_new" +if test "x$ac_cv_func_SSL_CTX_new" = xyes +then : + printf "%s\n" "#define HAVE_SSL_CTX_NEW 1" >>confdefs.h + +else case e in #( + e) liberrors="yes" ;; +esac +fi + +done + ac_fn_c_check_func "$LINENO" "OPENSSL_init_ssl" "ac_cv_func_OPENSSL_init_ssl" +if test "x$ac_cv_func_OPENSSL_init_ssl" = xyes +then : + printf "%s\n" "#define HAVE_OPENSSL_INIT_SSL 1" >>confdefs.h + +fi + + ac_fn_c_check_func "$LINENO" "ENGINE_init" "ac_cv_func_ENGINE_init" +if test "x$ac_cv_func_ENGINE_init" = xyes +then : + printf "%s\n" "#define HAVE_ENGINE_INIT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "ENGINE_load_builtin_engines" "ac_cv_func_ENGINE_load_builtin_engines" +if test "x$ac_cv_func_ENGINE_load_builtin_engines" = xyes +then : + printf "%s\n" "#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "RAND_egd" "ac_cv_func_RAND_egd" +if test "x$ac_cv_func_RAND_egd" = xyes +then : + printf "%s\n" "#define HAVE_RAND_EGD 1" >>confdefs.h + +fi + + if test "x$liberrors" != "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: OpenSSL libraries are unusable" >&5 +printf "%s\n" "$as_me: WARNING: OpenSSL libraries are unusable" >&2;} + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: OpenSSL version is too old" >&5 +printf "%s\n" "$as_me: WARNING: OpenSSL version is too old" >&2;} + fi + + CPPFLAGS="$saved_CPPFLAGS" + LIBS="$saved_LIBS" + LDFLAGS="$saved_LDFLAGS" + + ap_openssl_mod_cflags=$MOD_CFLAGS + ap_openssl_mod_ldflags=$MOD_LDFLAGS + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_openssl" >&5 +printf "%s\n" "$ac_cv_openssl" >&6; } + if test "x$ac_cv_openssl" = "xyes"; then + +printf "%s\n" "#define HAVE_OPENSSL 1" >>confdefs.h + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_openssl_mod_ldflags\"" + MOD_LDFLAGS="$ap_openssl_mod_ldflags" + else + apr_addto_bugger="$ap_openssl_mod_ldflags" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"$ap_openssl_mod_cflags\"" + MOD_CFLAGS="$ap_openssl_mod_cflags" + else + apr_addto_bugger="$ap_openssl_mod_cflags" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + fi + + if test "x$ac_cv_openssl" = "xno" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: libssl (or compatible) not found" >&5 +printf "%s\n" "$as_me: WARNING: libssl (or compatible) not found" >&2;} + enable_md=no + fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for jansson" >&5 +printf %s "checking for jansson... " >&6; } +if test ${ac_cv_jansson+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + ac_cv_jansson=no + ap_jansson_found="" + ap_jansson_base="" + ap_jansson_libs="" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for user-provided jansson base directory" >&5 +printf %s "checking for user-provided jansson base directory... " >&6; } + +# Check whether --with-jansson was given. +if test ${with_jansson+y} +then : + withval=$with_jansson; + if test "x$withval" != "xyes" -a "x$withval" != "x"; then + ap_jansson_base="`cd $withval ; pwd`" + fi + +fi + + if test "x$ap_jansson_base" = "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_jansson_base" >&5 +printf "%s\n" "$ap_jansson_base" >&6; } + fi + + saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" + saved_LDFLAGS="$LDFLAGS" + + if test -n "$PKGCONFIG"; then + saved_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pkg-config along $PKG_CONFIG_PATH" >&5 +printf %s "checking for pkg-config along $PKG_CONFIG_PATH... " >&6; } + if test "x$ap_jansson_base" != "x" ; then + if test -f "${ap_jansson_base}/lib/pkgconfig/libjansson.pc"; then + PKG_CONFIG_PATH="${ap_jansson_base}/lib/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + elif test -f "${ap_jansson_base}/lib64/pkgconfig/libjansson.pc"; then + PKG_CONFIG_PATH="${ap_jansson_base}/lib64/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + fi + fi + # Check whether --enable-jansson-staticlib-deps was given. +if test ${enable_jansson_staticlib_deps+y} +then : + enableval=$enable_jansson_staticlib_deps; + if test "$enableval" = "yes"; then + PKGCONFIG_LIBOPTS="--static" + fi + +fi + + ap_jansson_libs="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-l --silence-errors libjansson`" + if test $? -eq 0; then + ap_jansson_found="yes" + pkglookup="`$PKGCONFIG --cflags-only-I libjansson`" + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$pkglookup\"" + CPPFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"$pkglookup\"" + MOD_CFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-L libjansson`" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pkglookup\"" + LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$pkglookup\"" + MOD_LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-other libjansson`" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pkglookup\"" + LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$pkglookup\"" + MOD_LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + fi + PKG_CONFIG_PATH="$saved_PKG_CONFIG_PATH" + fi + + if test "x$ap_jansson_base" != "x" -a "x$ap_jansson_found" = "x"; then + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"-I$ap_jansson_base/include\"" + CPPFLAGS="-I$ap_jansson_base/include" + else + apr_addto_bugger="-I$ap_jansson_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"-I$ap_jansson_base/include\"" + MOD_CFLAGS="-I$ap_jansson_base/include" + else + apr_addto_bugger="-I$ap_jansson_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"-L$ap_jansson_base/lib\"" + LDFLAGS="-L$ap_jansson_base/lib" + else + apr_addto_bugger="-L$ap_jansson_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"-L$ap_jansson_base/lib\"" + MOD_LDFLAGS="-L$ap_jansson_base/lib" + else + apr_addto_bugger="-L$ap_jansson_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$ap_platform_runtime_link_flag$ap_jansson_base/lib\"" + LDFLAGS="$ap_platform_runtime_link_flag$ap_jansson_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_jansson_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_platform_runtime_link_flag$ap_jansson_base/lib\"" + MOD_LDFLAGS="$ap_platform_runtime_link_flag$ap_jansson_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_jansson_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + fi + fi + + # attempts to include jansson.h fail me. So lets make sure we can at least + # include its other header file + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: OK" >&5 +printf "%s\n" "OK" >&6; } + ac_cv_jansson=yes +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: FAILED" >&5 +printf "%s\n" "FAILED" >&6; } ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + + if test "x$ac_cv_jansson" = "xyes"; then + ap_jansson_libs="${ap_jansson_libs:--ljansson} `$apr_config --libs`" + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_jansson_libs\"" + MOD_LDFLAGS="$ap_jansson_libs" + else + apr_addto_bugger="$ap_jansson_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LIBS to \"$ap_jansson_libs\"" + LIBS="$ap_jansson_libs" + else + apr_addto_bugger="$ap_jansson_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + fi + + CPPFLAGS="$saved_CPPFLAGS" + LIBS="$saved_LIBS" + LDFLAGS="$saved_LDFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_jansson" >&5 +printf "%s\n" "$ac_cv_jansson" >&6; } + if test "x$ac_cv_jansson" = "xyes"; then + +printf "%s\n" "#define HAVE_JANSSON 1" >>confdefs.h + + fi + + if test "x$ac_cv_jansson" != "xyes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: libjansson not found" >&5 +printf "%s\n" "$as_me: WARNING: libjansson not found" >&2;} + enable_md=no + fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curl" >&5 +printf %s "checking for curl... " >&6; } +if test ${ac_cv_curl+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + ac_cv_curl=no + ap_curl_found="" + ap_curl_base="" + ap_curl_libs="" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for user-provided curl base directory" >&5 +printf %s "checking for user-provided curl base directory... " >&6; } + +# Check whether --with-curl was given. +if test ${with_curl+y} +then : + withval=$with_curl; + if test "x$withval" != "xyes" -a "x$withval" != "x"; then + ap_curl_base="`cd $withval ; pwd`" + fi + +fi + + if test "x$ap_curl_base" = "x"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ap_curl_base" >&5 +printf "%s\n" "$ap_curl_base" >&6; } + fi + + saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" + saved_LDFLAGS="$LDFLAGS" + + if test -n "$PKGCONFIG"; then + saved_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pkg-config along $PKG_CONFIG_PATH" >&5 +printf %s "checking for pkg-config along $PKG_CONFIG_PATH... " >&6; } + if test "x$ap_curl_base" != "x" ; then + if test -f "${ap_curl_base}/lib/pkgconfig/libcurl.pc"; then + PKG_CONFIG_PATH="${ap_curl_base}/lib/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + elif test -f "${ap_curl_base}/lib64/pkgconfig/libcurl.pc"; then + PKG_CONFIG_PATH="${ap_curl_base}/lib64/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}" + export PKG_CONFIG_PATH + fi + fi + # Check whether --enable-curl-staticlib-deps was given. +if test ${enable_curl_staticlib_deps+y} +then : + enableval=$enable_curl_staticlib_deps; + if test "$enableval" = "yes"; then + PKGCONFIG_LIBOPTS="--static" + fi + +fi + + ap_curl_libs="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-l --silence-errors libcurl`" + if test $? -eq 0; then + ap_curl_found="yes" + pkglookup="`$PKGCONFIG --cflags-only-I libcurl`" + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$pkglookup\"" + CPPFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"$pkglookup\"" + MOD_CFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-L libcurl`" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pkglookup\"" + LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$pkglookup\"" + MOD_LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-other libcurl`" + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pkglookup\"" + LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$pkglookup\"" + MOD_LDFLAGS="$pkglookup" + else + apr_addto_bugger="$pkglookup" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + fi + PKG_CONFIG_PATH="$saved_PKG_CONFIG_PATH" + fi + + if test "x$ap_curl_base" != "x" -a "x$ap_curl_found" = "x"; then + + if test "x$CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"-I$ap_curl_base/include\"" + CPPFLAGS="-I$ap_curl_base/include" + else + apr_addto_bugger="-I$ap_curl_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$MOD_CFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CFLAGS to \"-I$ap_curl_base/include\"" + MOD_CFLAGS="-I$ap_curl_base/include" + else + apr_addto_bugger="-I$ap_curl_base/include" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CFLAGS" + MOD_CFLAGS="$MOD_CFLAGS $i" + fi + done + fi + + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"-L$ap_curl_base/lib\"" + LDFLAGS="-L$ap_curl_base/lib" + else + apr_addto_bugger="-L$ap_curl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"-L$ap_curl_base/lib\"" + MOD_LDFLAGS="-L$ap_curl_base/lib" + else + apr_addto_bugger="-L$ap_curl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$ap_platform_runtime_link_flag$ap_curl_base/lib\"" + LDFLAGS="$ap_platform_runtime_link_flag$ap_curl_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_curl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_platform_runtime_link_flag$ap_curl_base/lib\"" + MOD_LDFLAGS="$ap_platform_runtime_link_flag$ap_curl_base/lib" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_curl_base/lib" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + fi + fi + + ac_fn_c_check_header_compile "$LINENO" "curl/curl.h" "ac_cv_header_curl_curl_h" "$ac_includes_default" +if test "x$ac_cv_header_curl_curl_h" = xyes +then : + printf "%s\n" "#define HAVE_CURL_CURL_H 1" >>confdefs.h + +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curl version >= 7.29" >&5 +printf %s "checking for curl version >= 7.29... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + +#if !defined(LIBCURL_VERSION_MAJOR) +#error "Missing libcurl version" +#endif +#if LIBCURL_VERSION_MAJOR < 7 +#error "Unsupported libcurl version " LIBCURL_VERSION +#endif +#if LIBCURL_VERSION_MAJOR == 7 && LIBCURL_VERSION_MINOR < 29 +#error "Unsupported libcurl version " LIBCURL_VERSION +#endif + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: OK" >&5 +printf "%s\n" "OK" >&6; } + ac_cv_curl=yes +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: FAILED" >&5 +printf "%s\n" "FAILED" >&6; } ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + + if test "x$ac_cv_curl" = "xyes"; then + ap_curl_libs="${ap_curl_libs:--lcurl} `$apr_config --libs`" + + if test "x$MOD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_LDFLAGS to \"$ap_curl_libs\"" + MOD_LDFLAGS="$ap_curl_libs" + else + apr_addto_bugger="$ap_curl_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_LDFLAGS" + MOD_LDFLAGS="$MOD_LDFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting LIBS to \"$ap_curl_libs\"" + LIBS="$ap_curl_libs" + else + apr_addto_bugger="$ap_curl_libs" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + fi + + CPPFLAGS="$saved_CPPFLAGS" + LIBS="$saved_LIBS" + LDFLAGS="$saved_LDFLAGS" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_curl" >&5 +printf "%s\n" "$ac_cv_curl" >&6; } + if test "x$ac_cv_curl" = "xyes"; then + +printf "%s\n" "#define HAVE_CURL 1" >>confdefs.h + + fi + + if test "x$ac_cv_curl" != "xyes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: libcurl not found" >&5 +printf "%s\n" "$as_me: WARNING: libcurl not found" >&2;} + enable_md=no + fi + + + for ac_func in arc4random_buf +do : + ac_fn_c_check_func "$LINENO" "arc4random_buf" "ac_cv_func_arc4random_buf" +if test "x$ac_cv_func_arc4random_buf" = xyes +then : + printf "%s\n" "#define HAVE_ARC4RANDOM_BUF 1" >>confdefs.h + + if test "x$MOD_CPPFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_CPPFLAGS to \""-DMD_HAVE_ARC4RANDOM"\"" + MOD_CPPFLAGS=""-DMD_HAVE_ARC4RANDOM"" + else + apr_addto_bugger=""-DMD_HAVE_ARC4RANDOM"" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_CPPFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_CPPFLAGS" + MOD_CPPFLAGS="$MOD_CPPFLAGS $i" + fi + done + fi + +fi + +done + + if test "x$enable_md" = "xshared"; then + + if test "x$MOD_MD_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_MD_LDADD to \"-export-symbols-regex md_module\"" + MOD_MD_LDADD="-export-symbols-regex md_module" + else + apr_addto_bugger="-export-symbols-regex md_module" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_MD_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_MD_LDADD" + MOD_MD_LDADD="$MOD_MD_LDADD $i" + fi + done + fi + + fi + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_md" >&5 +printf %s "checking whether to enable mod_md... " >&6; } + if test "$enable_md" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_md has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_md$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_md$_apmod_extra_msg" >&6; } + if test "$enable_md" != "no"; then + case "$enable_md" in + static*) + MODLIST="$MODLIST md" + if test "md" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES md" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},md" + fi + ;; + esac + + + if test -z "$md_objs"; then + objects="mod_md.lo" + else + objects="$md_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_md.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + current_dir=proxy/balancers + modpath_current=modules/proxy/balancers + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d proxy/balancers || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_lbmethod_byrequests" >&5 +printf %s "checking whether to enable mod_lbmethod_byrequests... " >&6; } + # Check whether --enable-lbmethod-byrequests was given. +if test ${enable_lbmethod_byrequests+y} +then : + enableval=$enable_lbmethod_byrequests; force_lbmethod_byrequests=$enableval +else case e in #( + e) enable_lbmethod_byrequests=$enable_proxy_balancer ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_lbmethod_byrequests" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_lbmethod_byrequests" = "static" -o "$enable_lbmethod_byrequests" = "shared"; then + : + elif test "$enable_lbmethod_byrequests" = "yes"; then + enable_lbmethod_byrequests=$module_default + elif test "$enable_lbmethod_byrequests" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_lbmethod_byrequests=$module_default + else + enable_lbmethod_byrequests=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_lbmethod_byrequests" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_lbmethod_byrequests=$module_default + else + enable_lbmethod_byrequests=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_lbmethod_byrequests" = "all" -o "$enable_lbmethod_byrequests" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_lbmethod_byrequests=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_lbmethod_byrequests=no + fi + elif test "$enable_lbmethod_byrequests" = "reallyall" -o "$enable_lbmethod_byrequests" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_lbmethod_byrequests" != "no" ; then + enable_lbmethod_byrequests=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_lbmethod_byrequests=no + fi + else + enable_lbmethod_byrequests=no + fi + if test "$enable_lbmethod_byrequests" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy_balancer" = "no" ; then + enable_lbmethod_byrequests=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy_balancer is disabled but required for mod_lbmethod_byrequests\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy_balancer is disabled but required for mod_lbmethod_byrequests\"" >&2;} + elif test "$enable_lbmethod_byrequests" = "static" && test "$enable_proxy_balancer" != "static" ; then + enable_lbmethod_byrequests=$enable_proxy_balancer + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_lbmethod_byrequests shared because mod_proxy_balancer is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_lbmethod_byrequests shared because mod_proxy_balancer is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_lbmethod_byrequests" >&5 +printf %s "checking whether to enable mod_lbmethod_byrequests... " >&6; } + if test "$enable_lbmethod_byrequests" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_lbmethod_byrequests has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_lbmethod_byrequests$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_lbmethod_byrequests$_apmod_extra_msg" >&6; } + if test "$enable_lbmethod_byrequests" != "no"; then + case "$enable_lbmethod_byrequests" in + static*) + MODLIST="$MODLIST lbmethod_byrequests" + if test "lbmethod_byrequests" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES lbmethod_byrequests" + if test "$enable_proxy_balancer" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},lbmethod_byrequests" + fi + ;; + esac + + + if test -z ""; then + objects="mod_lbmethod_byrequests.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_lbmethod_byrequests.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_lbmethod_bytraffic... " >&6; } + # Check whether --enable-lbmethod-bytraffic was given. +if test ${enable_lbmethod_bytraffic+y} +then : + enableval=$enable_lbmethod_bytraffic; force_lbmethod_bytraffic=$enableval +else case e in #( + e) enable_lbmethod_bytraffic=$enable_proxy_balancer ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_lbmethod_bytraffic" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_lbmethod_bytraffic" = "static" -o "$enable_lbmethod_bytraffic" = "shared"; then + : + elif test "$enable_lbmethod_bytraffic" = "yes"; then + enable_lbmethod_bytraffic=$module_default + elif test "$enable_lbmethod_bytraffic" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_lbmethod_bytraffic=$module_default + else + enable_lbmethod_bytraffic=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_lbmethod_bytraffic" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_lbmethod_bytraffic=$module_default + else + enable_lbmethod_bytraffic=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_lbmethod_bytraffic" = "all" -o "$enable_lbmethod_bytraffic" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_lbmethod_bytraffic=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_lbmethod_bytraffic=no + fi + elif test "$enable_lbmethod_bytraffic" = "reallyall" -o "$enable_lbmethod_bytraffic" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_lbmethod_bytraffic" != "no" ; then + enable_lbmethod_bytraffic=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_lbmethod_bytraffic=no + fi + else + enable_lbmethod_bytraffic=no + fi + if test "$enable_lbmethod_bytraffic" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy_balancer" = "no" ; then + enable_lbmethod_bytraffic=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy_balancer is disabled but required for mod_lbmethod_bytraffic\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy_balancer is disabled but required for mod_lbmethod_bytraffic\"" >&2;} + elif test "$enable_lbmethod_bytraffic" = "static" && test "$enable_proxy_balancer" != "static" ; then + enable_lbmethod_bytraffic=$enable_proxy_balancer + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_lbmethod_bytraffic shared because mod_proxy_balancer is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_lbmethod_bytraffic shared because mod_proxy_balancer is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_lbmethod_bytraffic" >&5 +printf %s "checking whether to enable mod_lbmethod_bytraffic... " >&6; } + if test "$enable_lbmethod_bytraffic" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_lbmethod_bytraffic has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_lbmethod_bytraffic$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_lbmethod_bytraffic$_apmod_extra_msg" >&6; } + if test "$enable_lbmethod_bytraffic" != "no"; then + case "$enable_lbmethod_bytraffic" in + static*) + MODLIST="$MODLIST lbmethod_bytraffic" + if test "lbmethod_bytraffic" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES lbmethod_bytraffic" + if test "$enable_proxy_balancer" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},lbmethod_bytraffic" + fi + ;; + esac + + + if test -z ""; then + objects="mod_lbmethod_bytraffic.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_lbmethod_bytraffic.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_lbmethod_bybusyness... " >&6; } + # Check whether --enable-lbmethod-bybusyness was given. +if test ${enable_lbmethod_bybusyness+y} +then : + enableval=$enable_lbmethod_bybusyness; force_lbmethod_bybusyness=$enableval +else case e in #( + e) enable_lbmethod_bybusyness=$enable_proxy_balancer ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_lbmethod_bybusyness" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_lbmethod_bybusyness" = "static" -o "$enable_lbmethod_bybusyness" = "shared"; then + : + elif test "$enable_lbmethod_bybusyness" = "yes"; then + enable_lbmethod_bybusyness=$module_default + elif test "$enable_lbmethod_bybusyness" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_lbmethod_bybusyness=$module_default + else + enable_lbmethod_bybusyness=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_lbmethod_bybusyness" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_lbmethod_bybusyness=$module_default + else + enable_lbmethod_bybusyness=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_lbmethod_bybusyness" = "all" -o "$enable_lbmethod_bybusyness" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_lbmethod_bybusyness=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_lbmethod_bybusyness=no + fi + elif test "$enable_lbmethod_bybusyness" = "reallyall" -o "$enable_lbmethod_bybusyness" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_lbmethod_bybusyness" != "no" ; then + enable_lbmethod_bybusyness=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_lbmethod_bybusyness=no + fi + else + enable_lbmethod_bybusyness=no + fi + if test "$enable_lbmethod_bybusyness" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy_balancer" = "no" ; then + enable_lbmethod_bybusyness=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy_balancer is disabled but required for mod_lbmethod_bybusyness\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy_balancer is disabled but required for mod_lbmethod_bybusyness\"" >&2;} + elif test "$enable_lbmethod_bybusyness" = "static" && test "$enable_proxy_balancer" != "static" ; then + enable_lbmethod_bybusyness=$enable_proxy_balancer + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_lbmethod_bybusyness shared because mod_proxy_balancer is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_lbmethod_bybusyness shared because mod_proxy_balancer is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_lbmethod_bybusyness" >&5 +printf %s "checking whether to enable mod_lbmethod_bybusyness... " >&6; } + if test "$enable_lbmethod_bybusyness" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_lbmethod_bybusyness has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_lbmethod_bybusyness$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_lbmethod_bybusyness$_apmod_extra_msg" >&6; } + if test "$enable_lbmethod_bybusyness" != "no"; then + case "$enable_lbmethod_bybusyness" in + static*) + MODLIST="$MODLIST lbmethod_bybusyness" + if test "lbmethod_bybusyness" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES lbmethod_bybusyness" + if test "$enable_proxy_balancer" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},lbmethod_bybusyness" + fi + ;; + esac + + + if test -z ""; then + objects="mod_lbmethod_bybusyness.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_lbmethod_bybusyness.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_lbmethod_heartbeat... " >&6; } + # Check whether --enable-lbmethod-heartbeat was given. +if test ${enable_lbmethod_heartbeat+y} +then : + enableval=$enable_lbmethod_heartbeat; force_lbmethod_heartbeat=$enableval +else case e in #( + e) enable_lbmethod_heartbeat=$enable_proxy_balancer ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_lbmethod_heartbeat" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_lbmethod_heartbeat" = "static" -o "$enable_lbmethod_heartbeat" = "shared"; then + : + elif test "$enable_lbmethod_heartbeat" = "yes"; then + enable_lbmethod_heartbeat=$module_default + elif test "$enable_lbmethod_heartbeat" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_lbmethod_heartbeat=$module_default + else + enable_lbmethod_heartbeat=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_lbmethod_heartbeat" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_lbmethod_heartbeat=$module_default + else + enable_lbmethod_heartbeat=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_lbmethod_heartbeat" = "all" -o "$enable_lbmethod_heartbeat" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_lbmethod_heartbeat=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_lbmethod_heartbeat=no + fi + elif test "$enable_lbmethod_heartbeat" = "reallyall" -o "$enable_lbmethod_heartbeat" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_lbmethod_heartbeat" != "no" ; then + enable_lbmethod_heartbeat=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_lbmethod_heartbeat=no + fi + else + enable_lbmethod_heartbeat=no + fi + if test "$enable_lbmethod_heartbeat" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_proxy_balancer" = "no" ; then + enable_lbmethod_heartbeat=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_proxy_balancer is disabled but required for mod_lbmethod_heartbeat\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_proxy_balancer is disabled but required for mod_lbmethod_heartbeat\"" >&2;} + elif test "$enable_lbmethod_heartbeat" = "static" && test "$enable_proxy_balancer" != "static" ; then + enable_lbmethod_heartbeat=$enable_proxy_balancer + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_lbmethod_heartbeat shared because mod_proxy_balancer is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_lbmethod_heartbeat shared because mod_proxy_balancer is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_lbmethod_heartbeat" >&5 +printf %s "checking whether to enable mod_lbmethod_heartbeat... " >&6; } + if test "$enable_lbmethod_heartbeat" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_lbmethod_heartbeat has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_lbmethod_heartbeat$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_lbmethod_heartbeat$_apmod_extra_msg" >&6; } + if test "$enable_lbmethod_heartbeat" != "no"; then + case "$enable_lbmethod_heartbeat" in + static*) + MODLIST="$MODLIST lbmethod_heartbeat" + if test "lbmethod_heartbeat" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES lbmethod_heartbeat" + if test "$enable_proxy_balancer" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},lbmethod_heartbeat" + fi + ;; + esac + + + if test -z ""; then + objects="mod_lbmethod_heartbeat.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_lbmethod_heartbeat.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which MPM to use by default" >&5 +printf %s "checking which MPM to use by default... " >&6; } + +# Check whether --with-mpm was given. +if test ${with_mpm+y} +then : + withval=$with_mpm; + default_mpm=$withval + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $withval" >&5 +printf "%s\n" "$withval" >&6; }; + +else case e in #( + e) + if ap_mpm_is_supported "winnt"; then + default_mpm=winnt + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: winnt" >&5 +printf "%s\n" "winnt" >&6; } + elif ap_mpm_is_supported "mpmt_os2"; then + default_mpm=mpmt_os2 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: mpmt_os2" >&5 +printf "%s\n" "mpmt_os2" >&6; } + elif ap_mpm_is_supported "event"; then + default_mpm=event + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: event" >&5 +printf "%s\n" "event" >&6; } + elif ap_mpm_is_supported "worker"; then + default_mpm=worker + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: worker - event is not supported" >&5 +printf "%s\n" "worker - event is not supported" >&6; } + else + default_mpm=prefork + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: prefork - event and worker are not supported" >&5 +printf "%s\n" "prefork - event and worker are not supported" >&6; } + fi + ;; +esac +fi + + + + if ap_mpm_is_enabled $default_mpm; then + : + else + eval "ap_enabled_mpm_$default_mpm=yes" + ap_enabled_mpms="$ap_enabled_mpms $default_mpm " + fi + + +# Check whether --enable-mpms-shared was given. +if test ${enable_mpms_shared+y} +then : + enableval=$enable_mpms_shared; + if test "$enableval" = "no"; then + mpm_build=static + else + mpm_build=shared + if test "$enableval" = "yes"; then + enableval=$default_mpm + fi + for i in $enableval; do + if test "$i" = "all"; then + for j in $ap_supported_shared_mpms; do + eval "enable_mpm_$j=shared" + + if ap_mpm_is_enabled $j; then + : + else + eval "ap_enabled_mpm_$j=yes" + ap_enabled_mpms="$ap_enabled_mpms $j " + fi + + done + else + i=`echo $i | sed 's/-/_/g'` + if ap_mpm_supports_shared $i; then + eval "enable_mpm_$i=shared" + + if ap_mpm_is_enabled $i; then + : + else + eval "ap_enabled_mpm_$i=yes" + ap_enabled_mpms="$ap_enabled_mpms $i " + fi + + else + as_fn_error $? "MPM $i does not support dynamic loading." "$LINENO" 5 + fi + fi + done + fi + +else case e in #( + e) mpm_build=static ;; +esac +fi + + +for i in $ap_enabled_mpms; do + if ap_mpm_is_supported $i; then + : + else + as_fn_error $? "MPM $i is not supported on this platform." "$LINENO" 5 + fi +done + +if test $mpm_build = "shared"; then + eval "tmp=\$enable_mpm_$default_mpm" + if test "$tmp" != "shared"; then + as_fn_error $? "The default MPM ($default_mpm) must be included in --enable-mpms-shared. Use --with-mpm to change the default MPM." "$LINENO" 5 + fi +fi + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES server/mpm/Makefile" + + +if test $mpm_build = "shared"; then + MPM_LIB="" +else + MPM_LIB=server/mpm/$default_mpm/lib${default_mpm}.la + MODLIST="$MODLIST mpm_${default_mpm}" +fi + +MPM_SUBDIRS=$ap_enabled_mpms + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST MPM_SUBDIRS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST MPM_LIB" + + + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST MOD_MPM_EVENT_LDADD" + + + + + if ap_mpm_is_enabled event; then + if test -z "event.lo"; then + objects="event.lo" + else + objects="event.lo" + fi + + if test -z ""; then + mpmpath="server/mpm/event" + else + mpmpath= + fi + + test -d $mpmpath || $srcdir/build/mkdir.sh $mpmpath + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $mpmpath/Makefile" + + + if test -z "$enable_mpm_event"; then + + if test "x$AP_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting AP_LIBS to \"\$(MOD_MPM_EVENT_LDADD)\"" + AP_LIBS="\$(MOD_MPM_EVENT_LDADD)" + else + apr_addto_bugger="\$(MOD_MPM_EVENT_LDADD)" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $AP_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to AP_LIBS" + AP_LIBS="$AP_LIBS $i" + fi + done + fi + + libname="libevent.la" + cat >$mpmpath/modules.mk<$mpmpath/modules.mk<>confdefs.h + +fi + + + fi + + + + if ap_mpm_is_enabled prefork; then + if test -z ""; then + objects="prefork.lo" + else + objects="" + fi + + if test -z ""; then + mpmpath="server/mpm/prefork" + else + mpmpath= + fi + + test -d $mpmpath || $srcdir/build/mkdir.sh $mpmpath + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $mpmpath/Makefile" + + + if test -z "$enable_mpm_prefork"; then + + if test "x$AP_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting AP_LIBS to \"\"" + AP_LIBS="" + else + apr_addto_bugger="" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $AP_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to AP_LIBS" + AP_LIBS="$AP_LIBS $i" + fi + done + fi + + libname="libprefork.la" + cat >$mpmpath/modules.mk<$mpmpath/modules.mk<$mpmpath/modules.mk<$mpmpath/modules.mk<$mpmpath/modules.mk<$mpmpath/modules.mk<>confdefs.h + +fi + + + fi + + + + + current_dir=arch/unix + modpath_current=modules/arch/unix + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d arch/unix || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +if ap_mpm_is_enabled "worker" \ + || ap_mpm_is_enabled "event" \ + || ap_mpm_is_enabled "prefork"; then + unixd_mods_enable=yes +else + unixd_mods_enable=no +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_unixd" >&5 +printf %s "checking whether to enable mod_unixd... " >&6; } + # Check whether --enable-unixd was given. +if test ${enable_unixd+y} +then : + enableval=$enable_unixd; force_unixd=$enableval +else case e in #( + e) enable_unixd=$unixd_mods_enable ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_unixd" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_unixd" = "static" -o "$enable_unixd" = "shared"; then + : + elif test "$enable_unixd" = "yes"; then + enable_unixd=$module_default + elif test "$enable_unixd" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_unixd=$module_default + else + enable_unixd=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_unixd" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_unixd=$module_default + else + enable_unixd=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_unixd" = "all" -o "$enable_unixd" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_unixd=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_unixd=no + fi + elif test "$enable_unixd" = "reallyall" -o "$enable_unixd" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_unixd" != "no" ; then + enable_unixd=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_unixd=no + fi + else + enable_unixd=no + fi + if test "$enable_unixd" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_unixd$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_unixd$_apmod_extra_msg" >&6; } + if test "$enable_unixd" != "no"; then + case "$enable_unixd" in + static*) + MODLIST="$MODLIST unixd" + if test "unixd" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES unixd" + if test "$unixd_mods_enable" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},unixd" + fi + ;; + esac + + + if test -z ""; then + objects="mod_unixd.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_unixd.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_privileges... " >&6; } + # Check whether --enable-privileges was given. +if test ${enable_privileges+y} +then : + enableval=$enable_privileges; force_privileges=$enableval +else case e in #( + e) enable_privileges=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_privileges" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_privileges" = "static" -o "$enable_privileges" = "shared"; then + : + elif test "$enable_privileges" = "yes"; then + enable_privileges=$module_default + elif test "$enable_privileges" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_privileges=$module_default + else + enable_privileges=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_privileges" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_privileges=$module_default + else + enable_privileges=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_privileges" = "all" -o "$enable_privileges" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_privileges=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_privileges=no + fi + elif test "$enable_privileges" = "reallyall" -o "$enable_privileges" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_privileges" != "no" ; then + enable_privileges=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_privileges=no + fi + else + enable_privileges=no + fi + if test "$enable_privileges" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + for ac_header in priv.h +do : + ac_fn_c_check_header_compile "$LINENO" "priv.h" "ac_cv_header_priv_h" "$ac_includes_default" +if test "x$ac_cv_header_priv_h" = xyes +then : + printf "%s\n" "#define HAVE_PRIV_H 1" >>confdefs.h + ap_HAVE_PRIV_H="yes" +else case e in #( + e) ap_HAVE_PRIV_H="no" ;; +esac +fi + +done + if test $ap_HAVE_PRIV_H = "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Your system does not support privileges." >&5 +printf "%s\n" "$as_me: WARNING: Your system does not support privileges." >&2;} + enable_privileges="no" + fi + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_privileges" >&5 +printf %s "checking whether to enable mod_privileges... " >&6; } + if test "$enable_privileges" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_privileges has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_privileges$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_privileges$_apmod_extra_msg" >&6; } + if test "$enable_privileges" != "no"; then + case "$enable_privileges" in + static*) + MODLIST="$MODLIST privileges" + if test "privileges" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES privileges" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},privileges" + fi + ;; + esac + + + if test -z ""; then + objects="mod_privileges.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_privileges.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_systemd... " >&6; } + # Check whether --enable-systemd was given. +if test ${enable_systemd+y} +then : + enableval=$enable_systemd; force_systemd=$enableval +else case e in #( + e) enable_systemd=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_systemd" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_systemd" = "static" -o "$enable_systemd" = "shared"; then + : + elif test "$enable_systemd" = "yes"; then + enable_systemd=$module_default + elif test "$enable_systemd" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_systemd=$module_default + else + enable_systemd=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_systemd" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_systemd=$module_default + else + enable_systemd=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_systemd" = "all" -o "$enable_systemd" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_systemd=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_systemd=no + fi + elif test "$enable_systemd" = "reallyall" -o "$enable_systemd" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_systemd" != "no" ; then + enable_systemd=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_systemd=no + fi + else + enable_systemd=no + fi + if test "$enable_systemd" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + if test "${ac_cv_header_systemd_sd_daemon_h}" = "no" || test -z "${SYSTEMD_LIBS}"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Your system does not support systemd." >&5 +printf "%s\n" "$as_me: WARNING: Your system does not support systemd." >&2;} + enable_systemd="no" + else + + if test "x$MOD_SYSTEMD_LDADD" = "x"; then + test "x$silent" != "xyes" && echo " setting MOD_SYSTEMD_LDADD to \"$SYSTEMD_LIBS\"" + MOD_SYSTEMD_LDADD="$SYSTEMD_LIBS" + else + apr_addto_bugger="$SYSTEMD_LIBS" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $MOD_SYSTEMD_LDADD; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to MOD_SYSTEMD_LDADD" + MOD_SYSTEMD_LDADD="$MOD_SYSTEMD_LDADD $i" + fi + done + fi + + fi + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_systemd" >&5 +printf %s "checking whether to enable mod_systemd... " >&6; } + if test "$enable_systemd" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_systemd has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_systemd$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_systemd$_apmod_extra_msg" >&6; } + if test "$enable_systemd" != "no"; then + case "$enable_systemd" in + static*) + MODLIST="$MODLIST systemd" + if test "systemd" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES systemd" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},systemd" + fi + ;; + esac + + + if test -z ""; then + objects="mod_systemd.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_systemd.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + + current_dir=cluster + modpath_current=modules/cluster + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d cluster || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +heartbeat_objects='mod_heartbeat.lo' + +case "$host" in + *os2*) + # OS/2 DLLs must resolve all symbols at build time + # and we need some from the watchdog module + heartbeat_objects="$heartbeat_objects ../core/mod_watchdog.la" + ;; +esac + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_heartbeat" >&5 +printf %s "checking whether to enable mod_heartbeat... " >&6; } + # Check whether --enable-heartbeat was given. +if test ${enable_heartbeat+y} +then : + enableval=$enable_heartbeat; force_heartbeat=$enableval +else case e in #( + e) enable_heartbeat=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_heartbeat" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_heartbeat" = "static" -o "$enable_heartbeat" = "shared"; then + : + elif test "$enable_heartbeat" = "yes"; then + enable_heartbeat=$module_default + elif test "$enable_heartbeat" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_heartbeat=$module_default + else + enable_heartbeat=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_heartbeat" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_heartbeat=$module_default + else + enable_heartbeat=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_heartbeat" = "all" -o "$enable_heartbeat" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_heartbeat=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_heartbeat=no + fi + elif test "$enable_heartbeat" = "reallyall" -o "$enable_heartbeat" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_heartbeat" != "no" ; then + enable_heartbeat=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_heartbeat=no + fi + else + enable_heartbeat=no + fi + if test "$enable_heartbeat" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_watchdog" = "no" ; then + enable_heartbeat=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_watchdog is disabled but required for mod_heartbeat\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_watchdog is disabled but required for mod_heartbeat\"" >&2;} + elif test "$enable_heartbeat" = "static" && test "$enable_watchdog" != "static" ; then + enable_heartbeat=$enable_watchdog + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_heartbeat shared because mod_watchdog is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_heartbeat shared because mod_watchdog is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_heartbeat" >&5 +printf %s "checking whether to enable mod_heartbeat... " >&6; } + if test "$enable_heartbeat" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_heartbeat has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_heartbeat$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_heartbeat$_apmod_extra_msg" >&6; } + if test "$enable_heartbeat" != "no"; then + case "$enable_heartbeat" in + static*) + MODLIST="$MODLIST heartbeat" + if test "heartbeat" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES heartbeat" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},heartbeat" + fi + ;; + esac + + + if test -z "$heartbeat_objects"; then + objects="mod_heartbeat.lo" + else + objects="$heartbeat_objects" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_heartbeat.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_heartmonitor... " >&6; } + # Check whether --enable-heartmonitor was given. +if test ${enable_heartmonitor+y} +then : + enableval=$enable_heartmonitor; force_heartmonitor=$enableval +else case e in #( + e) enable_heartmonitor=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_heartmonitor" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_heartmonitor" = "static" -o "$enable_heartmonitor" = "shared"; then + : + elif test "$enable_heartmonitor" = "yes"; then + enable_heartmonitor=$module_default + elif test "$enable_heartmonitor" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_heartmonitor=$module_default + else + enable_heartmonitor=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_heartmonitor" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_heartmonitor=$module_default + else + enable_heartmonitor=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_heartmonitor" = "all" -o "$enable_heartmonitor" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_heartmonitor=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_heartmonitor=no + fi + elif test "$enable_heartmonitor" = "reallyall" -o "$enable_heartmonitor" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_heartmonitor" != "no" ; then + enable_heartmonitor=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_heartmonitor=no + fi + else + enable_heartmonitor=no + fi + if test "$enable_heartmonitor" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_heartmonitor$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_heartmonitor$_apmod_extra_msg" >&6; } + if test "$enable_heartmonitor" != "no"; then + case "$enable_heartmonitor" in + static*) + MODLIST="$MODLIST heartmonitor" + if test "heartmonitor" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES heartmonitor" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},heartmonitor" + fi + ;; + esac + + + if test -z ""; then + objects="mod_heartmonitor.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_heartmonitor.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + current_dir=dav/main + modpath_current=modules/dav/main + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d dav/main || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +dav_objects="mod_dav.lo props.lo util.lo util_lock.lo liveprop.lo providers.lo std_liveprop.lo" + +if test "$enable_http" = "no"; then + dav_enable=no +else + dav_enable=most +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_dav" >&5 +printf %s "checking whether to enable mod_dav... " >&6; } + # Check whether --enable-dav was given. +if test ${enable_dav+y} +then : + enableval=$enable_dav; force_dav=$enableval +else case e in #( + e) enable_dav=$dav_enable ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_dav" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_dav" = "static" -o "$enable_dav" = "shared"; then + : + elif test "$enable_dav" = "yes"; then + enable_dav=$module_default + elif test "$enable_dav" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_dav=$module_default + else + enable_dav=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dav" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_dav=$module_default + else + enable_dav=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dav" = "all" -o "$enable_dav" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_dav=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_dav=no + fi + elif test "$enable_dav" = "reallyall" -o "$enable_dav" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_dav" != "no" ; then + enable_dav=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_dav=no + fi + else + enable_dav=no + fi + if test "$enable_dav" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_dav$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_dav$_apmod_extra_msg" >&6; } + if test "$enable_dav" != "no"; then + case "$enable_dav" in + static*) + MODLIST="$MODLIST dav" + if test "dav" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES dav" + if test "$dav_enable" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},dav" + fi + ;; + esac + + + if test -z "$dav_objects"; then + objects="mod_dav.lo" + else + objects="$dav_objects" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_dav.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + + current_dir=generators + modpath_current=modules/generators + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d generators || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_status" >&5 +printf %s "checking whether to enable mod_status... " >&6; } + # Check whether --enable-status was given. +if test ${enable_status+y} +then : + enableval=$enable_status; force_status=$enableval +else case e in #( + e) enable_status=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_status" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_status" = "static" -o "$enable_status" = "shared"; then + : + elif test "$enable_status" = "yes"; then + enable_status=$module_default + elif test "$enable_status" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_status=$module_default + else + enable_status=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_status" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_status=$module_default + else + enable_status=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_status" = "all" -o "$enable_status" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_status=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_status=no + fi + elif test "$enable_status" = "reallyall" -o "$enable_status" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_status" != "no" ; then + enable_status=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_status=no + fi + else + enable_status=no + fi + if test "$enable_status" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_status$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_status$_apmod_extra_msg" >&6; } + if test "$enable_status" != "no"; then + case "$enable_status" in + static*) + MODLIST="$MODLIST status" + if test "status" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES status" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},status" + fi + ;; + esac + + + if test -z ""; then + objects="mod_status.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_status.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_autoindex... " >&6; } + # Check whether --enable-autoindex was given. +if test ${enable_autoindex+y} +then : + enableval=$enable_autoindex; force_autoindex=$enableval +else case e in #( + e) enable_autoindex=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_autoindex" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_autoindex" = "static" -o "$enable_autoindex" = "shared"; then + : + elif test "$enable_autoindex" = "yes"; then + enable_autoindex=$module_default + elif test "$enable_autoindex" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_autoindex=$module_default + else + enable_autoindex=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_autoindex" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_autoindex=$module_default + else + enable_autoindex=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_autoindex" = "all" -o "$enable_autoindex" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_autoindex=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_autoindex=no + fi + elif test "$enable_autoindex" = "reallyall" -o "$enable_autoindex" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_autoindex" != "no" ; then + enable_autoindex=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_autoindex=no + fi + else + enable_autoindex=no + fi + if test "$enable_autoindex" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_autoindex$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_autoindex$_apmod_extra_msg" >&6; } + if test "$enable_autoindex" != "no"; then + case "$enable_autoindex" in + static*) + MODLIST="$MODLIST autoindex" + if test "autoindex" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES autoindex" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},autoindex" + fi + ;; + esac + + + if test -z ""; then + objects="mod_autoindex.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_autoindex.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_asis... " >&6; } + # Check whether --enable-asis was given. +if test ${enable_asis+y} +then : + enableval=$enable_asis; force_asis=$enableval +else case e in #( + e) enable_asis=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_asis" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_asis" = "static" -o "$enable_asis" = "shared"; then + : + elif test "$enable_asis" = "yes"; then + enable_asis=$module_default + elif test "$enable_asis" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_asis=$module_default + else + enable_asis=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_asis" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_asis=$module_default + else + enable_asis=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_asis" = "all" -o "$enable_asis" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_asis=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_asis=no + fi + elif test "$enable_asis" = "reallyall" -o "$enable_asis" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_asis" != "no" ; then + enable_asis=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_asis=no + fi + else + enable_asis=no + fi + if test "$enable_asis" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_asis$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_asis$_apmod_extra_msg" >&6; } + if test "$enable_asis" != "no"; then + case "$enable_asis" in + static*) + MODLIST="$MODLIST asis" + if test "asis" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES asis" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},asis" + fi + ;; + esac + + + if test -z ""; then + objects="mod_asis.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_asis.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_info... " >&6; } + # Check whether --enable-info was given. +if test ${enable_info+y} +then : + enableval=$enable_info; force_info=$enableval +else case e in #( + e) enable_info=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_info" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_info" = "static" -o "$enable_info" = "shared"; then + : + elif test "$enable_info" = "yes"; then + enable_info=$module_default + elif test "$enable_info" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_info=$module_default + else + enable_info=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_info" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_info=$module_default + else + enable_info=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_info" = "all" -o "$enable_info" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_info=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_info=no + fi + elif test "$enable_info" = "reallyall" -o "$enable_info" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_info" != "no" ; then + enable_info=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_info=no + fi + else + enable_info=no + fi + if test "$enable_info" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_info$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_info$_apmod_extra_msg" >&6; } + if test "$enable_info" != "no"; then + case "$enable_info" in + static*) + MODLIST="$MODLIST info" + if test "info" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES info" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},info" + fi + ;; + esac + + + if test -z ""; then + objects="mod_info.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_info.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_suexec... " >&6; } + # Check whether --enable-suexec was given. +if test ${enable_suexec+y} +then : + enableval=$enable_suexec; force_suexec=$enableval +else case e in #( + e) enable_suexec=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_suexec" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_suexec" = "static" -o "$enable_suexec" = "shared"; then + : + elif test "$enable_suexec" = "yes"; then + enable_suexec=$module_default + elif test "$enable_suexec" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_suexec=$module_default + else + enable_suexec=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_suexec" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_suexec=$module_default + else + enable_suexec=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_suexec" = "all" -o "$enable_suexec" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_suexec=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_suexec=no + fi + elif test "$enable_suexec" = "reallyall" -o "$enable_suexec" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_suexec" != "no" ; then + enable_suexec=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_suexec=no + fi + else + enable_suexec=no + fi + if test "$enable_suexec" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + other_targets=suexec + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_suexec" >&5 +printf %s "checking whether to enable mod_suexec... " >&6; } + if test "$enable_suexec" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_suexec has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_suexec$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_suexec$_apmod_extra_msg" >&6; } + if test "$enable_suexec" != "no"; then + case "$enable_suexec" in + static*) + MODLIST="$MODLIST suexec" + if test "suexec" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES suexec" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},suexec" + fi + ;; + esac + + + if test -z ""; then + objects="mod_suexec.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_suexec.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_cgid... " >&6; } + # Check whether --enable-cgid was given. +if test ${enable_cgid+y} +then : + enableval=$enable_cgid; force_cgid=$enableval +else case e in #( + e) enable_cgid=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_cgid" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_cgid" = "static" -o "$enable_cgid" = "shared"; then + : + elif test "$enable_cgid" = "yes"; then + enable_cgid=$module_default + elif test "$enable_cgid" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cgid=$module_default + else + enable_cgid=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgid" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_cgid=$module_default + else + enable_cgid=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgid" = "all" -o "$enable_cgid" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cgid=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cgid=no + fi + elif test "$enable_cgid" = "reallyall" -o "$enable_cgid" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_cgid" != "no" ; then + enable_cgid=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cgid=no + fi + else + enable_cgid=no + fi + if test "$enable_cgid" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + : + + case $host in + *-solaris2*) + case `uname -r` in + 5.10) + case `uname -p` in + i386) + patch_id="120665" + ;; + sparc) + patch_id="120664" + ;; + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Unknown platform" >&5 +printf "%s\n" "$as_me: WARNING: Unknown platform" >&2;} + patch_id="120664" + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Solaris patch $patch_id" >&5 +printf %s "checking for Solaris patch $patch_id... " >&6; } + showrev -p | grep "$patch_id" >/dev/null 2>&1 + if test $? -eq 1; then + as_fn_error $? "Please apply either patch # 120664 (Sparc) or # 120665 (x86). +Without these patches, mod_cgid is non-functional on Solaris 10 due to an OS +bug with AF_UNIX sockets. +If you can not apply these patches, you can do one of the following: + - run configure with --disable-cgid + - switch to the prefork MPM +For more info: " "$LINENO" 5 + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + fi + ;; + esac + ;; + esac + + : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_cgid" >&5 +printf %s "checking whether to enable mod_cgid... " >&6; } + if test "$enable_cgid" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_cgid has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_cgid$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_cgid$_apmod_extra_msg" >&6; } + if test "$enable_cgid" != "no"; then + case "$enable_cgid" in + static*) + MODLIST="$MODLIST cgid" + if test "cgid" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES cgid" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},cgid" + fi + ;; + esac + + + if test -z ""; then + objects="mod_cgid.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_cgid.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_cgi... " >&6; } + # Check whether --enable-cgi was given. +if test ${enable_cgi+y} +then : + enableval=$enable_cgi; force_cgi=$enableval +else case e in #( + e) enable_cgi=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_cgi" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_cgi" = "static" -o "$enable_cgi" = "shared"; then + : + elif test "$enable_cgi" = "yes"; then + enable_cgi=$module_default + elif test "$enable_cgi" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cgi=$module_default + else + enable_cgi=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgi" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_cgi=$module_default + else + enable_cgi=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgi" = "all" -o "$enable_cgi" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cgi=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cgi=no + fi + elif test "$enable_cgi" = "reallyall" -o "$enable_cgi" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_cgi" != "no" ; then + enable_cgi=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cgi=no + fi + else + enable_cgi=no + fi + if test "$enable_cgi" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_cgi$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_cgi$_apmod_extra_msg" >&6; } + if test "$enable_cgi" != "no"; then + case "$enable_cgi" in + static*) + MODLIST="$MODLIST cgi" + if test "cgi" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES cgi" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},cgi" + fi + ;; + esac + + + if test -z ""; then + objects="mod_cgi.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_cgi.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_cgi... " >&6; } + # Check whether --enable-cgi was given. +if test ${enable_cgi+y} +then : + enableval=$enable_cgi; force_cgi=$enableval +else case e in #( + e) enable_cgi=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_cgi" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_cgi" = "static" -o "$enable_cgi" = "shared"; then + : + elif test "$enable_cgi" = "yes"; then + enable_cgi=$module_default + elif test "$enable_cgi" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cgi=$module_default + else + enable_cgi=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgi" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_cgi=$module_default + else + enable_cgi=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgi" = "all" -o "$enable_cgi" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cgi=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cgi=no + fi + elif test "$enable_cgi" = "reallyall" -o "$enable_cgi" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_cgi" != "no" ; then + enable_cgi=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cgi=no + fi + else + enable_cgi=no + fi + if test "$enable_cgi" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_cgi$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_cgi$_apmod_extra_msg" >&6; } + if test "$enable_cgi" != "no"; then + case "$enable_cgi" in + static*) + MODLIST="$MODLIST cgi" + if test "cgi" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES cgi" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},cgi" + fi + ;; + esac + + + if test -z ""; then + objects="mod_cgi.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_cgi.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_cgid... " >&6; } + # Check whether --enable-cgid was given. +if test ${enable_cgid+y} +then : + enableval=$enable_cgid; force_cgid=$enableval +else case e in #( + e) enable_cgid=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_cgid" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_cgid" = "static" -o "$enable_cgid" = "shared"; then + : + elif test "$enable_cgid" = "yes"; then + enable_cgid=$module_default + elif test "$enable_cgid" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cgid=$module_default + else + enable_cgid=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgid" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_cgid=$module_default + else + enable_cgid=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgid" = "all" -o "$enable_cgid" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_cgid=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cgid=no + fi + elif test "$enable_cgid" = "reallyall" -o "$enable_cgid" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_cgid" != "no" ; then + enable_cgid=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_cgid=no + fi + else + enable_cgid=no + fi + if test "$enable_cgid" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_cgid$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_cgid$_apmod_extra_msg" >&6; } + if test "$enable_cgid" != "no"; then + case "$enable_cgid" in + static*) + MODLIST="$MODLIST cgid" + if test "cgid" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES cgid" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},cgid" + fi + ;; + esac + + + if test -z ""; then + objects="mod_cgid.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_cgid.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk< +#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_CMSG_DATA" = xyes +then : + +printf "%s\n" "#define HAVE_CGID_FDPASSING 1" >>confdefs.h + +else case e in #( + e) as_fn_error $? "cannot support mod_cgid fd-passing on this system" "$LINENO" 5 ;; +esac +fi + fi + +fi + + + + echo "DISTCLEAN_TARGETS = modules.mk" >> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + if ap_mpm_is_enabled mpmt_os2; then + if test -z "mpmt_os2.lo mpmt_os2_child.lo"; then + objects="mpmt_os2.lo" + else + objects="mpmt_os2.lo mpmt_os2_child.lo" + fi + + if test -z ""; then + mpmpath="server/mpm/mpmt_os2" + else + mpmpath= + fi + + test -d $mpmpath || $srcdir/build/mkdir.sh $mpmpath + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $mpmpath/Makefile" + + + if test -z "$enable_mpm_mpmt_os2"; then + + if test "x$AP_LIBS" = "x"; then + test "x$silent" != "xyes" && echo " setting AP_LIBS to \"\"" + AP_LIBS="" + else + apr_addto_bugger="" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $AP_LIBS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to AP_LIBS" + AP_LIBS="$AP_LIBS $i" + fi + done + fi + + libname="libmpmt_os2.la" + cat >$mpmpath/modules.mk<$mpmpath/modules.mk< $modpath_current/modules.mk + + +dav_fs_objects="mod_dav_fs.lo dbm.lo lock.lo repos.lo" + +if test "x$enable_dav" != "x"; then + dav_fs_enable=$enable_dav +else + dav_fs_enable=$dav_enable +fi + +case "$host" in + *os2*) + # OS/2 DLLs must resolve all symbols at build time + # and we need some from main DAV module + dav_fs_objects="$dav_fs_objects ../main/mod_dav.la" + ;; +esac + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_dav_fs" >&5 +printf %s "checking whether to enable mod_dav_fs... " >&6; } + # Check whether --enable-dav-fs was given. +if test ${enable_dav_fs+y} +then : + enableval=$enable_dav_fs; force_dav_fs=$enableval +else case e in #( + e) enable_dav_fs=$dav_fs_enable ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_dav_fs" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_dav_fs" = "static" -o "$enable_dav_fs" = "shared"; then + : + elif test "$enable_dav_fs" = "yes"; then + enable_dav_fs=$module_default + elif test "$enable_dav_fs" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_dav_fs=$module_default + else + enable_dav_fs=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dav_fs" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_dav_fs=$module_default + else + enable_dav_fs=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dav_fs" = "all" -o "$enable_dav_fs" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_dav_fs=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_dav_fs=no + fi + elif test "$enable_dav_fs" = "reallyall" -o "$enable_dav_fs" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_dav_fs" != "no" ; then + enable_dav_fs=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_dav_fs=no + fi + else + enable_dav_fs=no + fi + if test "$enable_dav_fs" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_dav" = "no" ; then + enable_dav_fs=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_dav is disabled but required for mod_dav_fs\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_dav is disabled but required for mod_dav_fs\"" >&2;} + elif test "$enable_dav_fs" = "static" && test "$enable_dav" != "static" ; then + enable_dav_fs=$enable_dav + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_dav_fs shared because mod_dav is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_dav_fs shared because mod_dav is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_dav_fs" >&5 +printf %s "checking whether to enable mod_dav_fs... " >&6; } + if test "$enable_dav_fs" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_dav_fs has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_dav_fs$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_dav_fs$_apmod_extra_msg" >&6; } + if test "$enable_dav_fs" != "no"; then + case "$enable_dav_fs" in + static*) + MODLIST="$MODLIST dav_fs" + if test "dav_fs" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES dav_fs" + if test "$dav_fs_enable" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},dav_fs" + fi + ;; + esac + + + if test -z "$dav_fs_objects"; then + objects="mod_dav_fs.lo" + else + objects="$dav_fs_objects" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_dav_fs.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + current_dir=dav/lock + modpath_current=modules/dav/lock + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d dav/lock || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +dav_lock_objects="mod_dav_lock.lo locks.lo" + +case "$host" in + *os2*) + # OS/2 DLLs must resolve all symbols at build time + # and we need some from main DAV module + dav_lock_objects="$dav_lock_objects ../main/mod_dav.la" + ;; +esac + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_dav_lock" >&5 +printf %s "checking whether to enable mod_dav_lock... " >&6; } + # Check whether --enable-dav-lock was given. +if test ${enable_dav_lock+y} +then : + enableval=$enable_dav_lock; force_dav_lock=$enableval +else case e in #( + e) enable_dav_lock=maybe-all ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_dav_lock" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_dav_lock" = "static" -o "$enable_dav_lock" = "shared"; then + : + elif test "$enable_dav_lock" = "yes"; then + enable_dav_lock=$module_default + elif test "$enable_dav_lock" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_dav_lock=$module_default + else + enable_dav_lock=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dav_lock" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_dav_lock=$module_default + else + enable_dav_lock=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dav_lock" = "all" -o "$enable_dav_lock" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_dav_lock=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_dav_lock=no + fi + elif test "$enable_dav_lock" = "reallyall" -o "$enable_dav_lock" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_dav_lock" != "no" ; then + enable_dav_lock=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_dav_lock=no + fi + else + enable_dav_lock=no + fi + if test "$enable_dav_lock" != "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking dependencies" >&5 +printf "%s\n" "checking dependencies" >&6; } + if test "$enable_dav" = "no" ; then + enable_dav_lock=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"mod_dav is disabled but required for mod_dav_lock\"" >&5 +printf "%s\n" "$as_me: WARNING: \"mod_dav is disabled but required for mod_dav_lock\"" >&2;} + elif test "$enable_dav_lock" = "static" && test "$enable_dav" != "static" ; then + enable_dav_lock=$enable_dav + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"building mod_dav_lock shared because mod_dav is built shared\"" >&5 +printf "%s\n" "$as_me: WARNING: \"building mod_dav_lock shared because mod_dav is built shared\"" >&2;} + else + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_dav_lock" >&5 +printf %s "checking whether to enable mod_dav_lock... " >&6; } + if test "$enable_dav_lock" = "no"; then + if test "$_apmod_required" = "no"; then + _apmod_extra_msg=" (disabled)" + else + as_fn_error $? "mod_dav_lock has been requested but can not be built due to prerequisite failures" "$LINENO" 5 + fi + fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_dav_lock$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_dav_lock$_apmod_extra_msg" >&6; } + if test "$enable_dav_lock" != "no"; then + case "$enable_dav_lock" in + static*) + MODLIST="$MODLIST dav_lock" + if test "dav_lock" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES dav_lock" + if test "" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},dav_lock" + fi + ;; + esac + + + if test -z "$dav_lock_objects"; then + objects="mod_dav_lock.lo" + else + objects="$dav_lock_objects" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_dav_lock.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for extra modules" >&5 +printf %s "checking for extra modules... " >&6; } + +# Check whether --with-module was given. +if test ${with_module+y} +then : + withval=$with_module; + withval=`echo $withval | sed -e 's/,/ /g'` + for mod in $withval + do + modtype=`echo $mod | sed -e's/\(.*\):.*/\1/'` + pkg=`echo $mod | sed -e's/.*:\(.*\)/\1/'` + modfilec=`echo $pkg | sed -e 's;^.*/;;'` + modfileo=`echo $pkg | sed -e 's;^.*/;;' -e 's;\.c$;.o;'` + modpath_current="modules/$modtype" + if test "x$mod" != "x$modpath_current/$modfilec"; then + if test ! -d "$modpath_current"; then + mkdir $modpath_current + echo 'include $(top_srcdir)/build/special.mk' > $modpath_current/Makefile.in + fi + cp $pkg $modpath_current/$modfilec + fi + module=`echo $pkg | sed -e 's;\(.*/\).*mod_\(.*\).c;\2;'` + objects="mod_$module.lo" + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_$module.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + if test ! -s "$modpath_current/modules.mk"; then + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk.tmp<> $modpath_current/modules.mk.tmp + rm $modpath_current/modules.mk + mv $modpath_current/modules.mk.tmp $modpath_current/modules.mk + sed -e "s/\(static =.*\)/\1 $libname/" $modpath_current/modules.mk > $modpath_current/modules.mk.tmp + rm $modpath_current/modules.mk + mv $modpath_current/modules.mk.tmp $modpath_current/modules.mk + fi + MODLIST="$MODLIST $module" + EXTRA_MODLIST="$EXTRA_MODLIST $modtype:$modfilec" + MODULE_DIRS="$MODULE_DIRS $modtype" + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + done + if test ! -z "$EXTRA_MODLIST"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: added:$EXTRA_MODLIST" >&5 +printf "%s\n" "added:$EXTRA_MODLIST" >&6; } + fi + +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } + ;; +esac +fi + + + + + + current_dir=mappers + modpath_current=modules/mappers + modpath_static= + modpath_shared= + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + eval MOD_$var= + done + test -d mappers || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable mod_vhost_alias" >&5 +printf %s "checking whether to enable mod_vhost_alias... " >&6; } + # Check whether --enable-vhost-alias was given. +if test ${enable_vhost_alias+y} +then : + enableval=$enable_vhost_alias; force_vhost_alias=$enableval +else case e in #( + e) enable_vhost_alias=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_vhost_alias" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_vhost_alias" = "static" -o "$enable_vhost_alias" = "shared"; then + : + elif test "$enable_vhost_alias" = "yes"; then + enable_vhost_alias=$module_default + elif test "$enable_vhost_alias" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_vhost_alias=$module_default + else + enable_vhost_alias=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_vhost_alias" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_vhost_alias=$module_default + else + enable_vhost_alias=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_vhost_alias" = "all" -o "$enable_vhost_alias" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_vhost_alias=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_vhost_alias=no + fi + elif test "$enable_vhost_alias" = "reallyall" -o "$enable_vhost_alias" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_vhost_alias" != "no" ; then + enable_vhost_alias=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_vhost_alias=no + fi + else + enable_vhost_alias=no + fi + if test "$enable_vhost_alias" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_vhost_alias$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_vhost_alias$_apmod_extra_msg" >&6; } + if test "$enable_vhost_alias" != "no"; then + case "$enable_vhost_alias" in + static*) + MODLIST="$MODLIST vhost_alias" + if test "vhost_alias" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES vhost_alias" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},vhost_alias" + fi + ;; + esac + + + if test -z ""; then + objects="mod_vhost_alias.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_vhost_alias.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_negotiation... " >&6; } + # Check whether --enable-negotiation was given. +if test ${enable_negotiation+y} +then : + enableval=$enable_negotiation; force_negotiation=$enableval +else case e in #( + e) enable_negotiation=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_negotiation" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_negotiation" = "static" -o "$enable_negotiation" = "shared"; then + : + elif test "$enable_negotiation" = "yes"; then + enable_negotiation=$module_default + elif test "$enable_negotiation" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_negotiation=$module_default + else + enable_negotiation=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_negotiation" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_negotiation=$module_default + else + enable_negotiation=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_negotiation" = "all" -o "$enable_negotiation" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_negotiation=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_negotiation=no + fi + elif test "$enable_negotiation" = "reallyall" -o "$enable_negotiation" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_negotiation" != "no" ; then + enable_negotiation=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_negotiation=no + fi + else + enable_negotiation=no + fi + if test "$enable_negotiation" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_negotiation$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_negotiation$_apmod_extra_msg" >&6; } + if test "$enable_negotiation" != "no"; then + case "$enable_negotiation" in + static*) + MODLIST="$MODLIST negotiation" + if test "negotiation" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES negotiation" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},negotiation" + fi + ;; + esac + + + if test -z ""; then + objects="mod_negotiation.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_negotiation.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_dir... " >&6; } + # Check whether --enable-dir was given. +if test ${enable_dir+y} +then : + enableval=$enable_dir; force_dir=$enableval +else case e in #( + e) enable_dir=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_dir" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_dir" = "static" -o "$enable_dir" = "shared"; then + : + elif test "$enable_dir" = "yes"; then + enable_dir=$module_default + elif test "$enable_dir" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_dir=$module_default + else + enable_dir=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dir" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_dir=$module_default + else + enable_dir=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dir" = "all" -o "$enable_dir" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_dir=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_dir=no + fi + elif test "$enable_dir" = "reallyall" -o "$enable_dir" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_dir" != "no" ; then + enable_dir=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_dir=no + fi + else + enable_dir=no + fi + if test "$enable_dir" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_dir$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_dir$_apmod_extra_msg" >&6; } + if test "$enable_dir" != "no"; then + case "$enable_dir" in + static*) + MODLIST="$MODLIST dir" + if test "dir" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES dir" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},dir" + fi + ;; + esac + + + if test -z ""; then + objects="mod_dir.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_dir.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_imagemap... " >&6; } + # Check whether --enable-imagemap was given. +if test ${enable_imagemap+y} +then : + enableval=$enable_imagemap; force_imagemap=$enableval +else case e in #( + e) enable_imagemap=no ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_imagemap" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_imagemap" = "static" -o "$enable_imagemap" = "shared"; then + : + elif test "$enable_imagemap" = "yes"; then + enable_imagemap=$module_default + elif test "$enable_imagemap" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_imagemap=$module_default + else + enable_imagemap=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_imagemap" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_imagemap=$module_default + else + enable_imagemap=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_imagemap" = "all" -o "$enable_imagemap" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_imagemap=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_imagemap=no + fi + elif test "$enable_imagemap" = "reallyall" -o "$enable_imagemap" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_imagemap" != "no" ; then + enable_imagemap=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_imagemap=no + fi + else + enable_imagemap=no + fi + if test "$enable_imagemap" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_imagemap$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_imagemap$_apmod_extra_msg" >&6; } + if test "$enable_imagemap" != "no"; then + case "$enable_imagemap" in + static*) + MODLIST="$MODLIST imagemap" + if test "imagemap" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES imagemap" + if test "no" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},imagemap" + fi + ;; + esac + + + if test -z ""; then + objects="mod_imagemap.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_imagemap.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_actions... " >&6; } + # Check whether --enable-actions was given. +if test ${enable_actions+y} +then : + enableval=$enable_actions; force_actions=$enableval +else case e in #( + e) enable_actions=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_actions" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_actions" = "static" -o "$enable_actions" = "shared"; then + : + elif test "$enable_actions" = "yes"; then + enable_actions=$module_default + elif test "$enable_actions" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_actions=$module_default + else + enable_actions=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_actions" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_actions=$module_default + else + enable_actions=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_actions" = "all" -o "$enable_actions" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_actions=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_actions=no + fi + elif test "$enable_actions" = "reallyall" -o "$enable_actions" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_actions" != "no" ; then + enable_actions=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_actions=no + fi + else + enable_actions=no + fi + if test "$enable_actions" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_actions$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_actions$_apmod_extra_msg" >&6; } + if test "$enable_actions" != "no"; then + case "$enable_actions" in + static*) + MODLIST="$MODLIST actions" + if test "actions" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES actions" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},actions" + fi + ;; + esac + + + if test -z ""; then + objects="mod_actions.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_actions.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_speling... " >&6; } + # Check whether --enable-speling was given. +if test ${enable_speling+y} +then : + enableval=$enable_speling; force_speling=$enableval +else case e in #( + e) enable_speling=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_speling" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_speling" = "static" -o "$enable_speling" = "shared"; then + : + elif test "$enable_speling" = "yes"; then + enable_speling=$module_default + elif test "$enable_speling" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_speling=$module_default + else + enable_speling=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_speling" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_speling=$module_default + else + enable_speling=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_speling" = "all" -o "$enable_speling" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_speling=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_speling=no + fi + elif test "$enable_speling" = "reallyall" -o "$enable_speling" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_speling" != "no" ; then + enable_speling=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_speling=no + fi + else + enable_speling=no + fi + if test "$enable_speling" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_speling$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_speling$_apmod_extra_msg" >&6; } + if test "$enable_speling" != "no"; then + case "$enable_speling" in + static*) + MODLIST="$MODLIST speling" + if test "speling" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES speling" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},speling" + fi + ;; + esac + + + if test -z ""; then + objects="mod_speling.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_speling.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_userdir... " >&6; } + # Check whether --enable-userdir was given. +if test ${enable_userdir+y} +then : + enableval=$enable_userdir; force_userdir=$enableval +else case e in #( + e) enable_userdir=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_userdir" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_userdir" = "static" -o "$enable_userdir" = "shared"; then + : + elif test "$enable_userdir" = "yes"; then + enable_userdir=$module_default + elif test "$enable_userdir" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_userdir=$module_default + else + enable_userdir=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_userdir" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_userdir=$module_default + else + enable_userdir=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_userdir" = "all" -o "$enable_userdir" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_userdir=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_userdir=no + fi + elif test "$enable_userdir" = "reallyall" -o "$enable_userdir" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_userdir" != "no" ; then + enable_userdir=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_userdir=no + fi + else + enable_userdir=no + fi + if test "$enable_userdir" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_userdir$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_userdir$_apmod_extra_msg" >&6; } + if test "$enable_userdir" != "no"; then + case "$enable_userdir" in + static*) + MODLIST="$MODLIST userdir" + if test "userdir" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES userdir" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},userdir" + fi + ;; + esac + + + if test -z ""; then + objects="mod_userdir.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_userdir.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_alias... " >&6; } + # Check whether --enable-alias was given. +if test ${enable_alias+y} +then : + enableval=$enable_alias; force_alias=$enableval +else case e in #( + e) enable_alias=yes ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_alias" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_alias" = "static" -o "$enable_alias" = "shared"; then + : + elif test "$enable_alias" = "yes"; then + enable_alias=$module_default + elif test "$enable_alias" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_alias=$module_default + else + enable_alias=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_alias" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_alias=$module_default + else + enable_alias=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_alias" = "all" -o "$enable_alias" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_alias=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_alias=no + fi + elif test "$enable_alias" = "reallyall" -o "$enable_alias" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_alias" != "no" ; then + enable_alias=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_alias=no + fi + else + enable_alias=no + fi + if test "$enable_alias" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_alias$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_alias$_apmod_extra_msg" >&6; } + if test "$enable_alias" != "no"; then + case "$enable_alias" in + static*) + MODLIST="$MODLIST alias" + if test "alias" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES alias" + if test "yes" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},alias" + fi + ;; + esac + + + if test -z ""; then + objects="mod_alias.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_alias.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +printf %s "checking whether to enable mod_rewrite... " >&6; } + # Check whether --enable-rewrite was given. +if test ${enable_rewrite+y} +then : + enableval=$enable_rewrite; force_rewrite=$enableval +else case e in #( + e) enable_rewrite=most ;; +esac +fi + + _apmod_extra_msg="" + case "$enable_rewrite" in + yes|static|shared) + _apmod_required="yes" + ;; + *) + _apmod_required="no" + ;; + esac + if test "$enable_rewrite" = "static" -o "$enable_rewrite" = "shared"; then + : + elif test "$enable_rewrite" = "yes"; then + enable_rewrite=$module_default + elif test "$enable_rewrite" = "few"; then + if test "$module_selection" = "few" -o "$module_selection" = "most" -o \ + "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_rewrite=$module_default + else + enable_rewrite=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_rewrite" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all" -o \ + "$module_selection" = "reallyall" + then + enable_rewrite=$module_default + else + enable_rewrite=no + fi + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_rewrite" = "all" -o "$enable_rewrite" = "maybe-all"; then + if test "$module_selection" = "all" -o "$module_selection" = "reallyall" + then + enable_rewrite=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_rewrite=no + fi + elif test "$enable_rewrite" = "reallyall" -o "$enable_rewrite" = "no" ; then + if test "$module_selection" = "reallyall" -a "$force_rewrite" != "no" ; then + enable_rewrite=$module_default + _apmod_extra_msg=" ($module_selection)" + else + enable_rewrite=no + fi + else + enable_rewrite=no + fi + if test "$enable_rewrite" != "no"; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_rewrite$_apmod_extra_msg" >&5 +printf "%s\n" "$enable_rewrite$_apmod_extra_msg" >&6; } + if test "$enable_rewrite" != "no"; then + case "$enable_rewrite" in + static*) + MODLIST="$MODLIST rewrite" + if test "rewrite" = "so"; then + sharedobjs=yes + fi + shared="";; + *) + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES rewrite" + if test "most" = "yes" ; then + ENABLED_DSO_MODULES="${ENABLED_DSO_MODULES},rewrite" + fi + ;; + esac + + + if test -z ""; then + objects="mod_rewrite.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + # The filename of a convenience library must have a "lib" prefix: + libname="libmod_rewrite.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<> $modpath_current/modules.mk + echo "static = $modpath_static" >> $modpath_current/modules.mk + echo "shared = $modpath_shared" >> $modpath_current/modules.mk + for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LIBS INCLUDES; do + if eval val=\"\$MOD_$var\"; test -n "$val"; then + echo "MOD_$var = $val" >> $modpath_current/modules.mk + fi + done + if test ! -z "$modpath_static" -o ! -z "$modpath_shared"; then + MODULE_DIRS="$MODULE_DIRS $current_dir" + else + MODULE_CLEANDIRS="$MODULE_CLEANDIRS $current_dir" + fi + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES $modpath_current/Makefile" + + + + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST progname" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST OS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST OS_DIR" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST BUILTIN_LIBS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST SHLIBPATH_VAR" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST OS_SPECIFIC_VARS" + + + +PRE_SHARED_CMDS='echo ""' +POST_SHARED_CMDS='echo ""' + + +if test "$apache_need_shared" = "yes"; then + if test -f $ac_aux_dir/ltconfig; then + $SHELL $ac_aux_dir/ltconfig --output=shlibtool --disable-static --srcdir=$ac_aux_dir --cache-file=./config.cache $ac_aux_dir/ltmain.sh + fi + shared_build="shared-build" +fi + + +if test "$enable_so" = "yes" -o "$enable_so" = "static"; then + case $host in + *-ibm-aix*) + + if test "x$HTTPD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting HTTPD_LDFLAGS to \"-Wl,-uXML_Parse -Wl,-bE:$abs_builddir/server/httpd.exp\"" + HTTPD_LDFLAGS="-Wl,-uXML_Parse -Wl,-bE:$abs_builddir/server/httpd.exp" + else + apr_addto_bugger="-Wl,-uXML_Parse -Wl,-bE:$abs_builddir/server/httpd.exp" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $HTTPD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to HTTPD_LDFLAGS" + HTTPD_LDFLAGS="$HTTPD_LDFLAGS $i" + fi + done + fi + + + if test "x$SH_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting SH_LDFLAGS to \"\$(EXTRA_LDFLAGS) \$(EXTRA_LIBS)\"" + SH_LDFLAGS="\$(EXTRA_LDFLAGS) \$(EXTRA_LIBS)" + else + apr_addto_bugger="\$(EXTRA_LDFLAGS) \$(EXTRA_LIBS)" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $SH_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to SH_LDFLAGS" + SH_LDFLAGS="$SH_LDFLAGS $i" + fi + done + fi + + + if test "x$UTIL_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting UTIL_LDFLAGS to \"-Wl,-uXML_Parse\"" + UTIL_LDFLAGS="-Wl,-uXML_Parse" + else + apr_addto_bugger="-Wl,-uXML_Parse" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $UTIL_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to UTIL_LDFLAGS" + UTIL_LDFLAGS="$UTIL_LDFLAGS $i" + fi + done + fi + + ;; + *os390) + + if test "x$HTTPD_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting HTTPD_LDFLAGS to \"--main=$abs_srcdir/server/main.o --core-dll=$abs_srcdir/apachecore.dll\"" + HTTPD_LDFLAGS="--main=$abs_srcdir/server/main.o --core-dll=$abs_srcdir/apachecore.dll" + else + apr_addto_bugger="--main=$abs_srcdir/server/main.o --core-dll=$abs_srcdir/apachecore.dll" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $HTTPD_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to HTTPD_LDFLAGS" + HTTPD_LDFLAGS="$HTTPD_LDFLAGS $i" + fi + done + fi + + + if test "x$SH_LDFLAGS" = "x"; then + test "x$silent" != "xyes" && echo " setting SH_LDFLAGS to \"--core-dll=$abs_srcdir/apachecore.dll\"" + SH_LDFLAGS="--core-dll=$abs_srcdir/apachecore.dll" + else + apr_addto_bugger="--core-dll=$abs_srcdir/apachecore.dll" + for i in $apr_addto_bugger; do + apr_addto_duplicate="0" + for j in $SH_LDFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + test "x$silent" != "xyes" && echo " adding \"$i\" to SH_LDFLAGS" + SH_LDFLAGS="$SH_LDFLAGS $i" + fi + done + fi + + esac + MOD_SO_ENABLED=yes +fi + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST PRE_SHARED_CMDS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST POST_SHARED_CMDS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST shared_build" + + + + +# Check whether --with-program-name was given. +if test ${with_program_name+y} +then : + withval=$with_program_name; + progname="$withval" +else case e in #( + e) + progname="httpd" ;; +esac +fi + + +# SuExec parameters + +# Check whether --with-suexec-bin was given. +if test ${with_suexec_bin+y} +then : + withval=$with_suexec_bin; + +printf "%s\n" "#define SUEXEC_BIN \"$withval\"" >>confdefs.h + + +fi + + + +# Check whether --with-suexec-caller was given. +if test ${with_suexec_caller+y} +then : + withval=$with_suexec_caller; + +printf "%s\n" "#define AP_HTTPD_USER \"$withval\"" >>confdefs.h + +fi + + + +# Check whether --with-suexec-userdir was given. +if test ${with_suexec_userdir+y} +then : + withval=$with_suexec_userdir; + +printf "%s\n" "#define AP_USERDIR_SUFFIX \"$withval\"" >>confdefs.h + +fi + + + +# Check whether --with-suexec-docroot was given. +if test ${with_suexec_docroot+y} +then : + withval=$with_suexec_docroot; + +printf "%s\n" "#define AP_DOC_ROOT \"$withval\"" >>confdefs.h + +fi + + + +# Check whether --with-suexec-uidmin was given. +if test ${with_suexec_uidmin+y} +then : + withval=$with_suexec_uidmin; + +printf "%s\n" "#define AP_UID_MIN $withval" >>confdefs.h + +fi + + + +# Check whether --with-suexec-gidmin was given. +if test ${with_suexec_gidmin+y} +then : + withval=$with_suexec_gidmin; + +printf "%s\n" "#define AP_GID_MIN $withval" >>confdefs.h + +fi + + + +# Check whether --with-suexec-logfile was given. +if test ${with_suexec_logfile+y} +then : + withval=$with_suexec_logfile; + if test "x$withval" = "xyes"; then + as_fn_error $? "log filename required for --with-suexec-logfile option" "$LINENO" 5 + elif test "x$withval" != "xno"; then + +printf "%s\n" "#define AP_LOG_EXEC \"$withval\"" >>confdefs.h + + fi + +fi + + + +# Check whether --with-suexec-syslog was given. +if test ${with_suexec_syslog+y} +then : + withval=$with_suexec_syslog; + if test $withval = "yes"; then + if test "x${with_suexec_logfile}" != "xno"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: hint: use \"--without-suexec-logfile --with-suexec-syslog\"" >&5 +printf "%s\n" "$as_me: hint: use \"--without-suexec-logfile --with-suexec-syslog\"" >&6;} + as_fn_error $? "suexec does not support both logging to file and syslog" "$LINENO" 5 + fi + + for ac_func in vsyslog +do : + ac_fn_c_check_func "$LINENO" "vsyslog" "ac_cv_func_vsyslog" +if test "x$ac_cv_func_vsyslog" = xyes +then : + printf "%s\n" "#define HAVE_VSYSLOG 1" >>confdefs.h + +else case e in #( + e) + as_fn_error $? "cannot support syslog from suexec without vsyslog()" "$LINENO" 5 ;; +esac +fi + +done + +printf "%s\n" "#define AP_LOG_SYSLOG 1" >>confdefs.h + + fi + +fi + + + + +# Check whether --with-suexec-safepath was given. +if test ${with_suexec_safepath+y} +then : + withval=$with_suexec_safepath; + +printf "%s\n" "#define AP_SAFE_PATH \"$withval\"" >>confdefs.h + +fi + + + +# Check whether --with-suexec-umask was given. +if test ${with_suexec_umask+y} +then : + withval=$with_suexec_umask; + +printf "%s\n" "#define AP_SUEXEC_UMASK 0$withval" >>confdefs.h + +fi + + +INSTALL_SUEXEC=setuid +# Check whether --enable-suexec-capabilities was given. +if test ${enable_suexec_capabilities+y} +then : + enableval=$enable_suexec_capabilities; +INSTALL_SUEXEC=caps + +printf "%s\n" "#define AP_SUEXEC_CAPABILITIES 1" >>confdefs.h + + +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST INSTALL_SUEXEC" + + + +if test x${apu_found} != xobsolete; then + AP_LIBS="$AP_LIBS `$apu_config --avoid-ldap --link-libtool --libs`" +fi +AP_LIBS="$AP_LIBS `$apr_config --link-libtool --libs`" + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST AP_LIBS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST AP_BUILD_SRCLIB_DIRS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST AP_CLEAN_SRCLIB_DIRS" + + + + +printf "%s\n" "#define AP_USING_AUTOCONF 1" >>confdefs.h + + +if test "$SINGLE_LISTEN_UNSERIALIZED_ACCEPT" = "1"; then + +printf "%s\n" "#define SINGLE_LISTEN_UNSERIALIZED_ACCEPT 1" >>confdefs.h + +fi + +if test "$AP_NONBLOCK_WHEN_MULTI_LISTEN" = "1"; then + +printf "%s\n" "#define AP_NONBLOCK_WHEN_MULTI_LISTEN 1" >>confdefs.h + +fi + + +apr_old_cppflags=$CPPFLAGS +CPPFLAGS="$CPPFLAGS $INCLUDES" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if APR_HAVE_IPV6 +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP_TRADITIONAL "YES_IS_DEFINED" >/dev/null 2>&1 +then : + ac_cv_define_APR_HAVE_IPV6=yes +else case e in #( + e) ac_cv_define_APR_HAVE_IPV6=no ;; +esac +fi +rm -rf conftest* + +CPPFLAGS=$apr_old_cppflags + + +# Check whether --enable-v4-mapped was given. +if test ${enable_v4_mapped+y} +then : + enableval=$enable_v4_mapped; + v4mapped=$enableval + +else case e in #( + e) + case $host in + *freebsd[1234].*) + v4mapped=yes + ;; + *freebsd*|*netbsd*|*openbsd*) + v4mapped=no + ;; + *) + v4mapped=yes + ;; + esac + if ap_mpm_is_enabled winnt; then + v4mapped=no + fi + ;; +esac +fi + + +if test $v4mapped = "yes" -a $ac_cv_define_APR_HAVE_IPV6 = "yes"; then + +printf "%s\n" "#define AP_ENABLE_V4_MAPPED 1" >>confdefs.h + +fi + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES Makefile modules/Makefile srclib/Makefile" + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES os/Makefile server/Makefile" + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES support/Makefile" + + +if test -d ./test; then + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES test/Makefile" + +fi +if test -d ./test/modules/http2; then + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES test/Makefile" + + ac_config_files="$ac_config_files test/pyhttpd/config.ini" + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES test/clients/Makefile" + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: " >&5 +printf "%s\n" "$as_me: " >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Restore user-defined environment settings..." >&5 +printf "%s\n" "$as_me: Restore user-defined environment settings..." >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: " >&5 +printf "%s\n" "$as_me: " >&6;} + +APACHE_CONF_SEL_CC=${CC} +APACHE_CONF_SEL_CFLAGS="${CFLAGS} ${EXTRA_CFLAGS} ${NOTEST_CFLAGS}" +APACHE_CONF_SEL_CPPFLAGS="${CPPFLAGS} ${EXTRA_CPPFLAGS} ${NOTEST_CPPFLAGS}" +APACHE_CONF_SEL_LDFLAGS="${LDFLAGS} ${EXTRA_LDFLAGS} ${NOTEST_LDFLAGS}" +APACHE_CONF_SEL_LIBS="${LIBS} ${EXTRA_LIBS} ${NOTEST_LIBS}" +APACHE_CONF_SEL_CPP=${CPP} + + +set X $apr_ste_save_CPPFLAGS +if test ${#} -eq 1; then + EXTRA_CPPFLAGS="$CPPFLAGS" + CPPFLAGS= +else + if test "x$apr_ste_save_CPPFLAGS" = "x$CPPFLAGS"; then + EXTRA_CPPFLAGS= + else + EXTRA_CPPFLAGS=`echo "$CPPFLAGS" | sed -e "s%${apr_ste_save_CPPFLAGS}%%"` + CPPFLAGS="$apr_ste_save_CPPFLAGS" + fi +fi +if test "x$silent" != "xyes"; then + echo " restoring CPPFLAGS to \"$CPPFLAGS\"" + echo " setting EXTRA_CPPFLAGS to \"$EXTRA_CPPFLAGS\"" +fi + + + +set X $apr_ste_save_CFLAGS +if test ${#} -eq 1; then + EXTRA_CFLAGS="$CFLAGS" + CFLAGS= +else + if test "x$apr_ste_save_CFLAGS" = "x$CFLAGS"; then + EXTRA_CFLAGS= + else + EXTRA_CFLAGS=`echo "$CFLAGS" | sed -e "s%${apr_ste_save_CFLAGS}%%"` + CFLAGS="$apr_ste_save_CFLAGS" + fi +fi +if test "x$silent" != "xyes"; then + echo " restoring CFLAGS to \"$CFLAGS\"" + echo " setting EXTRA_CFLAGS to \"$EXTRA_CFLAGS\"" +fi + + + +set X $apr_ste_save_CXXFLAGS +if test ${#} -eq 1; then + EXTRA_CXXFLAGS="$CXXFLAGS" + CXXFLAGS= +else + if test "x$apr_ste_save_CXXFLAGS" = "x$CXXFLAGS"; then + EXTRA_CXXFLAGS= + else + EXTRA_CXXFLAGS=`echo "$CXXFLAGS" | sed -e "s%${apr_ste_save_CXXFLAGS}%%"` + CXXFLAGS="$apr_ste_save_CXXFLAGS" + fi +fi +if test "x$silent" != "xyes"; then + echo " restoring CXXFLAGS to \"$CXXFLAGS\"" + echo " setting EXTRA_CXXFLAGS to \"$EXTRA_CXXFLAGS\"" +fi + + + +set X $apr_ste_save_LDFLAGS +if test ${#} -eq 1; then + EXTRA_LDFLAGS="$LDFLAGS" + LDFLAGS= +else + if test "x$apr_ste_save_LDFLAGS" = "x$LDFLAGS"; then + EXTRA_LDFLAGS= + else + EXTRA_LDFLAGS=`echo "$LDFLAGS" | sed -e "s%${apr_ste_save_LDFLAGS}%%"` + LDFLAGS="$apr_ste_save_LDFLAGS" + fi +fi +if test "x$silent" != "xyes"; then + echo " restoring LDFLAGS to \"$LDFLAGS\"" + echo " setting EXTRA_LDFLAGS to \"$EXTRA_LDFLAGS\"" +fi + + + +set X $apr_ste_save_LIBS +if test ${#} -eq 1; then + EXTRA_LIBS="$LIBS" + LIBS= +else + if test "x$apr_ste_save_LIBS" = "x$LIBS"; then + EXTRA_LIBS= + else + EXTRA_LIBS=`echo "$LIBS" | sed -e "s%${apr_ste_save_LIBS}%%"` + LIBS="$apr_ste_save_LIBS" + fi +fi +if test "x$silent" != "xyes"; then + echo " restoring LIBS to \"$LIBS\"" + echo " setting EXTRA_LIBS to \"$EXTRA_LIBS\"" +fi + + + +set X $apr_ste_save_INCLUDES +if test ${#} -eq 1; then + EXTRA_INCLUDES="$INCLUDES" + INCLUDES= +else + if test "x$apr_ste_save_INCLUDES" = "x$INCLUDES"; then + EXTRA_INCLUDES= + else + EXTRA_INCLUDES=`echo "$INCLUDES" | sed -e "s%${apr_ste_save_INCLUDES}%%"` + INCLUDES="$apr_ste_save_INCLUDES" + fi +fi +if test "x$silent" != "xyes"; then + echo " restoring INCLUDES to \"$INCLUDES\"" + echo " setting EXTRA_INCLUDES to \"$EXTRA_INCLUDES\"" +fi + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: " >&5 +printf "%s\n" "$as_me: " >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Construct makefiles and header files..." >&5 +printf "%s\n" "$as_me: Construct makefiles and header files..." >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: " >&5 +printf "%s\n" "$as_me: " >&6;} + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST HTTPD_VERSION" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST HTTPD_MMN" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST abs_srcdir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST bindir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST sbindir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST cgidir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST logfiledir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST exec_prefix" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST datadir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST localstatedir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST mandir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST libdir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST libexecdir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST htdocsdir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST manualdir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST includedir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST errordir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST iconsdir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST sysconfdir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST installbuilddir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST runtimedir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST proxycachedir" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST other_targets" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST progname" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST prefix" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST AWK" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST CC" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST CPP" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST CXX" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST CPPFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST CFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST CXXFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST LTFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST LDFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST LT_LDFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST SH_LDFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST HTTPD_LDFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST UTIL_LDFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST LIBS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST DEFS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST INCLUDES" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST NOTEST_CPPFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST NOTEST_CFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST NOTEST_CXXFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST NOTEST_LDFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST NOTEST_LIBS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST EXTRA_CPPFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST EXTRA_CFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST EXTRA_CXXFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST EXTRA_LDFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST EXTRA_LIBS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST EXTRA_INCLUDES" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST INTERNAL_CPPFLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST LIBTOOL" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST SHELL" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST RSYNC" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST SVN" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST MODULE_DIRS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST MODULE_CLEANDIRS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST PORT" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST SSLPORT" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST CORE_IMPLIB_FILE" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST CORE_IMPLIB" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST SH_LIBS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST SH_LIBTOOL" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST MK_IMPLIB" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST MKDEP" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST INSTALL_PROG_FLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST MPM_MODULES" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST ENABLED_MPM_MODULE" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST DSO_MODULES" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST ENABLED_DSO_MODULES" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST LOAD_ALL_MODULES" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST APR_BINDIR" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST APR_INCLUDEDIR" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST APR_VERSION" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST APR_CONFIG" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST APU_BINDIR" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST APU_INCLUDEDIR" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST APU_VERSION" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST APU_CONFIG" + + + + abs_srcdir="`(cd $srcdir && pwd)`" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating config_vars.mk" >&5 +printf "%s\n" "$as_me: creating config_vars.mk" >&6;} + test -d build || $mkdir_p build + > build/config_vars.mk + for i in $APACHE_VAR_SUBST; do + eval echo "$i = \$$i" >> build/config_vars.mk + done + + +rm -f modules.c +echo $MODLIST | $AWK -f $srcdir/build/build-modules-c.awk > modules.c + + +ap_last= +ap_cur="$prefix" +while test "x${ap_cur}" != "x${ap_last}"; +do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` +done +ap_prefix="${ap_cur}" + + +printf "%s\n" "#define HTTPD_ROOT \"${ap_prefix}\"" >>confdefs.h + + +printf "%s\n" "#define SERVER_CONFIG_FILE \"${rel_sysconfdir}/${progname}.conf\"" >>confdefs.h + + +printf "%s\n" "#define AP_TYPES_CONFIG_FILE \"${rel_sysconfdir}/mime.types\"" >>confdefs.h + + +perlbin=`$ac_aux_dir/PrintPath perl` +if test "x$perlbin" = "x"; then + perlbin="/replace/with/path/to/perl/interpreter" +fi + + + +BSD_MAKEFILE=no +ap_make_include=include +ap_make_delimiter=' ' +case $host in +*bsdi*) + # Check whether they've installed GNU make + if make --version > /dev/null 2>&1; then + true + else + BSD_MAKEFILE=yes + ap_make_include=.include + ap_make_delimiter='"' + fi + ;; +esac + + + +test -d docs/conf||$mkdir_p docs/conf + +ac_config_files="$ac_config_files docs/conf/httpd.conf docs/conf/extra/httpd-autoindex.conf docs/conf/extra/httpd-dav.conf docs/conf/extra/httpd-default.conf docs/conf/extra/httpd-info.conf docs/conf/extra/httpd-languages.conf docs/conf/extra/httpd-manual.conf docs/conf/extra/httpd-mpm.conf docs/conf/extra/httpd-multilang-errordoc.conf docs/conf/extra/httpd-ssl.conf docs/conf/extra/httpd-userdir.conf docs/conf/extra/httpd-vhosts.conf docs/conf/extra/proxy-html.conf include/ap_config_layout.h support/apxs support/apachectl support/dbmmanage support/envvars-std support/log_server_status support/logresolve.pl support/phf_abuse_log.cgi support/split-logfile build/rules.mk build/pkg/pkginfo build/config_vars.sh" + +ac_config_commands="$ac_config_commands default" + +cat >confcache <<\_ACEOF +# 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, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# 'ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* 'ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# 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. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # 'set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # 'set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else case e in #( + e) case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as 'sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else case e in #( + e) as_fn_append () + { + eval $1=\$$1\$2 + } ;; +esac +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else case e in #( + e) as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } ;; +esac +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. + # In both cases, we have to default to 'cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated + +# Sed expression to map a string onto a valid variable name. +as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed '$as_sed_sh'" # deprecated + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by $as_me, which was +generated by GNU Autoconf 2.72. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +'$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config='$ac_cs_config_escaped' +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.72, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2023 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + printf "%s\n" "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + printf "%s\n" "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: '$1' +Try '$0 --help' for more information.";; + --help | --hel | -h ) + printf "%s\n" "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: '$1' +Try '$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + printf "%s\n" "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# + + $SHELL $srcdir/build/fastgen.sh $srcdir $ac_cv_mkdir_p $BSD_MAKEFILE $APACHE_FAST_OUTPUT_FILES + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "include/ap_config_auto.h") CONFIG_HEADERS="$CONFIG_HEADERS include/ap_config_auto.h" ;; + "test/pyhttpd/config.ini") CONFIG_FILES="$CONFIG_FILES test/pyhttpd/config.ini" ;; + "docs/conf/httpd.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/httpd.conf" ;; + "docs/conf/extra/httpd-autoindex.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/extra/httpd-autoindex.conf" ;; + "docs/conf/extra/httpd-dav.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/extra/httpd-dav.conf" ;; + "docs/conf/extra/httpd-default.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/extra/httpd-default.conf" ;; + "docs/conf/extra/httpd-info.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/extra/httpd-info.conf" ;; + "docs/conf/extra/httpd-languages.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/extra/httpd-languages.conf" ;; + "docs/conf/extra/httpd-manual.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/extra/httpd-manual.conf" ;; + "docs/conf/extra/httpd-mpm.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/extra/httpd-mpm.conf" ;; + "docs/conf/extra/httpd-multilang-errordoc.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/extra/httpd-multilang-errordoc.conf" ;; + "docs/conf/extra/httpd-ssl.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/extra/httpd-ssl.conf" ;; + "docs/conf/extra/httpd-userdir.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/extra/httpd-userdir.conf" ;; + "docs/conf/extra/httpd-vhosts.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/extra/httpd-vhosts.conf" ;; + "docs/conf/extra/proxy-html.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/extra/proxy-html.conf" ;; + "include/ap_config_layout.h") CONFIG_FILES="$CONFIG_FILES include/ap_config_layout.h" ;; + "support/apxs") CONFIG_FILES="$CONFIG_FILES support/apxs" ;; + "support/apachectl") CONFIG_FILES="$CONFIG_FILES support/apachectl" ;; + "support/dbmmanage") CONFIG_FILES="$CONFIG_FILES support/dbmmanage" ;; + "support/envvars-std") CONFIG_FILES="$CONFIG_FILES support/envvars-std" ;; + "support/log_server_status") CONFIG_FILES="$CONFIG_FILES support/log_server_status" ;; + "support/logresolve.pl") CONFIG_FILES="$CONFIG_FILES support/logresolve.pl" ;; + "support/phf_abuse_log.cgi") CONFIG_FILES="$CONFIG_FILES support/phf_abuse_log.cgi" ;; + "support/split-logfile") CONFIG_FILES="$CONFIG_FILES support/split-logfile" ;; + "build/rules.mk") CONFIG_FILES="$CONFIG_FILES build/rules.mk" ;; + "build/pkg/pkginfo") CONFIG_FILES="$CONFIG_FILES build/pkg/pkginfo" ;; + "build/config_vars.sh") CONFIG_FILES="$CONFIG_FILES build/config_vars.sh" ;; + "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + + *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers + test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to '$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with './config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with './config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script 'defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #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. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain ':'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is 'configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`printf "%s\n" "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when '$srcdir' = '.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + printf "%s\n" "/* $configure_input */" >&1 \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + printf "%s\n" "/* $configure_input */" >&1 \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi + ;; + + :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "default":C) true ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: summary of build options: + + Server Version: ${HTTPD_VERSION} + Install prefix: ${prefix} + C compiler: ${APACHE_CONF_SEL_CC} + CFLAGS: ${APACHE_CONF_SEL_CFLAGS} + CPPFLAGS: ${APACHE_CONF_SEL_CPPFLAGS} + LDFLAGS: ${APACHE_CONF_SEL_LDFLAGS} + LIBS: ${APACHE_CONF_SEL_LIBS} + C preprocessor: ${APACHE_CONF_SEL_CPP} +" >&5 +printf "%s\n" "$as_me: summary of build options: + + Server Version: ${HTTPD_VERSION} + Install prefix: ${prefix} + C compiler: ${APACHE_CONF_SEL_CC} + CFLAGS: ${APACHE_CONF_SEL_CFLAGS} + CPPFLAGS: ${APACHE_CONF_SEL_CPPFLAGS} + LDFLAGS: ${APACHE_CONF_SEL_LDFLAGS} + LIBS: ${APACHE_CONF_SEL_LIBS} + C preprocessor: ${APACHE_CONF_SEL_CPP} +" >&6;} + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..d2a009d --- /dev/null +++ b/configure.in @@ -0,0 +1,986 @@ +dnl +dnl Autoconf configuration for Apache httpd +dnl +dnl Use ./buildconf to produce a configure script +dnl + +AC_PREREQ(2.50) +AC_INIT(ABOUT_APACHE) + +AC_CONFIG_HEADER(include/ap_config_auto.h) +AC_CONFIG_AUX_DIR(build) + +dnl Absolute source/build directory +abs_srcdir=`(cd $srcdir && pwd)` +abs_builddir=`pwd` + +dnl Ensure that the httpd version is included +HTTPD_VERSION=`$abs_srcdir/build/get-version.sh all $abs_srcdir/include/ap_release.h AP_SERVER` +HTTPD_MMN=`$abs_srcdir/build/get-version.sh mmn $abs_srcdir/include/ap_mmn.h MODULE_MAGIC_NUMBER` + +dnl # +dnl # Include our own M4 macros along with those for APR and libtool +dnl # +sinclude(build/apr_common.m4) +sinclude(build/find_apr.m4) +sinclude(build/find_apu.m4) +sinclude(acinclude.m4) + +dnl Later versions of autoconf (>= 2.62) by default cause the produced +dnl configure script to emit at least warnings when it comes across unknown +dnl command line options. These versions also have the macro +dnl AC_DISABLE_OPTION_CHECKING defined which turns this off by default. +dnl We want to have this turned off here since our configure calls can +dnl contain options for APR / APR-UTIL configure that are unknown to us. +dnl So avoid confusing the user by turning this off. See also PR 45221. +ifdef([AC_DISABLE_OPTION_CHECKING], [AC_DISABLE_OPTION_CHECKING]) + +dnl XXX we can't just use AC_PREFIX_DEFAULT because that isn't subbed in +dnl by configure until it is too late. Is that how it should be or not? +dnl Something seems broken here. +AC_PREFIX_DEFAULT(/usr/local/apache2) + +dnl Get the layout here, so we can pass the required variables to apr +APR_ENABLE_LAYOUT(Apache, [errordir iconsdir htdocsdir cgidir]) + +dnl reparse the configure arguments. +APR_PARSE_ARGUMENTS + +dnl export expanded and relative configure argument variables +APACHE_EXPORT_ARGUMENTS + +dnl Save user-defined environment settings for later restoration +dnl +APR_SAVE_THE_ENVIRONMENT(CPPFLAGS) +APR_SAVE_THE_ENVIRONMENT(CFLAGS) +APR_SAVE_THE_ENVIRONMENT(CXXFLAGS) +APR_SAVE_THE_ENVIRONMENT(LDFLAGS) +APR_SAVE_THE_ENVIRONMENT(LIBS) +APR_SAVE_THE_ENVIRONMENT(INCLUDES) + +dnl Generate ./config.nice for reproducing runs of configure +dnl +APR_CONFIG_NICE(config.nice) + +nl=' +' +dnl Check that mkdir -p works +APR_MKDIR_P_CHECK($top_srcdir/build/mkdir.sh) + +dnl get an EGREP to use in the Makefiles +AC_PROG_EGREP +APACHE_SUBST(EGREP) + +dnl ## Run configure for packages Apache uses + +dnl shared library support for these packages doesn't currently +dnl work on some platforms + +AC_CANONICAL_SYSTEM + +orig_prefix="$prefix" + +AC_MSG_NOTICE([]) +AC_MSG_NOTICE([Configuring Apache Portable Runtime library...]) +AC_MSG_NOTICE([]) + +AC_ARG_WITH(included-apr, +APACHE_HELP_STRING(--with-included-apr,Use bundled copies of APR/APR-Util)) + +if test "x$with_included_apr" = "xyes"; then + apr_found=reconfig + if test ! -d srclib/apr && test ! -d $srcdir/srclib/apr; then + AC_MSG_ERROR([Bundled APR requested but not found at ./srclib/. Download and unpack the corresponding apr and apr-util packages to ./srclib/.]) + fi +else + APR_FIND_APR("$srcdir/srclib/apr", "./srclib/apr", 1, 1 2, [ + version=`$apr_config --version` + case x${version} in + x1.[[0-3]].*) + AC_MSG_WARN([APR version 1.4.0 or later is required, found $version]) + apr_acceptable=no + ;; + esac + unset version + ]) +fi + +if test "$apr_found" = "no"; then + AC_MSG_ERROR([APR not found. Please read the documentation.]) +fi + +if test "$apr_found" = "reconfig"; then + APR_SUBDIR_CONFIG(srclib/apr, + [$apache_apr_flags --prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir --datadir=$datadir --with-installbuilddir=$installbuilddir], + [--enable-layout=*|\'--enable-layout=*]) + dnl We must be the first to build and the last to be cleaned + AP_BUILD_SRCLIB_DIRS="apr $AP_BUILD_SRCLIB_DIRS" + AP_CLEAN_SRCLIB_DIRS="$AP_CLEAN_SRCLIB_DIRS apr" + + dnl We have to find apr-N-config when we reconfigure APR. + for majorver in 1 2; do + test_apr_config="./srclib/apr/apr-${majorver}-config" + if test -f "$test_apr_config"; then + apr_config="$test_apr_config" + fi + done +fi + +APR_SETIFNULL(CC, `$apr_config --cc`) +APR_SETIFNULL(CPP, `$apr_config --cpp`) +APR_ADDTO(CFLAGS, `$apr_config --cflags`) +APR_ADDTO(CPPFLAGS, `$apr_config --cppflags`) +dnl internal-only CPPFLAGS (shouldn't affect third-party module builds) +INTERNAL_CPPFLAGS="" +APR_ADDTO(LDFLAGS, `$apr_config --ldflags`) +SHLIBPATH_VAR=`$apr_config --shlib-path-var` +APR_BINDIR=`$apr_config --bindir` +APR_INCLUDEDIR=`$apr_config --includedir` +APR_INCLUDES=`$apr_config --includes` +APR_VERSION=`$apr_config --version` +apr_major_version=`echo ${APR_VERSION} | sed 's,\..*,,'` +APR_CONFIG="$APR_BINDIR/apr-${apr_major_version}-config" + +AC_MSG_NOTICE([]) +AC_MSG_NOTICE([Configuring Apache Portable Runtime Utility library...]) +AC_MSG_NOTICE([]) + +if test "x${apr_major_version}" = "x2"; then + apu_found=obsolete +elif test "x$with_included_apr" = "xyes"; then + apu_found=reconfig + if test ! -d srclib/apr-util && test ! -d $srcdir/srclib/apr-util; then + AC_MSG_ERROR([Bundled APR-Util requested but not found at ./srclib/. Download and unpack the corresponding apr and apr-util packages to ./srclib/.]) + fi +else + dnl If httpd is buildconf'ed against an apr 2.x tree, then 1.x + dnl isn't supported. + ifdef([APR_FIND_APU], [ + APR_FIND_APU("$srcdir/srclib/apr-util", "./srclib/apr-util", + 1, ${apr_major_version}) + ], [apu_found=no]) +fi + +if test "$apu_found" = "no"; then + AC_MSG_ERROR([APR-util not found. Please read the documentation.]) +fi + +# Catch some misconfigurations: +case ${apr_found}.${apu_found} in +reconfig.yes) + AC_MSG_ERROR([Cannot use an external APR-util with the bundled APR]) + ;; +yes.reconfig) + AC_MSG_ERROR([Cannot use an external APR with the bundled APR-util]) + ;; +esac + +if test "$apu_found" = "reconfig"; then + APR_SUBDIR_CONFIG(srclib/apr-util, + [--with-apr=../apr --prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir], + [--enable-layout=*|\'--enable-layout=*]) + dnl We must be the last to build and the first to be cleaned + AP_BUILD_SRCLIB_DIRS="$AP_BUILD_SRCLIB_DIRS apr-util" + AP_CLEAN_SRCLIB_DIRS="apr-util $AP_CLEAN_SRCLIB_DIRS" + dnl APR and APR-Util major versions must match + apu_config="./srclib/apr-util/apu-${apr_major_version}-config" +fi + +if test "$apu_found" = "obsolete"; then + AC_MSG_NOTICE([APR-util obsoleted, woohoo]) +else + APR_ADDTO(LDFLAGS, `$apu_config --ldflags`) + APU_BINDIR=`$apu_config --bindir` + APU_INCLUDEDIR=`$apu_config --includedir` + APU_INCLUDES=`$apu_config --includes` + APU_VERSION=`$apu_config --version` + APU_CONFIG="$APU_BINDIR/apu-`echo ${APU_VERSION} | sed 's,\..*,,'`-config" +fi + +dnl In case we picked up CC and CPP from APR, get that info into the +dnl config cache so that PCRE uses it. Otherwise, CC and CPP used for +dnl PCRE and for our config tests will be whatever PCRE determines. +AC_PROG_CC +AC_PROG_CPP + +dnl Try to get c99 support for variadic macros +ifdef([AC_PROG_CC_C99], [AC_PROG_CC_C99]) + +if test "x${cache_file}" = "x/dev/null"; then + # Likewise, ensure that CC and CPP are passed through to the pcre + # configure script iff caching is disabled (the autoconf 2.5x default). + export CC; export CPP +fi + +AC_ARG_WITH(pcre, +APACHE_HELP_STRING(--with-pcre=PATH,Use external PCRE library)) +if test "x$with_pcre" = "x" || test "$with_pcre" = "yes"; then + with_pcre="$PATH" +else if which $with_pcre 2>/dev/null; then :; else + with_pcre="$with_pcre/bin:$with_pcre" +fi +fi + +AC_CHECK_TARGET_TOOLS(PCRE_CONFIG, [pcre2-config pcre-config], + [`which $with_pcre 2>/dev/null`], $with_pcre) + +if test "x$PCRE_CONFIG" != "x"; then + if $PCRE_CONFIG --version >/dev/null 2>&1; then :; else + AC_MSG_ERROR([Did not find working script at $PCRE_CONFIG]) + fi + case `$PCRE_CONFIG --version` in + [1[0-9].*]) + AC_DEFINE(HAVE_PCRE2, 1, [Detected PCRE2]) + ;; + [[1-5].*]) + AC_MSG_ERROR([Need at least pcre version 6.0]) + ;; + esac + AC_MSG_NOTICE([Using external PCRE library from $PCRE_CONFIG]) + APR_ADDTO(PCRE_INCLUDES, [`$PCRE_CONFIG --cflags`]) + APR_ADDTO(PCRE_LIBS, [`$PCRE_CONFIG --libs8 2>/dev/null || $PCRE_CONFIG --libs`]) +else + AC_MSG_ERROR([pcre(2)-config for libpcre not found. PCRE is required and available from http://pcre.org/]) +fi +APACHE_SUBST(PCRE_LIBS) + +AC_MSG_NOTICE([]) +AC_MSG_NOTICE([Configuring Apache httpd...]) +AC_MSG_NOTICE([]) + +dnl If the source dir is not equal to the build dir, +dnl then we are running in VPATH mode. + +APR_ADDTO(INCLUDES, [-I.]) + +if test "$abs_builddir" != "$abs_srcdir"; then + APR_ADDTO(INCLUDES, [-I\$(top_builddir)/include]) +fi + +APR_ADDTO(INCLUDES, [-I\$(top_srcdir)/os/\$(OS_DIR) -I\$(top_srcdir)/include]) + +# apr/apr-util --includes may pick up system paths for dependent +# libraries, so ensure these are later in INCLUDES than local source +# directories. +APR_ADDTO(INCLUDES, $APR_INCLUDES) +APR_ADDTO(INCLUDES, $APU_INCLUDES) + +dnl Add in path to PCRE includes +APR_ADDTO(INCLUDES, $PCRE_INCLUDES) + +save_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS $PCRE_INCLUDES" +AC_EGREP_CPP(yes, +[ +#ifdef HAVE_PCRE2 +yes +#else +#include +#ifdef PCRE_DUPNAMES +yes +#endif +#endif +],pcre_have_dupnames=yes,pcre_have_dupnames=no) +if test "$pcre_have_dupnames" != "yes"; then + AC_MSG_ERROR([pcre version does not support PCRE_DUPNAMES]) +fi +CPPFLAGS="$save_CPPFLAGS" + +AC_MSG_NOTICE([]) +AC_MSG_NOTICE([Applying OS-specific hints for httpd...]) +AC_MSG_NOTICE([]) + +case $host in + *os2*) + # Use a custom made libtool replacement + echo "using aplibtool" + LIBTOOL="$abs_srcdir/srclib/apr/build/aplibtool" + SH_LIBTOOL="$LIBTOOL --shared --export-all" + SH_LIBS="\$(ALL_LIBS)" + CORE_IMPLIB_FILE="ApacheCoreOS2.la" + CORE_IMPLIB="$abs_srcdir/server/$CORE_IMPLIB_FILE" + MK_IMPLIB="emximp" + other_targets="$other_targets os2core" + INSTALL_PROG_FLAGS="-e .exe" + SHLTCFLAGS="" + LTCFLAGS="" + ;; + *) + if test "x$LTFLAGS" = "x"; then + LTFLAGS='--silent' + fi + my_libtool=`$apr_config --apr-libtool` + LIBTOOL="$my_libtool \$(LTFLAGS)" + libtoolversion=`$my_libtool --version` + case $libtoolversion in + *1.[[45]]* | *[[2-9]].[[0-9]]*) + SH_LIBTOOL='$(LIBTOOL)' + SHLTCFLAGS="-prefer-pic" + LTCFLAGS="-prefer-non-pic -static" + ;; + *) + SH_LIBTOOL='$(SHELL) $(top_builddir)/shlibtool $(LTFLAGS)' + SHLTCFLAGS="" + LTCFLAGS="" + ;; + esac + ;; +esac +APACHE_SUBST(SHLTCFLAGS) +APACHE_SUBST(LTCFLAGS) + +case $host in + *-apple-aux3*) + APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1]) + ;; + *os2-emx*) + APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1]) + ;; + *-linux-*) + case `uname -r` in + # Unserialized accept() was not recommended until Linux 2.2. + [[01]].* | 2.[[01]]* ) + ;; + * ) + APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1]) + ;; + esac + ;; + *486-*-bsdi* | *-netbsd* | *-freebsd* | *-apple-darwin* | *-dec-osf* | *-qnx) + APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1]) + ;; + *-solaris2*) + dnl This is a hack -- we should be using AC_TRY_RUN instead + ap_platform_runtime_link_flag="-R" + dnl solaris 8 and above don't have a thundering herd + dnl not sure about rev's before this one. + case `uname -r` in + 5.[[567]]*) + ;; + * ) + APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1]) + ;; + esac + ;; + *cygwin*) + APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1]) + ;; + *mingw32*) + APR_ADDTO(INTERNAL_CPPFLAGS, [-DAP_DECLARE_EXPORT]) + APR_SETIFNULL(ac_cv_func_times, [no]) + APR_SETIFNULL(ac_cv_func_getpwnam, [no]) + APR_SETIFNULL(ac_cv_func_getgrnam, [no]) + ;; + *aix*) + aixver=`echo $host | sed 's/^[[^0-9]]*//' | sed 's/\.//g'` + if test $aixver -ge 4320; then + APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1]) + fi + ;; + *os390*) + APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1]) + ;; +esac + +APR_SETVAR(AP_NONBLOCK_WHEN_MULTI_LISTEN, [1]) + +dnl +dnl Process command line arguments. This is done early in the process so the +dnl user can get feedback quickly in case of an error. +dnl +dnl ### need to move some of the arguments "up here" + +dnl ## Check for programs + +AC_PATH_PROG(RM, rm) +AC_PATH_PROG(PKGCONFIG, pkg-config) +AC_PATH_PROG(RSYNC, rsync) +AC_PATH_PROG(SVN, svn) +AC_PROG_AWK +AC_PROG_LN_S +AC_CHECK_TOOL(RANLIB, ranlib, true) +dnl AC_PATH_PROG(PERL_PATH, perl) +AC_CHECK_PROGS(LYNX_PATH,[lynx links elinks], [lynx]) + +# Hard-coded install programs +MKINSTALLDIRS="\$(abs_srcdir)/build/mkdir.sh" +INSTALL="\$(LIBTOOL) --mode=install \$(abs_srcdir)/build/install.sh -c" +APACHE_SUBST(MKINSTALLDIRS) +APACHE_SUBST(INSTALL) + +dnl Various OS checks that apparently set required flags +ifdef([AC_USE_SYSTEM_EXTENSIONS], [ +AC_USE_SYSTEM_EXTENSIONS +], [ +AC_AIX +AC_MINIX +]) + +AC_ISC_POSIX + +# Ensure that satisfactory versions of apr and apr-util are +# found if external copies are configured. +if test "${apr_found}" = "yes"; then + # Require at least APR 1.3.x otherwise fail + APACHE_CHECK_APxVER([apr], 1, 3) +fi + +if test "${apu_found}" = "yes"; then + # Require at least APR-util 1.3.x otherwise fail + if test "${apr_found}" = "yes"; then + # we need to add the APR includes to CPPFLAGS + apu_ckver_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS `$apr_config --includes`" + APACHE_CHECK_APxVER([apu], 1, 3) + CPPFLAGS="$apu_ckver_CPPFLAGS" + else + APACHE_CHECK_APxVER([apu], 1, 3) + fi +fi + +dnl Check for what we can generate dependency files with +APR_CHECK_DEPEND + +dnl ## Check for libraries + +dnl ## Check for header files + +dnl I think these are just used all over the place, so just check for +dnl them at the base of the tree. If some are specific to a single +dnl directory, they should be moved (Comment #Spoon) + +dnl Regarding standard header files: AC_HEADER_STDC doesn't set symbols +dnl HAVE_STRING_H, HAVE_STDLIB_H, etc., so those are checked for +dnl explicitly so that the normal HAVE_xxx_H symbol is defined. + +AC_HEADER_STDC +AC_CHECK_HEADERS( \ +string.h \ +limits.h \ +unistd.h \ +sys/socket.h \ +pwd.h \ +grp.h \ +strings.h \ +sys/prctl.h \ +sys/processor.h \ +sys/sem.h \ +sys/sdt.h \ +sys/loadavg.h +) +AC_HEADER_SYS_WAIT + +dnl ## Check for typedefs, structures, and compiler characteristics. + +AC_C_CONST + +dnl ## Check for library functions +dnl ## sqrt() only needed in support/ab.c +saved_LIBS="$LIBS" +LIBS="" +AC_SEARCH_LIBS(sqrt, m) +MATH_LIBS="$LIBS" +APACHE_SUBST(MATH_LIBS) +LIBS="$saved_LIBS" + +saved_LIBS="$LIBS" +LIBS="" +AC_SEARCH_LIBS(crypt, crypt) +CRYPT_LIBS="$LIBS" +APACHE_SUBST(CRYPT_LIBS) + +if test "$ac_cv_search_crypt" != "no"; then + # Test crypt() with the SHA-512 test vector from https://akkadia.org/drepper/SHA-crypt.txt + AC_CACHE_CHECK([whether crypt() supports SHA-2], [ap_cv_crypt_sha2], [ + AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +#include +#include +#include + +#define PASSWD_0 "Hello world!" +#define SALT_0 "\$6\$saltstring" +#define EXPECT_0 "\$6\$saltstring\$svn8UoSVapNtMuq1ukKS4tPQd8iKwSMHWjl/O817G3uBnIFNjnQJu" \ + "esI68u4OTLiBFdcbYEdFCoEOfaS35inz1" +]], [char *result = crypt(PASSWD_0, SALT_0); + if (!result) return 1; + if (strcmp(result, EXPECT_0)) return 2; +])], [ap_cv_crypt_sha2=yes], [ap_cv_crypt_sha2=no], [ap_cv_crypt_sha2=no])]) + if test "$ap_cv_crypt_sha2" = yes; then + AC_DEFINE([HAVE_CRYPT_SHA2], 1, [Define if crypt() supports SHA-2 hashes]) + fi +fi + +LIBS="$saved_LIBS" + +dnl See Comment #Spoon + +AC_CHECK_FUNCS( \ +getpwnam \ +getgrnam \ +initgroups \ +bindprocessor \ +prctl \ +timegm \ +getpgid \ +fopen64 \ +getloadavg \ +gettid +) + +dnl confirm that a void pointer is large enough to store a long integer +APACHE_CHECK_VOID_PTR_LEN + +if test $ac_cv_func_gettid = no; then + # On Linux before glibc 2.30, gettid() is only usable via syscall() + AC_CACHE_CHECK([for gettid() via syscall], ap_cv_gettid, +[AC_TRY_RUN(#define _GNU_SOURCE +#include +#include +#include +int main(int argc, char **argv) { +pid_t t = syscall(SYS_gettid); return t == -1 ? 1 : 0; }, + [ap_cv_gettid=yes], [ap_cv_gettid=no], [ap_cv_gettid=no])]) + if test "$ap_cv_gettid" = "yes"; then + AC_DEFINE(HAVE_SYS_GETTID, 1, [Define if you have gettid() via syscall()]) + fi +fi + +case ${host}X${ac_cv_func_gettid}X${ap_cv_gettid} in +*linux-*XyesX* | *linux-*XnoXyes) + AC_DEFINE(DEFAULT_LOG_TID, ["g"], [Define as default argument for thread id in error logging]) + ;; +esac + +dnl ## Check for the tm_gmtoff field in struct tm to get the timezone diffs +AC_CACHE_CHECK([for tm_gmtoff in struct tm], ac_cv_struct_tm_gmtoff, +[AC_TRY_COMPILE([#include +#include ], [struct tm tm; tm.tm_gmtoff;], + ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no)]) +if test "$ac_cv_struct_tm_gmtoff" = "yes"; then + AC_DEFINE(HAVE_GMTOFF, 1, [Define if struct tm has a tm_gmtoff field]) +fi + +APACHE_CHECK_SYSTEMD + +dnl ## Set up any appropriate OS-specific environment variables for apachectl + +case $host in + *aix*) + # for 32-bit builds, increase MAXDATA to allow lots of threads + if test x$OBJECT_MODE != x64; then + OS_SPECIFIC_VARS="LDR_CNTRL=\"MAXDATA=0x80000000\" ; export LDR_CNTRL ;" + fi + OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS AIXTHREAD_SCOPE=S ; export AIXTHREAD_SCOPE" + OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; AIXTHREAD_MUTEX_DEBUG=OFF ; export AIXTHREAD_MUTEX_DEBUG" + OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; AIXTHREAD_RWLOCK_DEBUG=OFF ; export AIXTHREAD_RWLOCK_DEBUG" + OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; AIXTHREAD_COND_DEBUG=OFF ; export AIXTHREAD_COND_DEBUG" + OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; SPINLOOPTIME=1000 ; export SPINLOOPTIME" + OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; YIELDLOOPTIME=8 ; export YIELDLOOPTIME" + OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; MALLOCMULTIHEAP=considersize,heaps:8 ; export MALLOCMULTIHEAP" + ;; + *os390*) + OS_SPECIFIC_VARS="export _CEE_RUNOPTS=\"STACK(,,ANY)\" ; export _EDC_ADD_ERRNO2=1" + ;; + *) + OS_SPECIFIC_VARS="" +esac + +AC_ARG_WITH(port,APACHE_HELP_STRING(--with-port=PORT,Port on which to listen (default is 80)), + [if test "$withval" = "yes"; then AC_MSG_ERROR('option --with-port requires a value (the TCP port number)'); else PORT="$withval"; fi], + [PORT=80]) + +AC_ARG_WITH(sslport,APACHE_HELP_STRING(--with-sslport=SSLPORT,Port on which to securelisten (default is 443)), + [if test "$withval" = "yes"; then AC_MSG_ERROR('option --with-sslport requires a value (the SSL TCP port number)'); else SSLPORT="$withval"; fi], + [SSLPORT=443]) + +DTRACE=true +AC_ARG_ENABLE(dtrace,APACHE_HELP_STRING(--enable-dtrace,Enable DTrace probes), +[ + enable_dtrace=$enableval + if test "$enableval" = "yes"; then + APR_ADDTO(CPPFLAGS, -DAPR_DTRACE_PROVIDER) + AC_MSG_ERROR('DTrace Support in the build system is not complete. Patches Welcome!') + fi +], +[ + enable_dtrace=no +]) + +dnl Disabled dtrace build for now. +enable_dtrace=no + +case $host in + *-solaris2*) + if test $enable_dtrace = "yes" -a "$ac_cv_header_sys_sdt_h" = "yes"; then + AC_DEFINE(AP_ENABLE_DTRACE, 1, + [Enable DTrace probes]) + DTRACE="/usr/sbin/dtrace $DTRACEFLAGS" + test -f include/apache_probes.h || $DTRACE -h -s apache_probes.d -o include/apache_probes.h + fi + ;; +esac + +APACHE_SUBST(DTRACE) + +AC_ARG_ENABLE(hook-probes,APACHE_HELP_STRING(--enable-hook-probes,Enable APR hook probes), +[ + if test "$enableval" = "yes"; then + AC_DEFINE(AP_HOOK_PROBES_ENABLED, 1, + [Enable the APR hook probes capability, reading from ap_hook_probes.h]) + APR_ADDTO(INTERNAL_CPPFLAGS, -DAP_HOOK_PROBES_ENABLED) + fi +])dnl + +AC_ARG_ENABLE(exception-hook,APACHE_HELP_STRING(--enable-exception-hook,Enable fatal exception hook), +[ + if test "$enableval" = "yes"; then + AC_DEFINE(AP_ENABLE_EXCEPTION_HOOK, 1, + [Allow modules to run hook after a fatal exception]) + fi +])dnl + +AC_ARG_ENABLE(load-all-modules,APACHE_HELP_STRING(--enable-load-all-modules,Load all modules), +[ + LOAD_ALL_MODULES=$enableval + AC_MSG_NOTICE([Setting "LOAD_ALL_MODULES" to $LOAD_ALL_MODULES]) +], +[ + LOAD_ALL_MODULES="no" +]) + +AC_ARG_ENABLE(maintainer-mode,APACHE_HELP_STRING(--enable-maintainer-mode,Turn on debugging and compile time warnings and load all compiled modules), +[ + if test "$enableval" = "yes"; then + APR_ADDTO(NOTEST_CPPFLAGS, -DAP_DEBUG) + if test "$GCC" = "yes"; then + APACHE_ADD_GCC_CFLAG([-std=c89]) + APACHE_ADD_GCC_CFLAG([-Werror]) + APACHE_ADD_GCC_CFLAG([-Wall]) + APACHE_ADD_GCC_CFLAG([-Wstrict-prototypes]) + APACHE_ADD_GCC_CFLAG([-Wmissing-prototypes]) + APACHE_ADD_GCC_CFLAG([-Wmissing-declarations]) + APACHE_ADD_GCC_CFLAG([-Wdeclaration-after-statement]) + APACHE_ADD_GCC_CFLAG([-Wpointer-arith]) + APACHE_ADD_GCC_CFLAG([-Wformat]) + APACHE_ADD_GCC_CFLAG([-Wformat-security]) + APACHE_ADD_GCC_CFLAG([-Wunused]) + elif test "$AIX_XLC" = "yes"; then + APR_ADDTO(NOTEST_CFLAGS,-qfullpath -qcheck=all -qinfo=pro) + fi + if test "x$enable_load_all_modules" = "x"; then + LOAD_ALL_MODULES=yes + AC_MSG_NOTICE([Maintainer mode setting "LOAD_ALL_MODULES" to $LOAD_ALL_MODULES]) + fi + if test "x$enable_bucketeer" = "x"; then + enable_bucketeer=yes + AC_MSG_NOTICE([Maintainer mode setting "enable_bucketeer" to yes]) + fi + fi +])dnl + +AC_ARG_ENABLE(debugger-mode,APACHE_HELP_STRING(--enable-debugger-mode,Turn on debugging and compile time warnings and turn off optimization), +[ + if test "$enableval" = "yes"; then + APR_ADDTO(NOTEST_CPPFLAGS, -DAP_DEBUG) + if test "$GCC" = "yes"; then + APACHE_ADD_GCC_CFLAG([-O0]) + APACHE_ADD_GCC_CFLAG([-Wall]) + APACHE_ADD_GCC_CFLAG([-Wstrict-prototypes]) + APACHE_ADD_GCC_CFLAG([-Wmissing-prototypes]) + APACHE_ADD_GCC_CFLAG([-Wmissing-declarations]) + APACHE_ADD_GCC_CFLAG([-Wdeclaration-after-statement]) + APACHE_ADD_GCC_CFLAG([-Werror=declaration-after-statement]) + APACHE_ADD_GCC_CFLAG([-Wpointer-arith]) + APACHE_ADD_GCC_CFLAG([-Wformat]) + APACHE_ADD_GCC_CFLAG([-Wformat-security]) + APACHE_ADD_GCC_CFLAG([-Werror=format-security]) + elif test "$AIX_XLC" = "yes"; then + APR_ADDTO(NOTEST_CFLAGS,-qfullpath -qinitauto=FE -qcheck=all -qinfo=pro) + fi + fi +])dnl + +dnl Conditionally enable PIE support for GNU toolchains. +AC_ARG_ENABLE(pie,APACHE_HELP_STRING(--enable-pie,Build httpd as a Position Independent Executable)) +if test "$enable_pie" = "yes"; then + AC_CACHE_CHECK([whether $CC accepts PIE flags], [ap_cv_cc_pie], [ + save_CFLAGS=$CFLAGS + save_LDFLAGS=$LDFLAGS + CFLAGS="$CFLAGS -fPIE" + LDFLAGS="$LDFLAGS -pie" + AC_TRY_RUN([static int foo[30000]; int main () { return 0; }], + [ap_cv_cc_pie=yes], [ap_cv_cc_pie=no], [ap_cv_cc_pie=yes]) + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + ]) + if test "$ap_cv_cc_pie" = "yes"; then + PICFLAGS="-fPIE" + PILDFLAGS="-pie" + else + AC_ERROR([--enable-pie requested but $CC failed using PIE flags]) + fi +fi +APACHE_SUBST(PICFLAGS) +APACHE_SUBST(PILDFLAGS) + +prefix="$orig_prefix" +APACHE_ENABLE_MODULES + +dnl reading config stubs +esyscmd(./build/config-stubs .) + +APACHE_SUBST(progname) +APACHE_SUBST(OS) +APACHE_SUBST(OS_DIR) +APACHE_SUBST(BUILTIN_LIBS) +APACHE_SUBST(SHLIBPATH_VAR) +APACHE_SUBST(OS_SPECIFIC_VARS) + +PRE_SHARED_CMDS='echo ""' +POST_SHARED_CMDS='echo ""' + +dnl apache_need_shared tells us if Apache modules are being built as DSOs + +if test "$apache_need_shared" = "yes"; then + if test -f $ac_aux_dir/ltconfig; then + $SHELL $ac_aux_dir/ltconfig --output=shlibtool --disable-static --srcdir=$ac_aux_dir --cache-file=./config.cache $ac_aux_dir/ltmain.sh + fi + shared_build="shared-build" +fi + +dnl enable_so tells us if *any* modules can be built as DSOs + +if test "$enable_so" = "yes" -o "$enable_so" = "static"; then + case $host in + *-ibm-aix*) + APR_ADDTO(HTTPD_LDFLAGS, [-Wl,-uXML_Parse -Wl,-bE:$abs_builddir/server/httpd.exp]) + APR_ADDTO(SH_LDFLAGS, [\$(EXTRA_LDFLAGS) \$(EXTRA_LIBS)]) + APR_ADDTO(UTIL_LDFLAGS, [-Wl,-uXML_Parse]) + ;; + *os390) + APR_ADDTO(HTTPD_LDFLAGS, [--main=$abs_srcdir/server/main.o --core-dll=$abs_srcdir/apachecore.dll]) + APR_ADDTO(SH_LDFLAGS, [--core-dll=$abs_srcdir/apachecore.dll]) + esac + MOD_SO_ENABLED=yes +fi +AC_SUBST(MOD_SO_ENABLED) + +APACHE_SUBST(PRE_SHARED_CMDS) +APACHE_SUBST(POST_SHARED_CMDS) +APACHE_SUBST(shared_build) + +AC_ARG_WITH(program-name, +APACHE_HELP_STRING(--with-program-name,alternate executable name),[ + progname="$withval" ], [ + progname="httpd"] ) + +# SuExec parameters +AC_ARG_WITH(suexec-bin, +APACHE_HELP_STRING(--with-suexec-bin,Path to suexec binary),[ + AC_DEFINE_UNQUOTED(SUEXEC_BIN, "$withval", [Path to suexec binary] ) +] ) + +AC_ARG_WITH(suexec-caller, +APACHE_HELP_STRING(--with-suexec-caller,User allowed to call SuExec),[ + AC_DEFINE_UNQUOTED(AP_HTTPD_USER, "$withval", [User allowed to call SuExec] ) ] ) + +AC_ARG_WITH(suexec-userdir, +APACHE_HELP_STRING(--with-suexec-userdir,User subdirectory),[ + AC_DEFINE_UNQUOTED(AP_USERDIR_SUFFIX, "$withval", [User subdirectory] ) ] ) + +AC_ARG_WITH(suexec-docroot, +APACHE_HELP_STRING(--with-suexec-docroot,SuExec root directory),[ + AC_DEFINE_UNQUOTED(AP_DOC_ROOT, "$withval", [SuExec root directory] ) ] ) + +AC_ARG_WITH(suexec-uidmin, +APACHE_HELP_STRING(--with-suexec-uidmin,Minimal allowed UID),[ + AC_DEFINE_UNQUOTED(AP_UID_MIN, $withval, [Minimum allowed UID] ) ] ) + +AC_ARG_WITH(suexec-gidmin, +APACHE_HELP_STRING(--with-suexec-gidmin,Minimal allowed GID),[ + AC_DEFINE_UNQUOTED(AP_GID_MIN, $withval, [Minimum allowed GID] ) ] ) + +AC_ARG_WITH(suexec-logfile, +APACHE_HELP_STRING(--with-suexec-logfile,Set the logfile),[ + if test "x$withval" = "xyes"; then + AC_MSG_ERROR([log filename required for --with-suexec-logfile option]) + elif test "x$withval" != "xno"; then + AC_DEFINE_UNQUOTED(AP_LOG_EXEC, "$withval", [SuExec log file]) + fi +]) + +AC_ARG_WITH(suexec-syslog, +APACHE_HELP_STRING(--with-suexec-syslog,Use syslog for suexec logging),[ + if test $withval = "yes"; then + if test "x${with_suexec_logfile}" != "xno"; then + AC_MSG_NOTICE([hint: use "--without-suexec-logfile --with-suexec-syslog"]) + AC_MSG_ERROR([suexec does not support both logging to file and syslog]) + fi + AC_CHECK_FUNCS([vsyslog], [], [ + AC_MSG_ERROR([cannot support syslog from suexec without vsyslog()])]) + AC_DEFINE(AP_LOG_SYSLOG, 1, [SuExec log to syslog]) + fi +]) + + +AC_ARG_WITH(suexec-safepath, +APACHE_HELP_STRING(--with-suexec-safepath,Set the safepath),[ + AC_DEFINE_UNQUOTED(AP_SAFE_PATH, "$withval", [safe shell path for SuExec] ) ] ) + +AC_ARG_WITH(suexec-umask, +APACHE_HELP_STRING(--with-suexec-umask,umask for suexec'd process),[ + AC_DEFINE_UNQUOTED(AP_SUEXEC_UMASK, 0$withval, [umask for suexec'd process] ) ] ) + +INSTALL_SUEXEC=setuid +AC_ARG_ENABLE([suexec-capabilities], +APACHE_HELP_STRING(--enable-suexec-capabilities,Use Linux capability bits not setuid root suexec), [ +INSTALL_SUEXEC=caps +AC_DEFINE(AP_SUEXEC_CAPABILITIES, 1, + [Enable if suexec is installed with Linux capabilities, not setuid]) +]) +APACHE_SUBST(INSTALL_SUEXEC) + +dnl APR should go after the other libs, so the right symbols can be picked up +if test x${apu_found} != xobsolete; then + AP_LIBS="$AP_LIBS `$apu_config --avoid-ldap --link-libtool --libs`" +fi +AP_LIBS="$AP_LIBS `$apr_config --link-libtool --libs`" +APACHE_SUBST(AP_LIBS) +APACHE_SUBST(AP_BUILD_SRCLIB_DIRS) +APACHE_SUBST(AP_CLEAN_SRCLIB_DIRS) + +AC_DEFINE(AP_USING_AUTOCONF, 1, + [Using autoconf to configure Apache]) + +if test "$SINGLE_LISTEN_UNSERIALIZED_ACCEPT" = "1"; then + AC_DEFINE(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, 1, + [This platform doesn't suffer from the thundering herd problem]) +fi + +if test "$AP_NONBLOCK_WHEN_MULTI_LISTEN" = "1"; then + AC_DEFINE(AP_NONBLOCK_WHEN_MULTI_LISTEN, 1, + [Listening sockets are non-blocking when there are more than 1]) +fi + +APR_CHECK_APR_DEFINE(APR_HAVE_IPV6) + +AC_ARG_ENABLE(v4-mapped,APACHE_HELP_STRING(--enable-v4-mapped,Allow IPv6 sockets to handle IPv4 connections), +[ + v4mapped=$enableval +], +[ + case $host in + *freebsd[[1234]].*) + v4mapped=yes + ;; + *freebsd*|*netbsd*|*openbsd*) + v4mapped=no + ;; + *) + v4mapped=yes + ;; + esac + if ap_mpm_is_enabled winnt; then + dnl WinNT MPM doesn't support this. + v4mapped=no + fi +]) + +if test $v4mapped = "yes" -a $ac_cv_define_APR_HAVE_IPV6 = "yes"; then + AC_DEFINE(AP_ENABLE_V4_MAPPED, 1, + [Allow IPv4 connections on IPv6 listening sockets]) +fi + +APACHE_FAST_OUTPUT(Makefile modules/Makefile srclib/Makefile) +APACHE_FAST_OUTPUT(os/Makefile server/Makefile) +APACHE_FAST_OUTPUT(support/Makefile) + +if test -d ./test; then + APACHE_FAST_OUTPUT(test/Makefile) +fi +if test -d ./test/modules/http2; then + APACHE_FAST_OUTPUT(test/Makefile) + AC_CONFIG_FILES([test/pyhttpd/config.ini]) + APACHE_FAST_OUTPUT(test/clients/Makefile) +fi + +dnl ## Finalize the variables +AC_MSG_NOTICE([]) +AC_MSG_NOTICE([Restore user-defined environment settings...]) +AC_MSG_NOTICE([]) + +APACHE_CONF_SEL_CC=${CC} +APACHE_CONF_SEL_CFLAGS="${CFLAGS} ${EXTRA_CFLAGS} ${NOTEST_CFLAGS}" +APACHE_CONF_SEL_CPPFLAGS="${CPPFLAGS} ${EXTRA_CPPFLAGS} ${NOTEST_CPPFLAGS}" +APACHE_CONF_SEL_LDFLAGS="${LDFLAGS} ${EXTRA_LDFLAGS} ${NOTEST_LDFLAGS}" +APACHE_CONF_SEL_LIBS="${LIBS} ${EXTRA_LIBS} ${NOTEST_LIBS}" +APACHE_CONF_SEL_CPP=${CPP} + +APR_RESTORE_THE_ENVIRONMENT(CPPFLAGS, EXTRA_) +APR_RESTORE_THE_ENVIRONMENT(CFLAGS, EXTRA_) +APR_RESTORE_THE_ENVIRONMENT(CXXFLAGS, EXTRA_) +APR_RESTORE_THE_ENVIRONMENT(LDFLAGS, EXTRA_) +APR_RESTORE_THE_ENVIRONMENT(LIBS, EXTRA_) +APR_RESTORE_THE_ENVIRONMENT(INCLUDES, EXTRA_) + +AC_MSG_NOTICE([]) +AC_MSG_NOTICE([Construct makefiles and header files...]) +AC_MSG_NOTICE([]) + +APACHE_GEN_CONFIG_VARS + +dnl ## Build modules.c +rm -f modules.c +echo $MODLIST | $AWK -f $srcdir/build/build-modules-c.awk > modules.c + +APR_EXPAND_VAR(ap_prefix, $prefix) +AC_DEFINE_UNQUOTED(HTTPD_ROOT, "${ap_prefix}", + [Root directory of the Apache install area]) +AC_DEFINE_UNQUOTED(SERVER_CONFIG_FILE, "${rel_sysconfdir}/${progname}.conf", + [Location of the config file, relative to the Apache root directory]) +AC_DEFINE_UNQUOTED(AP_TYPES_CONFIG_FILE, "${rel_sysconfdir}/mime.types", + [Location of the MIME types config file, relative to the Apache root directory]) + +perlbin=`$ac_aux_dir/PrintPath perl` +if test "x$perlbin" = "x"; then + perlbin="/replace/with/path/to/perl/interpreter" +fi +AC_SUBST(perlbin) + +dnl If we are running on BSD/OS, we need to use the BSD .include syntax. + +BSD_MAKEFILE=no +ap_make_include=include +ap_make_delimiter=' ' +case $host in +*bsdi*) + # Check whether they've installed GNU make + if make --version > /dev/null 2>&1; then + true + else + BSD_MAKEFILE=yes + ap_make_include=.include + ap_make_delimiter='"' + fi + ;; +esac +AC_SUBST(ap_make_include) +AC_SUBST(ap_make_delimiter) + +dnl Ensure that docs/conf is created. +test -d docs/conf||$mkdir_p docs/conf + +AC_CONFIG_FILES(docs/conf/httpd.conf docs/conf/extra/httpd-autoindex.conf docs/conf/extra/httpd-dav.conf docs/conf/extra/httpd-default.conf docs/conf/extra/httpd-info.conf docs/conf/extra/httpd-languages.conf docs/conf/extra/httpd-manual.conf docs/conf/extra/httpd-mpm.conf docs/conf/extra/httpd-multilang-errordoc.conf docs/conf/extra/httpd-ssl.conf docs/conf/extra/httpd-userdir.conf docs/conf/extra/httpd-vhosts.conf docs/conf/extra/proxy-html.conf include/ap_config_layout.h support/apxs support/apachectl support/dbmmanage support/envvars-std support/log_server_status support/logresolve.pl support/phf_abuse_log.cgi support/split-logfile build/rules.mk build/pkg/pkginfo build/config_vars.sh) +AC_CONFIG_COMMANDS([default], [true], [APACHE_GEN_MAKEFILES]) +AC_OUTPUT +AC_MSG_NOTICE([summary of build options: + + Server Version: ${HTTPD_VERSION} + Install prefix: ${prefix} + C compiler: ${APACHE_CONF_SEL_CC} + CFLAGS: ${APACHE_CONF_SEL_CFLAGS} + CPPFLAGS: ${APACHE_CONF_SEL_CPPFLAGS} + LDFLAGS: ${APACHE_CONF_SEL_LDFLAGS} + LIBS: ${APACHE_CONF_SEL_LIBS} + C preprocessor: ${APACHE_CONF_SEL_CPP} +]) diff --git a/docs/cgi-examples/printenv b/docs/cgi-examples/printenv new file mode 100644 index 0000000..5b5035e --- /dev/null +++ b/docs/cgi-examples/printenv @@ -0,0 +1,27 @@ +# + +# To permit this cgi, replace # on the first line above with the +# appropriate #!/path/to/perl shebang, and on Unix / Linux also +# set this script executable with chmod 755. +# +# ***** !!! WARNING !!! ***** +# This script echoes the server environment variables and therefore +# leaks information - so NEVER use it in a live server environment! +# It is provided only for testing purpose. +# Also note that it is subject to cross site scripting attacks on +# MS IE and any other browser which fails to honor RFC2616. + +## +## printenv -- demo CGI program which just prints its environment +## +use strict; +use warnings; + +print "Content-type: text/plain; charset=iso-8859-1\n\n"; +foreach my $var (sort(keys(%ENV))) { + my $val = $ENV{$var}; + $val =~ s|\n|\\n|g; + $val =~ s|"|\\"|g; + print "${var}=\"${val}\"\n"; +} + diff --git a/docs/cgi-examples/printenv.vbs b/docs/cgi-examples/printenv.vbs new file mode 100644 index 0000000..9336d43 --- /dev/null +++ b/docs/cgi-examples/printenv.vbs @@ -0,0 +1,32 @@ +' + +' To permit this cgi, replace ' on the first line above with the +' appropriate shebang, f.e. '!c:/windows/system32/cscript -nologo +' +' ***** !!! WARNING !!! ***** +' This script echoes the server environment variables and therefore +' leaks information - so NEVER use it in a live server environment! +' It is provided only for testing purpose. +' Also note that it is subject to cross site scripting attacks on +' MS IE and any other browser which fails to honor RFC2616. + +'' +'' printenv -- demo CGI program which just prints its environment +'' +Option Explicit + +Dim objShell, objArray, str, envvar, envval +Set objShell = CreateObject("WScript.Shell") +Set objArray = CreateObject("System.Collections.ArrayList") + +WScript.StdOut.WriteLine "Content-type: text/plain; charset=iso-8859-1" & vbLF +For Each str In objShell.Environment("PROCESS") + objArray.Add str +Next +objArray.Sort() +For Each str In objArray + envvar = Left(str, InStr(str, "=")) + envval = Replace(Mid(str, InStr(str, "=") + 1), vbLF, "\n") + WScript.StdOut.WriteLine envvar & Chr(34) & envval & Chr(34) +Next + diff --git a/docs/cgi-examples/printenv.wsf b/docs/cgi-examples/printenv.wsf new file mode 100644 index 0000000..d982eac --- /dev/null +++ b/docs/cgi-examples/printenv.wsf @@ -0,0 +1,33 @@ +' + +' To permit this cgi, replace ' on the first line above with the +' appropriate shebang, f.e. '!c:/windows/system32/cscript -nologo +' +' ***** !!! WARNING !!! ***** +' This script echoes the server environment variables and therefore +' leaks information - so NEVER use it in a live server environment! +' It is provided only for testing purpose. +' Also note that it is subject to cross site scripting attacks on +' MS IE and any other browser which fails to honor RFC2616. + +'' +'' printenv -- demo CGI program which just prints its environment +'' + + + + diff --git a/docs/cgi-examples/test-cgi b/docs/cgi-examples/test-cgi new file mode 100644 index 0000000..eb80f3e --- /dev/null +++ b/docs/cgi-examples/test-cgi @@ -0,0 +1,42 @@ +# + +# To permit this cgi, replace # on the first line above with the +# appropriate #!/path/to/sh shebang, and set this script executable +# with chmod 755. +# +# ***** !!! WARNING !!! ***** +# This script echoes the server environment variables and therefore +# leaks information - so NEVER use it in a live server environment! +# It is provided only for testing purpose. +# Also note that it is subject to cross site scripting attacks on +# MS IE and any other browser which fails to honor RFC2616. + +# disable filename globbing +set -f + +echo "Content-type: text/plain; charset=iso-8859-1" +echo + +echo CGI/1.0 test script report: +echo + +echo argc is $#. argv is "$*". +echo + +echo SERVER_SOFTWARE = $SERVER_SOFTWARE +echo SERVER_NAME = $SERVER_NAME +echo GATEWAY_INTERFACE = $GATEWAY_INTERFACE +echo SERVER_PROTOCOL = $SERVER_PROTOCOL +echo SERVER_PORT = $SERVER_PORT +echo REQUEST_METHOD = $REQUEST_METHOD +echo HTTP_ACCEPT = "$HTTP_ACCEPT" +echo PATH_INFO = "$PATH_INFO" +echo PATH_TRANSLATED = "$PATH_TRANSLATED" +echo SCRIPT_NAME = "$SCRIPT_NAME" +echo QUERY_STRING = "$QUERY_STRING" +echo REMOTE_HOST = $REMOTE_HOST +echo REMOTE_ADDR = $REMOTE_ADDR +echo REMOTE_USER = $REMOTE_USER +echo AUTH_TYPE = $AUTH_TYPE +echo CONTENT_TYPE = $CONTENT_TYPE +echo CONTENT_LENGTH = $CONTENT_LENGTH diff --git a/docs/conf/charset.conv b/docs/conf/charset.conv new file mode 100644 index 0000000..bd7ae87 --- /dev/null +++ b/docs/conf/charset.conv @@ -0,0 +1,55 @@ + +# Lang-abbv Charset Language +#--------------------------------- +en ISO-8859-1 English +UTF-8 utf8 UTF-8 +Unicode ucs Unicode +th Cp874 Thai +ja SJIS Japanese +ko Cp949 Korean +zh Cp950 Chinese-Traditional +zh-cn GB2312 Chinese-Simplified +zh-tw Cp950 Chinese +cs ISO-8859-2 Czech +hu ISO-8859-2 Hungarian +hr ISO-8859-2 Croatian +pl ISO-8859-2 Polish +ro ISO-8859-2 Romanian +sr ISO-8859-2 Serbian +sk ISO-8859-2 Slovak +sl ISO-8859-2 Slovenian +sq ISO-8859-2 Albanian +bg ISO-8859-5 Bulgarian +be ISO-8859-5 Byelorussian +mk ISO-8859-5 Macedonian +ru ISO-8859-5 Russian +uk ISO-8859-5 Ukrainian +ca ISO-8859-1 Catalan +de ISO-8859-1 German +da ISO-8859-1 Danish +fi ISO-8859-1 Finnish +fr ISO-8859-1 French +es ISO-8859-1 Spanish +is ISO-8859-1 Icelandic +it ISO-8859-1 Italian +nl ISO-8859-1 Dutch +no ISO-8859-1 Norwegian +pt ISO-8859-1 Portuguese +sv ISO-8859-1 Swedish +af ISO-8859-1 Afrikaans +eu ISO-8859-1 Basque +fo ISO-8859-1 Faroese +gl ISO-8859-1 Galician +ga ISO-8859-1 Irish +gd ISO-8859-1 Scottish +mt ISO-8859-3 Maltese +eo ISO-8859-3 Esperanto +el ISO-8859-7 Greek +tr ISO-8859-9 Turkish +he ISO-8859-8 Hebrew +iw ISO-8859-8 Hebrew +ar ISO-8859-6 Arabic +et ISO-8859-1 Estonian +lv ISO-8859-2 Latvian +lt ISO-8859-2 Lithuanian + diff --git a/docs/conf/extra/httpd-autoindex.conf.in b/docs/conf/extra/httpd-autoindex.conf.in new file mode 100644 index 0000000..51b02ed --- /dev/null +++ b/docs/conf/extra/httpd-autoindex.conf.in @@ -0,0 +1,93 @@ +# +# Directives controlling the display of server-generated directory listings. +# +# Required modules: mod_authz_core, mod_authz_host, +# mod_autoindex, mod_alias +# +# To see the listing of a directory, the Options directive for the +# directory must include "Indexes", and the directory must not contain +# a file matching those listed in the DirectoryIndex directive. +# + +# +# IndexOptions: Controls the appearance of server-generated directory +# listings. +# +IndexOptions FancyIndexing HTMLTable VersionSort + +# We include the /icons/ alias for FancyIndexed directory listings. If +# you do not use FancyIndexing, you may comment this out. +# +Alias /icons/ "@exp_iconsdir@/" + + + Options Indexes MultiViews + AllowOverride None + Require all granted + + +# +# AddIcon* directives tell the server which icon to show for different +# files or filename extensions. These are only displayed for +# FancyIndexed directories. +# +AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip + +AddIconByType (TXT,/icons/text.gif) text/* +AddIconByType (IMG,/icons/image2.gif) image/* +AddIconByType (SND,/icons/sound2.gif) audio/* +AddIconByType (VID,/icons/movie.gif) video/* + +AddIcon /icons/binary.gif .bin .exe +AddIcon /icons/binhex.gif .hqx +AddIcon /icons/tar.gif .tar +AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv +AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip +AddIcon /icons/a.gif .ps .ai .eps +AddIcon /icons/layout.gif .html .shtml .htm .pdf +AddIcon /icons/text.gif .txt +AddIcon /icons/c.gif .c +AddIcon /icons/p.gif .pl .py +AddIcon /icons/f.gif .for +AddIcon /icons/dvi.gif .dvi +AddIcon /icons/uuencoded.gif .uu +AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl +AddIcon /icons/tex.gif .tex +AddIcon /icons/bomb.gif core + +AddIcon /icons/back.gif .. +AddIcon /icons/hand.right.gif README +AddIcon /icons/folder.gif ^^DIRECTORY^^ +AddIcon /icons/blank.gif ^^BLANKICON^^ + +# +# DefaultIcon is which icon to show for files which do not have an icon +# explicitly set. +# +DefaultIcon /icons/unknown.gif + +# +# AddDescription allows you to place a short description after a file in +# server-generated indexes. These are only displayed for FancyIndexed +# directories. +# Format: AddDescription "description" filename +# +#AddDescription "GZIP compressed document" .gz +#AddDescription "tar archive" .tar +#AddDescription "GZIP compressed tar archive" .tgz + +# +# ReadmeName is the name of the README file the server will look for by +# default, and append to directory listings. +# +# HeaderName is the name of a file which should be prepended to +# directory indexes. +ReadmeName README.html +HeaderName HEADER.html + +# +# IndexIgnore is a set of filenames which directory indexing should ignore +# and not include in the listing. Shell-style wildcarding is permitted. +# +IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t + diff --git a/docs/conf/extra/httpd-dav.conf.in b/docs/conf/extra/httpd-dav.conf.in new file mode 100644 index 0000000..2bf5545 --- /dev/null +++ b/docs/conf/extra/httpd-dav.conf.in @@ -0,0 +1,53 @@ +# +# Distributed authoring and versioning (WebDAV) +# +# Required modules: mod_alias, mod_auth_digest, mod_authn_core, mod_authn_file, +# mod_authz_core, mod_authz_user, mod_dav, mod_dav_fs, +# mod_setenvif + +# The following example gives DAV write access to a directory called +# "uploads" under the ServerRoot directory. +# +# The User/Group specified in httpd.conf needs to have write permissions +# on the directory where the DavLockDB is placed and on any directory where +# "Dav On" is specified. + +DavLockDB "@@ServerRoot@@/var/DavLock" + +Alias /uploads "@@ServerRoot@@/uploads" + + + Dav On + + AuthType Digest + AuthName DAV-upload + # You can use the htdigest program to create the password database: + # htdigest -c "@@ServerRoot@@/user.passwd" DAV-upload admin + AuthUserFile "@@ServerRoot@@/user.passwd" + AuthDigestProvider file + + # Allow universal read-access, but writes are restricted + # to the admin user. + + Require method GET POST OPTIONS + Require user admin + + + +# +# The following directives disable redirects on non-GET requests for +# a directory that does not include the trailing slash. This fixes a +# problem with several clients that do not appropriately handle +# redirects for folders with DAV methods. +# +BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully +BrowserMatch "MS FrontPage" redirect-carefully +BrowserMatch "^WebDrive" redirect-carefully +BrowserMatch "^WebDAVFS/1\.[012]" redirect-carefully +BrowserMatch "^gnome-vfs/1\.0" redirect-carefully +BrowserMatch "^gvfs/1" redirect-carefully +BrowserMatch "^XML Spy" redirect-carefully +BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully +BrowserMatch " Konqueror/4" redirect-carefully +BrowserMatch " Konqueror/5" redirect-carefully +BrowserMatch " dolphin/" redirect-carefully diff --git a/docs/conf/extra/httpd-default.conf.in b/docs/conf/extra/httpd-default.conf.in new file mode 100644 index 0000000..7196922 --- /dev/null +++ b/docs/conf/extra/httpd-default.conf.in @@ -0,0 +1,90 @@ +# +# This configuration file reflects default settings for Apache HTTP Server. +# +# You may change these, but chances are that you may not need to. +# + +# +# Timeout: The number of seconds before receives and sends time out. +# +Timeout 60 + +# +# KeepAlive: Whether or not to allow persistent connections (more than +# one request per connection). Set to "Off" to deactivate. +# +KeepAlive On + +# +# MaxKeepAliveRequests: The maximum number of requests to allow +# during a persistent connection. Set to 0 to allow an unlimited amount. +# We recommend you leave this number high, for maximum performance. +# +MaxKeepAliveRequests 100 + +# +# KeepAliveTimeout: Number of seconds to wait for the next request from the +# same client on the same connection. +# +KeepAliveTimeout 5 + +# +# UseCanonicalName: Determines how Apache constructs self-referencing +# URLs and the SERVER_NAME and SERVER_PORT variables. +# When set "Off", Apache will use the Hostname and Port supplied +# by the client. When set "On", Apache will use the value of the +# ServerName directive. +# +UseCanonicalName Off + +# +# AccessFileName: The name of the file to look for in each directory +# for additional configuration directives. See also the AllowOverride +# directive. +# +AccessFileName .htaccess + +# +# ServerTokens +# This directive configures what you return as the Server HTTP response +# Header. The default is 'Full' which sends information about the OS-Type +# and compiled in modules. +# Set to one of: Full | OS | Minor | Minimal | Major | Prod +# where Full conveys the most information, and Prod the least. +# +ServerTokens Full + +# +# Optionally add a line containing the server version and virtual host +# name to server-generated pages (internal error documents, FTP directory +# listings, mod_status and mod_info output etc., but not CGI generated +# documents or custom error documents). +# Set to "EMail" to also include a mailto: link to the ServerAdmin. +# Set to one of: On | Off | EMail +# +ServerSignature Off + +# +# HostnameLookups: Log the names of clients or just their IP addresses +# e.g., www.apache.org (on) or 204.62.129.132 (off). +# The default is off because it'd be overall better for the net if people +# had to knowingly turn this feature on, since enabling it means that +# each client request will result in AT LEAST one lookup request to the +# nameserver. +# +HostnameLookups Off + +# +# Set a timeout for how long the client may take to send the request header +# and body. +# The default for the headers is header=20-40,MinRate=500, which means wait +# for the first byte of headers for 20 seconds. If some data arrives, +# increase the timeout corresponding to a data rate of 500 bytes/s, but not +# above 40 seconds. +# The default for the request body is body=20,MinRate=500, which is the same +# but has no upper limit for the timeout. +# To disable, set to header=0 body=0 +# + + RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500 + diff --git a/docs/conf/extra/httpd-info.conf.in b/docs/conf/extra/httpd-info.conf.in new file mode 100644 index 0000000..5cfdf69 --- /dev/null +++ b/docs/conf/extra/httpd-info.conf.in @@ -0,0 +1,36 @@ +# +# Get information about the requests being processed by the server +# and the configuration of the server. +# +# Required modules: mod_authz_core, mod_authz_host, +# mod_info (for the server-info handler), +# mod_status (for the server-status handler) + +# +# Allow server status reports generated by mod_status, +# with the URL of http://servername/server-status +# Change the ".example.com" to match your domain to enable. + + + SetHandler server-status + Require host .example.com + Require ip 127 + + +# +# ExtendedStatus controls whether Apache will generate "full" status +# information (ExtendedStatus On) or just basic information (ExtendedStatus +# Off) when the "server-status" handler is called. The default is Off. +# +#ExtendedStatus On + +# +# Allow remote server configuration reports, with the URL of +# http://servername/server-info (requires that mod_info.c be loaded). +# Change the ".example.com" to match your domain to enable. +# + + SetHandler server-info + Require host .example.com + Require ip 127 + diff --git a/docs/conf/extra/httpd-languages.conf.in b/docs/conf/extra/httpd-languages.conf.in new file mode 100644 index 0000000..7f66461 --- /dev/null +++ b/docs/conf/extra/httpd-languages.conf.in @@ -0,0 +1,141 @@ +# +# Settings for hosting different languages. +# +# Required modules: mod_mime, mod_negotiation + +# DefaultLanguage and AddLanguage allows you to specify the language of +# a document. You can then use content negotiation to give a browser a +# file in a language the user can understand. +# +# Specify a default language. This means that all data +# going out without a specific language tag (see below) will +# be marked with this one. You probably do NOT want to set +# this unless you are sure it is correct for all cases. +# +# * It is generally better to not mark a page as +# * being a certain language than marking it with the wrong +# * language! +# +# DefaultLanguage nl +# +# Note 1: The suffix does not have to be the same as the language +# keyword --- those with documents in Polish (whose net-standard +# language code is pl) may wish to use "AddLanguage pl .po" to +# avoid the ambiguity with the common suffix for perl scripts. +# +# Note 2: The example entries below illustrate that in some cases +# the two character 'Language' abbreviation is not identical to +# the two character 'Country' code for its country, +# E.g. 'Danmark/dk' versus 'Danish/da'. +# +# Note 3: In the case of 'ltz' we violate the RFC by using a three char +# specifier. There is 'work in progress' to fix this and get +# the reference data for rfc1766 cleaned up. +# +# Catalan (ca) - Croatian (hr) - Czech (cs) - Danish (da) - Dutch (nl) +# English (en) - Esperanto (eo) - Estonian (et) - French (fr) - German (de) +# Greek-Modern (el) - Hebrew (he) - Italian (it) - Japanese (ja) +# Korean (ko) - Luxembourgeois* (ltz) - Norwegian Nynorsk (nn) +# Norwegian (no) - Polish (pl) - Portugese (pt) +# Brazilian Portuguese (pt-BR) - Russian (ru) - Swedish (sv) +# Turkish (tr) - Simplified Chinese (zh-CN) - Spanish (es) +# Traditional Chinese (zh-TW) +# +AddLanguage ca .ca +AddLanguage cs .cz .cs +AddLanguage da .dk +AddLanguage de .de +AddLanguage el .el +AddLanguage en .en +AddLanguage eo .eo +AddLanguage es .es +AddLanguage et .et +AddLanguage fr .fr +AddLanguage he .he +AddLanguage hr .hr +AddLanguage it .it +AddLanguage ja .ja +AddLanguage ko .ko +AddLanguage ltz .ltz +AddLanguage nl .nl +AddLanguage nn .nn +AddLanguage no .no +AddLanguage pl .po +AddLanguage pt .pt +AddLanguage pt-BR .pt-br +AddLanguage ru .ru +AddLanguage sv .sv +AddLanguage tr .tr +AddLanguage zh-CN .zh-cn +AddLanguage zh-TW .zh-tw + +# LanguagePriority allows you to give precedence to some languages +# in case of a tie during content negotiation. +# +# Just list the languages in decreasing order of preference. We have +# more or less alphabetized them here. You probably want to change this. +# +LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv tr zh-CN zh-TW + +# +# ForceLanguagePriority allows you to serve a result page rather than +# MULTIPLE CHOICES (Prefer) [in case of a tie] or NOT ACCEPTABLE (Fallback) +# [in case no accepted languages matched the available variants] +# +ForceLanguagePriority Prefer Fallback + +# +# Commonly used filename extensions to character sets. You probably +# want to avoid clashes with the language extensions, unless you +# are good at carefully testing your setup after each change. +# See http://www.iana.org/assignments/character-sets for the +# official list of charset names and their respective RFCs. +# +AddCharset us-ascii.ascii .us-ascii +AddCharset ISO-8859-1 .iso8859-1 .latin1 +AddCharset ISO-8859-2 .iso8859-2 .latin2 .cen +AddCharset ISO-8859-3 .iso8859-3 .latin3 +AddCharset ISO-8859-4 .iso8859-4 .latin4 +AddCharset ISO-8859-5 .iso8859-5 .cyr .iso-ru +AddCharset ISO-8859-6 .iso8859-6 .arb .arabic +AddCharset ISO-8859-7 .iso8859-7 .grk .greek +AddCharset ISO-8859-8 .iso8859-8 .heb .hebrew +AddCharset ISO-8859-9 .iso8859-9 .latin5 .trk +AddCharset ISO-8859-10 .iso8859-10 .latin6 +AddCharset ISO-8859-13 .iso8859-13 +AddCharset ISO-8859-14 .iso8859-14 .latin8 +AddCharset ISO-8859-15 .iso8859-15 .latin9 +AddCharset ISO-8859-16 .iso8859-16 .latin10 +AddCharset ISO-2022-JP .iso2022-jp .jis +AddCharset ISO-2022-KR .iso2022-kr .kis +AddCharset ISO-2022-CN .iso2022-cn .cis +AddCharset Big5.Big5 .big5 .b5 +AddCharset cn-Big5 .cn-big5 +# For russian, more than one charset is used (depends on client, mostly): +AddCharset WINDOWS-1251 .cp-1251 .win-1251 +AddCharset CP866 .cp866 +AddCharset KOI8 .koi8 +AddCharset KOI8-E .koi8-e +AddCharset KOI8-r .koi8-r .koi8-ru +AddCharset KOI8-U .koi8-u +AddCharset KOI8-ru .koi8-uk .ua +AddCharset ISO-10646-UCS-2 .ucs2 +AddCharset ISO-10646-UCS-4 .ucs4 +AddCharset UTF-7 .utf7 +AddCharset UTF-8 .utf8 +AddCharset UTF-16 .utf16 +AddCharset UTF-16BE .utf16be +AddCharset UTF-16LE .utf16le +AddCharset UTF-32 .utf32 +AddCharset UTF-32BE .utf32be +AddCharset UTF-32LE .utf32le +AddCharset euc-cn .euc-cn +AddCharset euc-gb .euc-gb +AddCharset euc-jp .euc-jp +AddCharset euc-kr .euc-kr +#Not sure how euc-tw got in - IANA doesn't list it??? +AddCharset EUC-TW .euc-tw +AddCharset gb2312 .gb2312 .gb +AddCharset iso-10646-ucs-2 .ucs-2 .iso-10646-ucs-2 +AddCharset iso-10646-ucs-4 .ucs-4 .iso-10646-ucs-4 +AddCharset shift_jis .shift_jis .sjis diff --git a/docs/conf/extra/httpd-manual.conf.in b/docs/conf/extra/httpd-manual.conf.in new file mode 100644 index 0000000..e8222a9 --- /dev/null +++ b/docs/conf/extra/httpd-manual.conf.in @@ -0,0 +1,38 @@ +# +# Provide access to the documentation on your server as +# http://yourserver.example.com/manual/ +# The documentation is always available at +# http://httpd.apache.org/docs/2.4/ +# +# Required modules: mod_alias, mod_authz_core, mod_authz_host, +# mod_setenvif, mod_negotiation +# + +AliasMatch ^/manual(?:/(?:da|de|en|es|fr|ja|ko|pt-br|ru|tr|zh-cn))?(/.*)?$ "@exp_manualdir@$1" + + + Options Indexes + AllowOverride None + Require all granted + + + SetHandler type-map + + + # .tr is text/troff in mime.types! + RemoveType tr + + # Traditionally, used .dk filename extension for da language + AddLanguage da .da + + SetEnvIf Request_URI ^/manual/(da|de|en|es|fr|ja|ko|pt-br|ru|tr|zh-cn)/ prefer-language=$1 + RedirectMatch 301 ^/manual(?:/(da|de|en|es|fr|ja|ko|pt-br|ru|tr|zh-cn)){2,}(/.*)?$ /manual/$1$2 + + # Reflect the greatest effort in translation (most content available), + # inferring greater attention to detail (potentially false assumption, + # counting translations presently in-sync would be more helpful.) + # Use caution counting; safest pattern is '*.xml.XX'. Recent .xml source + # document count: 266 214 110 94 82 25 22 18 4 1 1 + LanguagePriority en fr ko ja tr es de zh-cn pt-br da ru + ForceLanguagePriority Prefer Fallback + diff --git a/docs/conf/extra/httpd-mpm.conf.in b/docs/conf/extra/httpd-mpm.conf.in new file mode 100644 index 0000000..bf29faf --- /dev/null +++ b/docs/conf/extra/httpd-mpm.conf.in @@ -0,0 +1,119 @@ +# +# Server-Pool Management (MPM specific) +# + +# +# PidFile: The file in which the server should record its process +# identification number when it starts. +# +# Note that this is the default PidFile for most MPMs. +# + + PidFile "@rel_runtimedir@/httpd.pid" + + +# +# Only one of the below sections will be relevant on your +# installed httpd. Use "apachectl -l" to find out the +# active mpm. +# + +# prefork MPM +# StartServers: number of server processes to start +# MinSpareServers: minimum number of server processes which are kept spare +# MaxSpareServers: maximum number of server processes which are kept spare +# MaxRequestWorkers: maximum number of server processes allowed to start +# MaxConnectionsPerChild: maximum number of connections a server process serves +# before terminating + + StartServers 5 + MinSpareServers 5 + MaxSpareServers 10 + MaxRequestWorkers 250 + MaxConnectionsPerChild 0 + + +# worker MPM +# StartServers: initial number of server processes to start +# MinSpareThreads: minimum number of worker threads which are kept spare +# MaxSpareThreads: maximum number of worker threads which are kept spare +# ThreadsPerChild: constant number of worker threads in each server process +# MaxRequestWorkers: maximum number of worker threads +# MaxConnectionsPerChild: maximum number of connections a server process serves +# before terminating + + StartServers 3 + MinSpareThreads 75 + MaxSpareThreads 250 + ThreadsPerChild 25 + MaxRequestWorkers 400 + MaxConnectionsPerChild 0 + + +# event MPM +# StartServers: initial number of server processes to start +# MinSpareThreads: minimum number of worker threads which are kept spare +# MaxSpareThreads: maximum number of worker threads which are kept spare +# ThreadsPerChild: constant number of worker threads in each server process +# MaxRequestWorkers: maximum number of worker threads +# MaxConnectionsPerChild: maximum number of connections a server process serves +# before terminating + + StartServers 3 + MinSpareThreads 75 + MaxSpareThreads 250 + ThreadsPerChild 25 + MaxRequestWorkers 400 + MaxConnectionsPerChild 0 + + +# NetWare MPM +# ThreadStackSize: Stack size allocated for each worker thread +# StartThreads: Number of worker threads launched at server startup +# MinSpareThreads: Minimum number of idle threads, to handle request spikes +# MaxSpareThreads: Maximum number of idle threads +# MaxThreads: Maximum number of worker threads alive at the same time +# MaxConnectionsPerChild: Maximum number of connections a thread serves. It +# is recommended that the default value of 0 be set +# for this directive on NetWare. This will allow the +# thread to continue to service requests indefinitely. + + ThreadStackSize 65536 + StartThreads 250 + MinSpareThreads 25 + MaxSpareThreads 250 + MaxThreads 1000 + MaxConnectionsPerChild 0 + + +# OS/2 MPM +# StartServers: Number of server processes to maintain +# MinSpareThreads: Minimum number of idle threads per process, +# to handle request spikes +# MaxSpareThreads: Maximum number of idle threads per process +# MaxConnectionsPerChild: Maximum number of connections per server process + + StartServers 2 + MinSpareThreads 5 + MaxSpareThreads 10 + MaxConnectionsPerChild 0 + + +# WinNT MPM +# ThreadsPerChild: constant number of worker threads in the server process +# MaxConnectionsPerChild: maximum number of connections a server process serves + + ThreadsPerChild 150 + MaxConnectionsPerChild 0 + + +# The maximum number of free Kbytes that every allocator is allowed +# to hold without calling free(). In threaded MPMs, every thread has its own +# allocator. When not set, or when set to zero, the threshold will be set to +# unlimited. + + MaxMemFree 2048 + + + MaxMemFree 100 + diff --git a/docs/conf/extra/httpd-multilang-errordoc.conf.in b/docs/conf/extra/httpd-multilang-errordoc.conf.in new file mode 100644 index 0000000..3da3bf2 --- /dev/null +++ b/docs/conf/extra/httpd-multilang-errordoc.conf.in @@ -0,0 +1,52 @@ +# +# The configuration below implements multi-language error documents through +# content-negotiation. +# +# Required modules: mod_alias, mod_authz_core, mod_authz_host, +# mod_include, mod_negotiation +# +# We use Alias to redirect any /error/HTTP_.html.var response to +# our collection of by-error message multi-language collections. We use +# includes to substitute the appropriate text. +# +# You can modify the messages' appearance without changing any of the +# default HTTP_.html.var files by adding the line: +# +# Alias /error/include/ "/your/include/path/" +# +# which allows you to create your own set of files by starting with the +# @exp_errordir@/include/ files and copying them to /your/include/path/, +# even on a per-VirtualHost basis. The default include files will display +# your Apache version number and your ServerAdmin email address regardless +# of the setting of ServerSignature. + +Alias /error/ "@exp_errordir@/" + + + AllowOverride None + Options IncludesNoExec + AddOutputFilter Includes html + AddHandler type-map var + Require all granted + LanguagePriority en cs de es fr it ja ko nl pl pt-br ro sv tr + ForceLanguagePriority Prefer Fallback + + +ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var +ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var +ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var +ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var +ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var +ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var +ErrorDocument 410 /error/HTTP_GONE.html.var +ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var +ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var +ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var +ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var +ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var +ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var +ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var +ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var +ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var +ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var + diff --git a/docs/conf/extra/httpd-ssl.conf.in b/docs/conf/extra/httpd-ssl.conf.in new file mode 100644 index 0000000..6a3c67a --- /dev/null +++ b/docs/conf/extra/httpd-ssl.conf.in @@ -0,0 +1,290 @@ +# +# This is the Apache server configuration file providing SSL support. +# It contains the configuration directives to instruct the server how to +# serve pages over an https connection. For detailed information about these +# directives see +# +# Do NOT simply read the instructions in here without understanding +# what they do. They're here only as hints or reminders. If you are unsure +# consult the online docs. You have been warned. +# +# Required modules: mod_log_config, mod_setenvif, mod_ssl, +# socache_shmcb_module (for default value of SSLSessionCache) + +# +# Pseudo Random Number Generator (PRNG): +# Configure one or more sources to seed the PRNG of the SSL library. +# The seed data should be of good random quality. +# WARNING! On some platforms /dev/random blocks if not enough entropy +# is available. This means you then cannot use the /dev/random device +# because it would lead to very long connection times (as long as +# it requires to make more entropy available). But usually those +# platforms additionally provide a /dev/urandom device which doesn't +# block. So, if available, use this one instead. Read the mod_ssl User +# Manual for more details. +# +#SSLRandomSeed startup file:/dev/random 512 +#SSLRandomSeed startup file:/dev/urandom 512 +#SSLRandomSeed connect file:/dev/random 512 +#SSLRandomSeed connect file:/dev/urandom 512 + + +# +# When we also provide SSL we have to listen to the +# standard HTTP port (see above) and to the HTTPS port +# +Listen @@SSLPort@@ + +## +## SSL Global Context +## +## All SSL configuration in this context applies both to +## the main server and all SSL-enabled virtual hosts. +## + +# SSL Cipher Suite: +# List the ciphers that the client is permitted to negotiate, +# and that httpd will negotiate as the client of a proxied server. +# See the OpenSSL documentation for a complete list of ciphers, and +# ensure these follow appropriate best practices for this deployment. +# httpd 2.2.30, 2.4.13 and later force-disable aNULL, eNULL and EXP ciphers, +# while OpenSSL disabled these by default in 0.9.8zf/1.0.0r/1.0.1m/1.0.2a. +SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES +SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES + +# By the end of 2016, only TLSv1.2 ciphers should remain in use. +# Older ciphers should be disallowed as soon as possible, while the +# kRSA ciphers do not offer forward secrecy. These changes inhibit +# older clients (such as IE6 SP2 or IE8 on Windows XP, or other legacy +# non-browser tooling) from successfully connecting. +# +# To restrict mod_ssl to use only TLSv1.2 ciphers, and disable +# those protocols which do not support forward secrecy, replace +# the SSLCipherSuite and SSLProxyCipherSuite directives above with +# the following two directives, as soon as practical. +# SSLCipherSuite HIGH:MEDIUM:!SSLv3:!kRSA +# SSLProxyCipherSuite HIGH:MEDIUM:!SSLv3:!kRSA + +# User agents such as web browsers are not configured for the user's +# own preference of either security or performance, therefore this +# must be the prerogative of the web server administrator who manages +# cpu load versus confidentiality, so enforce the server's cipher order. +SSLHonorCipherOrder on + +# SSL Protocol support: +# List the protocol versions which clients are allowed to connect with. +# Disable SSLv3 by default (cf. RFC 7525 3.1.1). TLSv1 (1.0) should be +# disabled as quickly as practical. By the end of 2016, only the TLSv1.2 +# protocol or later should remain in use. +SSLProtocol all -SSLv3 +SSLProxyProtocol all -SSLv3 + +# Pass Phrase Dialog: +# Configure the pass phrase gathering process. +# The filtering dialog program (`builtin' is an internal +# terminal dialog) has to provide the pass phrase on stdout. +SSLPassPhraseDialog builtin + +# Inter-Process Session Cache: +# Configure the SSL Session Cache: First the mechanism +# to use and second the expiring timeout (in seconds). +#SSLSessionCache "dbm:@exp_runtimedir@/ssl_scache" +SSLSessionCache "shmcb:@exp_runtimedir@/ssl_scache(512000)" +SSLSessionCacheTimeout 300 + +# OCSP Stapling (requires OpenSSL 0.9.8h or later) +# +# This feature is disabled by default and requires at least +# the two directives SSLUseStapling and SSLStaplingCache. +# Refer to the documentation on OCSP Stapling in the SSL/TLS +# How-To for more information. +# +# Enable stapling for all SSL-enabled servers: +#SSLUseStapling On + +# Define a relatively small cache for OCSP Stapling using +# the same mechanism that is used for the SSL session cache +# above. If stapling is used with more than a few certificates, +# the size may need to be increased. (AH01929 will be logged.) +#SSLStaplingCache "shmcb:@exp_runtimedir@/ssl_stapling(32768)" + +# Seconds before valid OCSP responses are expired from the cache +#SSLStaplingStandardCacheTimeout 3600 + +# Seconds before invalid OCSP responses are expired from the cache +#SSLStaplingErrorCacheTimeout 600 + +## +## SSL Virtual Host Context +## + + + +# General setup for the virtual host +DocumentRoot "@exp_htdocsdir@" +ServerName www.example.com:@@SSLPort@@ +ServerAdmin you@example.com +ErrorLog "@exp_logfiledir@/error_log" +TransferLog "@exp_logfiledir@/access_log" + +# SSL Engine Switch: +# Enable/Disable SSL for this virtual host. +SSLEngine on + +# Server Certificate: +# Point SSLCertificateFile at a PEM encoded certificate. If +# the certificate is encrypted, then you will be prompted for a +# pass phrase. Note that a kill -HUP will prompt again. Keep +# in mind that if you have both an RSA and a DSA certificate you +# can configure both in parallel (to also allow the use of DSA +# ciphers, etc.) +# Some ECC cipher suites (http://www.ietf.org/rfc/rfc4492.txt) +# require an ECC certificate which can also be configured in +# parallel. +SSLCertificateFile "@exp_sysconfdir@/server.crt" +#SSLCertificateFile "@exp_sysconfdir@/server-dsa.crt" +#SSLCertificateFile "@exp_sysconfdir@/server-ecc.crt" + +# Server Private Key: +# If the key is not combined with the certificate, use this +# directive to point at the key file. Keep in mind that if +# you've both a RSA and a DSA private key you can configure +# both in parallel (to also allow the use of DSA ciphers, etc.) +# ECC keys, when in use, can also be configured in parallel +SSLCertificateKeyFile "@exp_sysconfdir@/server.key" +#SSLCertificateKeyFile "@exp_sysconfdir@/server-dsa.key" +#SSLCertificateKeyFile "@exp_sysconfdir@/server-ecc.key" + +# Server Certificate Chain: +# Point SSLCertificateChainFile at a file containing the +# concatenation of PEM encoded CA certificates which form the +# certificate chain for the server certificate. Alternatively +# the referenced file can be the same as SSLCertificateFile +# when the CA certificates are directly appended to the server +# certificate for convenience. +#SSLCertificateChainFile "@exp_sysconfdir@/server-ca.crt" + +# Certificate Authority (CA): +# Set the CA certificate verification path where to find CA +# certificates for client authentication or alternatively one +# huge file containing all of them (file must be PEM encoded) +# Note: Inside SSLCACertificatePath you need hash symlinks +# to point to the certificate files. Use the provided +# Makefile to update the hash symlinks after changes. +#SSLCACertificatePath "@exp_sysconfdir@/ssl.crt" +#SSLCACertificateFile "@exp_sysconfdir@/ssl.crt/ca-bundle.crt" + +# Certificate Revocation Lists (CRL): +# Set the CA revocation path where to find CA CRLs for client +# authentication or alternatively one huge file containing all +# of them (file must be PEM encoded). +# The CRL checking mode needs to be configured explicitly +# through SSLCARevocationCheck (defaults to "none" otherwise). +# Note: Inside SSLCARevocationPath you need hash symlinks +# to point to the certificate files. Use the provided +# Makefile to update the hash symlinks after changes. +#SSLCARevocationPath "@exp_sysconfdir@/ssl.crl" +#SSLCARevocationFile "@exp_sysconfdir@/ssl.crl/ca-bundle.crl" +#SSLCARevocationCheck chain + +# Client Authentication (Type): +# Client certificate verification type and depth. Types are +# none, optional, require and optional_no_ca. Depth is a +# number which specifies how deeply to verify the certificate +# issuer chain before deciding the certificate is not valid. +#SSLVerifyClient require +#SSLVerifyDepth 10 + +# TLS-SRP mutual authentication: +# Enable TLS-SRP and set the path to the OpenSSL SRP verifier +# file (containing login information for SRP user accounts). +# Requires OpenSSL 1.0.1 or newer. See the mod_ssl FAQ for +# detailed instructions on creating this file. Example: +# "openssl srp -srpvfile @exp_sysconfdir@/passwd.srpv -add username" +#SSLSRPVerifierFile "@exp_sysconfdir@/passwd.srpv" + +# Access Control: +# With SSLRequire you can do per-directory access control based +# on arbitrary complex boolean expressions containing server +# variable checks and other lookup directives. The syntax is a +# mixture between C and Perl. See the mod_ssl documentation +# for more details. +# +#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \ +# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \ +# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \ +# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \ +# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \ +# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/ +# + +# SSL Engine Options: +# Set various options for the SSL engine. +# o FakeBasicAuth: +# Translate the client X.509 into a Basic Authorisation. This means that +# the standard Auth/DBMAuth methods can be used for access control. The +# user name is the `one line' version of the client's X.509 certificate. +# Note that no password is obtained from the user. Every entry in the user +# file needs this password: `xxj31ZMTZzkVA'. +# o ExportCertData: +# This exports two additional environment variables: SSL_CLIENT_CERT and +# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the +# server (always existing) and the client (only existing when client +# authentication is used). This can be used to import the certificates +# into CGI scripts. +# o StdEnvVars: +# This exports the standard SSL/TLS related `SSL_*' environment variables. +# Per default this exportation is switched off for performance reasons, +# because the extraction step is an expensive operation and is usually +# useless for serving static content. So one usually enables the +# exportation for CGI and SSI requests only. +# o StrictRequire: +# This denies access when "SSLRequireSSL" or "SSLRequire" applied even +# under a "Satisfy any" situation, i.e. when it applies access is denied +# and no other module can change it. +# o OptRenegotiate: +# This enables optimized SSL connection renegotiation handling when SSL +# directives are used in per-directory context. +#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire + + SSLOptions +StdEnvVars + + + SSLOptions +StdEnvVars + + +# SSL Protocol Adjustments: +# The safe and default but still SSL/TLS standard compliant shutdown +# approach is that mod_ssl sends the close notify alert but doesn't wait for +# the close notify alert from client. When you need a different shutdown +# approach you can use one of the following variables: +# o ssl-unclean-shutdown: +# This forces an unclean shutdown when the connection is closed, i.e. no +# SSL close notify alert is sent or allowed to be received. This violates +# the SSL/TLS standard but is needed for some brain-dead browsers. Use +# this when you receive I/O errors because of the standard approach where +# mod_ssl sends the close notify alert. +# o ssl-accurate-shutdown: +# This forces an accurate shutdown when the connection is closed, i.e. a +# SSL close notify alert is send and mod_ssl waits for the close notify +# alert of the client. This is 100% SSL/TLS standard compliant, but in +# practice often causes hanging connections with brain-dead browsers. Use +# this only for browsers where you know that their SSL implementation +# works correctly. +# Notice: Most problems of broken clients are also related to the HTTP +# keep-alive facility, so you usually additionally want to disable +# keep-alive for those clients, too. Use variable "nokeepalive" for this. +# Similarly, one has to force some clients to use HTTP/1.0 to workaround +# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and +# "force-response-1.0" for this. +BrowserMatch "MSIE [2-5]" \ + nokeepalive ssl-unclean-shutdown \ + downgrade-1.0 force-response-1.0 + +# Per-Server Logging: +# The home of a custom SSL log file. Use this when you want a +# compact non-error SSL logfile on a virtual host basis. +CustomLog "@exp_logfiledir@/ssl_request_log" \ + "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" + + diff --git a/docs/conf/extra/httpd-userdir.conf.in b/docs/conf/extra/httpd-userdir.conf.in new file mode 100644 index 0000000..a744322 --- /dev/null +++ b/docs/conf/extra/httpd-userdir.conf.in @@ -0,0 +1,21 @@ +# Settings for user home directories +# +# Required module: mod_authz_core, mod_authz_host, mod_userdir + +# +# UserDir: The name of the directory that is appended onto a user's home +# directory if a ~user request is received. Note that you must also set +# the default access control for these directories, as in the example below. +# +UserDir public_html + +# +# Control access to UserDir directories. The following is an example +# for a site where these directories are restricted to read-only. +# + + AllowOverride FileInfo AuthConfig Limit Indexes + Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec + Require method GET POST OPTIONS + + diff --git a/docs/conf/extra/httpd-vhosts.conf.in b/docs/conf/extra/httpd-vhosts.conf.in new file mode 100644 index 0000000..fbd2df4 --- /dev/null +++ b/docs/conf/extra/httpd-vhosts.conf.in @@ -0,0 +1,41 @@ +# Virtual Hosts +# +# Required modules: mod_log_config + +# If you want to maintain multiple domains/hostnames on your +# machine you can setup VirtualHost containers for them. Most configurations +# use only name-based virtual hosts so the server doesn't need to worry about +# IP addresses. This is indicated by the asterisks in the directives below. +# +# Please see the documentation at +# +# for further details before you try to setup virtual hosts. +# +# You may use the command line option '-S' to verify your virtual host +# configuration. + +# +# VirtualHost example: +# Almost any Apache directive may go into a VirtualHost container. +# The first VirtualHost section is used for all requests that do not +# match a ServerName or ServerAlias in any block. +# + + ServerAdmin webmaster@dummy-host.example.com + DocumentRoot "@@ServerRoot@@/docs/dummy-host.example.com" + ServerName dummy-host.example.com + ServerAlias www.dummy-host.example.com + ErrorLog "@rel_logfiledir@/dummy-host.example.com-error_log" + CustomLog "@rel_logfiledir@/dummy-host.example.com-access_log" common + + + + ServerAdmin webmaster@dummy-host2.example.com + DocumentRoot "@@ServerRoot@@/docs/dummy-host2.example.com" + ServerName dummy-host2.example.com + ErrorLog "@rel_logfiledir@/dummy-host2.example.com-error_log" + CustomLog "@rel_logfiledir@/dummy-host2.example.com-access_log" common + + + + diff --git a/docs/conf/extra/proxy-html.conf.in b/docs/conf/extra/proxy-html.conf.in new file mode 100644 index 0000000..683a091 --- /dev/null +++ b/docs/conf/extra/proxy-html.conf.in @@ -0,0 +1,90 @@ +# Configuration example. +# +# For detailed information about these directives see +# +# and for mod_xml2enc see +# +# +# First, to load the module with its prerequisites. Note: mod_xml2enc +# is not always necessary, but without it mod_proxy_html is likely to +# mangle pages in encodings other than ASCII or Unicode (utf-8). +# +# For Unix-family systems: +# LoadFile /usr/lib/libxml2.so +# LoadModule proxy_html_module modules/mod_proxy_html.so +# LoadModule xml2enc_module modules/mod_xml2enc.so +# +# For Windows (I don't know if there's a standard path for the libraries) +# LoadFile C:/path/zlib.dll +# LoadFile C:/path/iconv.dll +# LoadFile C:/path/libxml2.dll +# LoadModule proxy_html_module modules/mod_proxy_html.so +# LoadModule xml2enc_module modules/mod_xml2enc.so +# +# All knowledge of HTML links has been removed from the mod_proxy_html +# code itself, and is instead read from httpd.conf (or included file) +# at server startup. So you MUST declare it. This will normally be +# at top level, but can also be used in a . +# +# Here's the declaration for W3C HTML 4.01 and XHTML 1.0 + +ProxyHTMLLinks a href +ProxyHTMLLinks area href +ProxyHTMLLinks link href +ProxyHTMLLinks img src longdesc usemap +ProxyHTMLLinks object classid codebase data usemap +ProxyHTMLLinks q cite +ProxyHTMLLinks blockquote cite +ProxyHTMLLinks ins cite +ProxyHTMLLinks del cite +ProxyHTMLLinks form action +ProxyHTMLLinks input src usemap +ProxyHTMLLinks head profile +ProxyHTMLLinks base href +ProxyHTMLLinks script src for + +# To support scripting events (with ProxyHTMLExtended On), +# you'll need to declare them too. + +ProxyHTMLEvents onclick ondblclick onmousedown onmouseup \ + onmouseover onmousemove onmouseout onkeypress \ + onkeydown onkeyup onfocus onblur onload \ + onunload onsubmit onreset onselect onchange + +# If you need to support legacy (pre-1998, aka "transitional") HTML or XHTML, +# you'll need to uncomment the following deprecated link attributes. +# Note that these are enabled in earlier mod_proxy_html versions +# +# ProxyHTMLLinks frame src longdesc +# ProxyHTMLLinks iframe src longdesc +# ProxyHTMLLinks body background +# ProxyHTMLLinks applet codebase +# +# If you're dealing with proprietary HTML variants, +# declare your own URL attributes here as required. +# +# ProxyHTMLLinks myelement myattr otherattr +# +########### +# EXAMPLE # +########### +# +# To define the URL /my-gateway/ as a gateway to an appserver with address +# http://some.app.intranet/ on a private network, after loading the +# modules and including this configuration file: +# +# ProxyRequests Off <-- this is an important security setting +# ProxyPass /my-gateway/ http://some.app.intranet/ +# +# ProxyPassReverse / +# ProxyHTMLEnable On +# ProxyHTMLURLMap http://some.app.intranet/ /my-gateway/ +# ProxyHTMLURLMap / /my-gateway/ +# +# +# Many (though not all) real-life setups are more complex. +# +# See the documentation at +# http://apache.webthing.com/mod_proxy_html/ +# and the tutorial at +# http://www.apachetutor.org/admin/reverseproxies diff --git a/docs/conf/httpd.conf.in b/docs/conf/httpd.conf.in new file mode 100644 index 0000000..37d7c0b --- /dev/null +++ b/docs/conf/httpd.conf.in @@ -0,0 +1,418 @@ +# +# This is the main Apache HTTP server configuration file. It contains the +# configuration directives that give the server its instructions. +# See for detailed information. +# In particular, see +# +# for a discussion of each configuration directive. +# +# Do NOT simply read the instructions in here without understanding +# what they do. They're here only as hints or reminders. If you are unsure +# consult the online docs. You have been warned. +# +# Configuration and logfile names: If the filenames you specify for many +# of the server's control files begin with "/" (or "drive:/" for Win32), the +# server will use that explicit path. If the filenames do *not* begin +# with "/", the value of ServerRoot is prepended -- so "logs/access_log" +# with ServerRoot set to "/usr/local/apache2" will be interpreted by the +# server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log" +# will be interpreted as '/logs/access_log'. + +# +# ServerRoot: The top of the directory tree under which the server's +# configuration, error, and log files are kept. +# +# Do not add a slash at the end of the directory path. If you point +# ServerRoot at a non-local disk, be sure to specify a local disk on the +# Mutex directive, if file-based mutexes are used. If you wish to share the +# same ServerRoot for multiple httpd daemons, you will need to change at +# least PidFile. +# +ServerRoot "@@ServerRoot@@" + +# +# Mutex: Allows you to set the mutex mechanism and mutex file directory +# for individual mutexes, or change the global defaults +# +# Uncomment and change the directory if mutexes are file-based and the default +# mutex file directory is not on a local disk or is not appropriate for some +# other reason. +# +# Mutex default:@rel_runtimedir@ + +# +# Listen: Allows you to bind Apache to specific IP addresses and/or +# ports, instead of the default. See also the +# directive. +# +# Change this to Listen on specific IP addresses as shown below to +# prevent Apache from glomming onto all bound IP addresses. +# +#Listen 12.34.56.78:80 +Listen @@Port@@ + +# +# Dynamic Shared Object (DSO) Support +# +# To be able to use the functionality of a module which was built as a DSO you +# have to place corresponding `LoadModule' lines at this location so the +# directives contained in it are actually available _before_ they are used. +# Statically compiled modules (those listed by `httpd -l') do not need +# to be loaded here. +# +# Example: +# LoadModule foo_module modules/mod_foo.so +# +@@LoadModule@@ + + +# +# If you wish httpd to run as a different user or group, you must run +# httpd as root initially and it will switch. +# +# User/Group: The name (or #number) of the user/group to run httpd as. +# It is usually good practice to create a dedicated user and group for +# running httpd, as with most system services. +# +User daemon +Group daemon + + + +# 'Main' server configuration +# +# The directives in this section set up the values used by the 'main' +# server, which responds to any requests that aren't handled by a +# definition. These values also provide defaults for +# any containers you may define later in the file. +# +# All of these directives may appear inside containers, +# in which case these default settings will be overridden for the +# virtual host being defined. +# + +# +# ServerAdmin: Your address, where problems with the server should be +# e-mailed. This address appears on some server-generated pages, such +# as error documents. e.g. admin@your-domain.com +# +ServerAdmin you@example.com + +# +# ServerName gives the name and port that the server uses to identify itself. +# This can often be determined automatically, but we recommend you specify +# it explicitly to prevent problems during startup. +# +# If your host doesn't have a registered DNS name, enter its IP address here. +# +#ServerName www.example.com:@@Port@@ + +# +# Deny access to the entirety of your server's filesystem. You must +# explicitly permit access to web content directories in other +# blocks below. +# + + AllowOverride none + Require all denied + + +# +# Note that from this point forward you must specifically allow +# particular features to be enabled - so if something's not working as +# you might expect, make sure that you have specifically enabled it +# below. +# + +# +# DocumentRoot: The directory out of which you will serve your +# documents. By default, all requests are taken from this directory, but +# symbolic links and aliases may be used to point to other locations. +# +DocumentRoot "@exp_htdocsdir@" + + # + # Possible values for the Options directive are "None", "All", + # or any combination of: + # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews + # + # Note that "MultiViews" must be named *explicitly* --- "Options All" + # doesn't give it to you. + # + # The Options directive is both complicated and important. Please see + # http://httpd.apache.org/docs/2.4/mod/core.html#options + # for more information. + # + Options Indexes FollowSymLinks + + # + # AllowOverride controls what directives may be placed in .htaccess files. + # It can be "All", "None", or any combination of the keywords: + # AllowOverride FileInfo AuthConfig Limit + # + AllowOverride None + + # + # Controls who can get stuff from this server. + # + Require all granted + + +# +# DirectoryIndex: sets the file that Apache will serve if a directory +# is requested. +# + + DirectoryIndex index.html + + +# +# The following lines prevent .htaccess and .htpasswd files from being +# viewed by Web clients. +# + + Require all denied + + +# +# ErrorLog: The location of the error log file. +# If you do not specify an ErrorLog directive within a +# container, error messages relating to that virtual host will be +# logged here. If you *do* define an error logfile for a +# container, that host's errors will be logged there and not here. +# +ErrorLog "@rel_logfiledir@/error_log" + +# +# LogLevel: Control the number of messages logged to the error_log. +# Possible values include: debug, info, notice, warn, error, crit, +# alert, emerg. +# +LogLevel warn + + + # + # The following directives define some format nicknames for use with + # a CustomLog directive (see below). + # + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined + LogFormat "%h %l %u %t \"%r\" %>s %b" common + + + # You need to enable mod_logio.c to use %I and %O + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio + + + # + # The location and format of the access logfile (Common Logfile Format). + # If you do not define any access logfiles within a + # container, they will be logged here. Contrariwise, if you *do* + # define per- access logfiles, transactions will be + # logged therein and *not* in this file. + # + CustomLog "@rel_logfiledir@/access_log" common + + # + # If you prefer a logfile with access, agent, and referer information + # (Combined Logfile Format) you can use the following directive. + # + #CustomLog "@rel_logfiledir@/access_log" combined + + + + # + # Redirect: Allows you to tell clients about documents that used to + # exist in your server's namespace, but do not anymore. The client + # will make a new request for the document at its new location. + # Example: + # Redirect permanent /foo http://www.example.com/bar + + # + # Alias: Maps web paths into filesystem paths and is used to + # access content that does not live under the DocumentRoot. + # Example: + # Alias /webpath /full/filesystem/path + # + # If you include a trailing / on /webpath then the server will + # require it to be present in the URL. You will also likely + # need to provide a section to allow access to + # the filesystem path. + + # + # ScriptAlias: This controls which directories contain server scripts. + # ScriptAliases are essentially the same as Aliases, except that + # documents in the target directory are treated as applications and + # run by the server when requested rather than as documents sent to the + # client. The same rules about trailing "/" apply to ScriptAlias + # directives as to Alias. + # + ScriptAlias /cgi-bin/ "@exp_cgidir@/" + + + + + # + # ScriptSock: On threaded servers, designate the path to the UNIX + # socket used to communicate with the CGI daemon of mod_cgid. + # + #Scriptsock cgisock + + +# +# "@exp_cgidir@" should be changed to whatever your ScriptAliased +# CGI directory exists, if you have that configured. +# + + AllowOverride None + Options None + Require all granted + + + + # + # Avoid passing HTTP_PROXY environment to CGI's on this or any proxied + # backend servers which have lingering "httpoxy" defects. + # 'Proxy' request header is undefined by the IETF, not listed by IANA + # + RequestHeader unset Proxy early + + + + # + # TypesConfig points to the file containing the list of mappings from + # filename extension to MIME-type. + # + TypesConfig @rel_sysconfdir@/mime.types + + # + # AddType allows you to add to or override the MIME configuration + # file specified in TypesConfig for specific file types. + # + #AddType application/x-gzip .tgz + # + # AddEncoding allows you to have certain browsers uncompress + # information on the fly. Note: Not all browsers support this. + # + #AddEncoding x-compress .Z + #AddEncoding x-gzip .gz .tgz + # + # If the AddEncoding directives above are commented-out, then you + # probably should define those extensions to indicate media types: + # + AddType application/x-compress .Z + AddType application/x-gzip .gz .tgz + + # + # AddHandler allows you to map certain file extensions to "handlers": + # actions unrelated to filetype. These can be either built into the server + # or added with the Action directive (see below) + # + # To use CGI scripts outside of ScriptAliased directories: + # (You will also need to add "ExecCGI" to the "Options" directive.) + # + #AddHandler cgi-script .cgi + + # For type maps (negotiated resources): + #AddHandler type-map var + + # + # Filters allow you to process content before it is sent to the client. + # + # To parse .shtml files for server-side includes (SSI): + # (You will also need to add "Includes" to the "Options" directive.) + # + #AddType text/html .shtml + #AddOutputFilter INCLUDES .shtml + + +# +# The mod_mime_magic module allows the server to use various hints from the +# contents of the file itself to determine its type. The MIMEMagicFile +# directive tells the module where the hint definitions are located. +# +#MIMEMagicFile @rel_sysconfdir@/magic + +# +# Customizable error responses come in three flavors: +# 1) plain text 2) local redirects 3) external redirects +# +# Some examples: +#ErrorDocument 500 "The server made a boo boo." +#ErrorDocument 404 /missing.html +#ErrorDocument 404 "/cgi-bin/missing_handler.pl" +#ErrorDocument 402 http://www.example.com/subscription_info.html +# + +# +# MaxRanges: Maximum number of Ranges in a request before +# returning the entire resource, or one of the special +# values 'default', 'none' or 'unlimited'. +# Default setting is to accept 200 Ranges. +#MaxRanges unlimited + +# +# EnableMMAP and EnableSendfile: On systems that support it, +# memory-mapping or the sendfile syscall may be used to deliver +# files. This usually improves server performance, but must +# be turned off when serving from networked-mounted +# filesystems or if support for these functions is otherwise +# broken on your system. +# Defaults: EnableMMAP On, EnableSendfile Off +# +#EnableMMAP off +#EnableSendfile on + +# Supplemental configuration +# +# The configuration files in the @rel_sysconfdir@/extra/ directory can be +# included to add extra features or to modify the default configuration of +# the server, or you may simply copy their contents here and change as +# necessary. + +# Server-pool management (MPM specific) +#Include @rel_sysconfdir@/extra/httpd-mpm.conf + +# Multi-language error messages +#Include @rel_sysconfdir@/extra/httpd-multilang-errordoc.conf + +# Fancy directory listings +#Include @rel_sysconfdir@/extra/httpd-autoindex.conf + +# Language settings +#Include @rel_sysconfdir@/extra/httpd-languages.conf + +# User home directories +#Include @rel_sysconfdir@/extra/httpd-userdir.conf + +# Real-time info on requests and configuration +#Include @rel_sysconfdir@/extra/httpd-info.conf + +# Virtual hosts +#Include @rel_sysconfdir@/extra/httpd-vhosts.conf + +# Local access to the Apache HTTP Server Manual +#Include @rel_sysconfdir@/extra/httpd-manual.conf + +# Distributed authoring and versioning (WebDAV) +#Include @rel_sysconfdir@/extra/httpd-dav.conf + +# Various default settings +#Include @rel_sysconfdir@/extra/httpd-default.conf + +# Configure mod_proxy_html to understand HTML4/XHTML1 + +Include @rel_sysconfdir@/extra/proxy-html.conf + + +# Secure (SSL/TLS) connections +#Include @rel_sysconfdir@/extra/httpd-ssl.conf +# +# Note: The following must must be present to support +# starting without SSL on platforms with no /dev/random equivalent +# but a statically compiled-in mod_ssl. +# + +SSLRandomSeed startup builtin +SSLRandomSeed connect builtin + + diff --git a/docs/conf/magic b/docs/conf/magic new file mode 100644 index 0000000..bc891d9 --- /dev/null +++ b/docs/conf/magic @@ -0,0 +1,385 @@ +# Magic data for mod_mime_magic Apache module (originally for file(1) command) +# The module is described in /manual/mod/mod_mime_magic.html +# +# The format is 4-5 columns: +# Column #1: byte number to begin checking from, ">" indicates continuation +# Column #2: type of data to match +# Column #3: contents of data to match +# Column #4: MIME type of result +# Column #5: MIME encoding of result (optional) + +#------------------------------------------------------------------------------ +# Localstuff: file(1) magic for locally observed files +# Add any locally observed files here. + +#------------------------------------------------------------------------------ +# end local stuff +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Java + +0 short 0xcafe +>2 short 0xbabe application/java + +#------------------------------------------------------------------------------ +# audio: file(1) magic for sound formats +# +# from Jan Nicolai Langfeldt , +# + +# Sun/NeXT audio data +0 string .snd +>12 belong 1 audio/basic +>12 belong 2 audio/basic +>12 belong 3 audio/basic +>12 belong 4 audio/basic +>12 belong 5 audio/basic +>12 belong 6 audio/basic +>12 belong 7 audio/basic + +>12 belong 23 audio/x-adpcm + +# DEC systems (e.g. DECstation 5000) use a variant of the Sun/NeXT format +# that uses little-endian encoding and has a different magic number +# (0x0064732E in little-endian encoding). +0 lelong 0x0064732E +>12 lelong 1 audio/x-dec-basic +>12 lelong 2 audio/x-dec-basic +>12 lelong 3 audio/x-dec-basic +>12 lelong 4 audio/x-dec-basic +>12 lelong 5 audio/x-dec-basic +>12 lelong 6 audio/x-dec-basic +>12 lelong 7 audio/x-dec-basic +# compressed (G.721 ADPCM) +>12 lelong 23 audio/x-dec-adpcm + +# Bytes 0-3 of AIFF, AIFF-C, & 8SVX audio files are "FORM" +# AIFF audio data +8 string AIFF audio/x-aiff +# AIFF-C audio data +8 string AIFC audio/x-aiff +# IFF/8SVX audio data +8 string 8SVX audio/x-aiff + +# Creative Labs AUDIO stuff +# Standard MIDI data +0 string MThd audio/unknown +#>9 byte >0 (format %d) +#>11 byte >1 using %d channels +# Creative Music (CMF) data +0 string CTMF audio/unknown +# SoundBlaster instrument data +0 string SBI audio/unknown +# Creative Labs voice data +0 string Creative\ Voice\ File audio/unknown +## is this next line right? it came this way... +#>19 byte 0x1A +#>23 byte >0 - version %d +#>22 byte >0 \b.%d + +# [GRR 950115: is this also Creative Labs? Guessing that first line +# should be string instead of unknown-endian long...] +#0 long 0x4e54524b MultiTrack sound data +#0 string NTRK MultiTrack sound data +#>4 long x - version %ld + +# Microsoft WAVE format (*.wav) +# [GRR 950115: probably all of the shorts and longs should be leshort/lelong] +# Microsoft RIFF +0 string RIFF +# - WAVE format +>8 string WAVE audio/x-wav +# MPEG audio. +0 beshort&0xfff0 0xfff0 audio/mpeg +# C64 SID Music files, from Linus Walleij +0 string PSID audio/prs.sid + +#------------------------------------------------------------------------------ +# c-lang: file(1) magic for C programs or various scripts +# + +# XPM icons (Greg Roelofs, newt@uchicago.edu) +# ideally should go into "images", but entries below would tag XPM as C source +0 string /*\ XPM image/x-xbm 7bit + +# this first will upset you if you're a PL/1 shop... (are there any left?) +# in which case rm it; ascmagic will catch real C programs +# C or REXX program text +0 string /* text/plain +# C++ program text +0 string // text/plain + +#------------------------------------------------------------------------------ +# compress: file(1) magic for pure-compression formats (no archives) +# +# compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, whap, etc. +# +# Formats for various forms of compressed data +# Formats for "compress" proper have been moved into "compress.c", +# because it tries to uncompress it to figure out what's inside. + +# standard unix compress +0 string \037\235 application/octet-stream x-compress + +# gzip (GNU zip, not to be confused with [Info-ZIP/PKWARE] zip archiver) +0 string \037\213 application/octet-stream x-gzip + +# According to gzip.h, this is the correct byte order for packed data. +0 string \037\036 application/octet-stream +# +# This magic number is byte-order-independent. +# +0 short 017437 application/octet-stream + +# XXX - why *two* entries for "compacted data", one of which is +# byte-order independent, and one of which is byte-order dependent? +# +# compacted data +0 short 0x1fff application/octet-stream +0 string \377\037 application/octet-stream +# huf output +0 short 0145405 application/octet-stream + +# Squeeze and Crunch... +# These numbers were gleaned from the Unix versions of the programs to +# handle these formats. Note that I can only uncrunch, not crunch, and +# I didn't have a crunched file handy, so the crunch number is untested. +# Keith Waclena +#0 leshort 0x76FF squeezed data (CP/M, DOS) +#0 leshort 0x76FE crunched data (CP/M, DOS) + +# Freeze +#0 string \037\237 Frozen file 2.1 +#0 string \037\236 Frozen file 1.0 (or gzip 0.5) + +# lzh? +#0 string \037\240 LZH compressed data + +#------------------------------------------------------------------------------ +# frame: file(1) magic for FrameMaker files +# +# This stuff came on a FrameMaker demo tape, most of which is +# copyright, but this file is "published" as witness the following: +# +0 string \ +# and Anna Shergold +# +0 string \ +0 string \14 byte 12 (OS/2 1.x format) +#>14 byte 64 (OS/2 2.x format) +#>14 byte 40 (Windows 3.x format) +#0 string IC icon +#0 string PI pointer +#0 string CI color icon +#0 string CP color pointer +#0 string BA bitmap array + +0 string \x89PNG image/png +0 string FWS application/x-shockwave-flash +0 string CWS application/x-shockwave-flash + +#------------------------------------------------------------------------------ +# lisp: file(1) magic for lisp programs +# +# various lisp types, from Daniel Quinlan (quinlan@yggdrasil.com) +0 string ;; text/plain 8bit +# Emacs 18 - this is always correct, but not very magical. +0 string \012( application/x-elc +# Emacs 19 +0 string ;ELC\023\000\000\000 application/x-elc + +#------------------------------------------------------------------------------ +# mail.news: file(1) magic for mail and news +# +# There are tests to ascmagic.c to cope with mail and news. +0 string Relay-Version: message/rfc822 7bit +0 string #!\ rnews message/rfc822 7bit +0 string N#!\ rnews message/rfc822 7bit +0 string Forward\ to message/rfc822 7bit +0 string Pipe\ to message/rfc822 7bit +0 string Return-Path: message/rfc822 7bit +0 string Path: message/news 8bit +0 string Xref: message/news 8bit +0 string From: message/rfc822 7bit +0 string Article message/news 8bit +#------------------------------------------------------------------------------ +# msword: file(1) magic for MS Word files +# +# Contributor claims: +# Reversed-engineered MS Word magic numbers +# + +0 string \376\067\0\043 application/msword +0 string \333\245-\0\0\0 application/msword + +# disable this one because it applies also to other +# Office/OLE documents for which msword is not correct. See PR#2608. +#0 string \320\317\021\340\241\261 application/msword + + + +#------------------------------------------------------------------------------ +# printer: file(1) magic for printer-formatted files +# + +# PostScript +0 string %! application/postscript +0 string \004%! application/postscript + +# Acrobat +# (due to clamen@cs.cmu.edu) +0 string %PDF- application/pdf + +#------------------------------------------------------------------------------ +# sc: file(1) magic for "sc" spreadsheet +# +38 string Spreadsheet application/x-sc + +#------------------------------------------------------------------------------ +# tex: file(1) magic for TeX files +# +# XXX - needs byte-endian stuff (big-endian and little-endian DVI?) +# +# From + +# Although we may know the offset of certain text fields in TeX DVI +# and font files, we can't use them reliably because they are not +# zero terminated. [but we do anyway, christos] +0 string \367\002 application/x-dvi +#0 string \367\203 TeX generic font data +#0 string \367\131 TeX packed font data +#0 string \367\312 TeX virtual font data +#0 string This\ is\ TeX, TeX transcript text +#0 string This\ is\ METAFONT, METAFONT transcript text + +# There is no way to detect TeX Font Metric (*.tfm) files without +# breaking them apart and reading the data. The following patterns +# match most *.tfm files generated by METAFONT or afm2tfm. +#2 string \000\021 TeX font metric data +#2 string \000\022 TeX font metric data +#>34 string >\0 (%s) + +# Texinfo and GNU Info, from Daniel Quinlan (quinlan@yggdrasil.com) +#0 string \\input\ texinfo Texinfo source text +#0 string This\ is\ Info\ file GNU Info text + +# correct TeX magic for Linux (and maybe more) +# from Peter Tobias (tobias@server.et-inf.fho-emden.de) +# +0 leshort 0x02f7 application/x-dvi + +# RTF - Rich Text Format +0 string {\\rtf application/rtf + +#------------------------------------------------------------------------------ +# animation: file(1) magic for animation/movie formats +# +# animation formats, originally from vax@ccwf.cc.utexas.edu (VaX#n8) +# MPEG file +0 string \000\000\001\263 video/mpeg +# +# The contributor claims: +# I couldn't find a real magic number for these, however, this +# -appears- to work. Note that it might catch other files, too, +# so BE CAREFUL! +# +# Note that title and author appear in the two 20-byte chunks +# at decimal offsets 2 and 22, respectively, but they are XOR'ed with +# 255 (hex FF)! DL format SUCKS BIG ROCKS. +# +# DL file version 1 , medium format (160x100, 4 images/screen) +0 byte 1 video/unknown +0 byte 2 video/unknown +# Quicktime video, from Linus Walleij +# from Apple quicktime file format documentation. +4 string moov video/quicktime +4 string mdat video/quicktime + diff --git a/docs/conf/mime.types b/docs/conf/mime.types new file mode 100644 index 0000000..92ee717 --- /dev/null +++ b/docs/conf/mime.types @@ -0,0 +1,1859 @@ +# This file maps Internet media types to unique file extension(s). +# Although created for httpd, this file is used by many software systems +# and has been placed in the public domain for unlimited redistribution. +# +# The table below contains both registered and (common) unregistered types. +# A type that has no unique extension can be ignored -- they are listed +# here to guide configurations toward known types and to make it easier to +# identify "new" types. File extensions are also commonly used to indicate +# content languages and encodings, so choose them carefully. +# +# Internet media types should be registered as described in RFC 4288. +# The registry is at . +# +# MIME type (lowercased) Extensions +# ============================================ ========== +# application/1d-interleaved-parityfec +# application/3gpdash-qoe-report+xml +# application/3gpp-ims+xml +# application/a2l +# application/activemessage +# application/alto-costmap+json +# application/alto-costmapfilter+json +# application/alto-directory+json +# application/alto-endpointcost+json +# application/alto-endpointcostparams+json +# application/alto-endpointprop+json +# application/alto-endpointpropparams+json +# application/alto-error+json +# application/alto-networkmap+json +# application/alto-networkmapfilter+json +# application/aml +application/andrew-inset ez +# application/applefile +application/applixware aw +# application/atf +# application/atfx +application/atom+xml atom +application/atomcat+xml atomcat +# application/atomdeleted+xml +# application/atomicmail +application/atomsvc+xml atomsvc +# application/atxml +# application/auth-policy+xml +# application/bacnet-xdd+zip +# application/batch-smtp +# application/beep+xml +# application/calendar+json +# application/calendar+xml +# application/call-completion +# application/cals-1840 +# application/cbor +# application/ccmp+xml +application/ccxml+xml ccxml +# application/cdfx+xml +application/cdmi-capability cdmia +application/cdmi-container cdmic +application/cdmi-domain cdmid +application/cdmi-object cdmio +application/cdmi-queue cdmiq +# application/cdni +# application/cea +# application/cea-2018+xml +# application/cellml+xml +# application/cfw +# application/cms +# application/cnrp+xml +# application/coap-group+json +# application/commonground +# application/conference-info+xml +# application/cpl+xml +# application/csrattrs +# application/csta+xml +# application/cstadata+xml +# application/csvm+json +application/cu-seeme cu +# application/cybercash +# application/dash+xml +# application/dashdelta +application/davmount+xml davmount +# application/dca-rft +# application/dcd +# application/dec-dx +# application/dialog-info+xml +# application/dicom +# application/dii +# application/dit +# application/dns +application/docbook+xml dbk +# application/dskpp+xml +application/dssc+der dssc +application/dssc+xml xdssc +# application/dvcs +application/ecmascript ecma +# application/edi-consent +# application/edi-x12 +# application/edifact +# application/efi +# application/emergencycalldata.comment+xml +# application/emergencycalldata.deviceinfo+xml +# application/emergencycalldata.providerinfo+xml +# application/emergencycalldata.serviceinfo+xml +# application/emergencycalldata.subscriberinfo+xml +application/emma+xml emma +# application/emotionml+xml +# application/encaprtp +# application/epp+xml +application/epub+zip epub +# application/eshop +# application/example +application/exi exi +# application/fastinfoset +# application/fastsoap +# application/fdt+xml +# application/fits +application/font-tdpfr pfr +# application/framework-attributes+xml +# application/geo+json +application/gml+xml gml +application/gpx+xml gpx +application/gxf gxf +# application/gzip +# application/h224 +# application/held+xml +# application/http +application/hyperstudio stk +# application/ibe-key-request+xml +# application/ibe-pkg-reply+xml +# application/ibe-pp-data +# application/iges +# application/im-iscomposing+xml +# application/index +# application/index.cmd +# application/index.obj +# application/index.response +# application/index.vnd +application/inkml+xml ink inkml +# application/iotp +application/ipfix ipfix +# application/ipp +# application/isup +# application/its+xml +application/java-archive jar +application/java-serialized-object ser +application/java-vm class +# application/javascript +# application/jose +# application/jose+json +# application/jrd+json +application/json json +# application/json-patch+json +# application/json-seq +application/jsonml+json jsonml +# application/jwk+json +# application/jwk-set+json +# application/jwt +# application/kpml-request+xml +# application/kpml-response+xml +# application/ld+json +# application/lgr+xml +# application/link-format +# application/load-control+xml +application/lost+xml lostxml +# application/lostsync+xml +# application/lxf +application/mac-binhex40 hqx +application/mac-compactpro cpt +# application/macwriteii +application/mads+xml mads +application/marc mrc +application/marcxml+xml mrcx +application/mathematica ma nb mb +application/mathml+xml mathml +# application/mathml-content+xml +# application/mathml-presentation+xml +# application/mbms-associated-procedure-description+xml +# application/mbms-deregister+xml +# application/mbms-envelope+xml +# application/mbms-msk+xml +# application/mbms-msk-response+xml +# application/mbms-protection-description+xml +# application/mbms-reception-report+xml +# application/mbms-register+xml +# application/mbms-register-response+xml +# application/mbms-schedule+xml +# application/mbms-user-service-description+xml +application/mbox mbox +# application/media-policy-dataset+xml +# application/media_control+xml +application/mediaservercontrol+xml mscml +# application/merge-patch+json +application/metalink+xml metalink +application/metalink4+xml meta4 +application/mets+xml mets +# application/mf4 +# application/mikey +application/mods+xml mods +# application/moss-keys +# application/moss-signature +# application/mosskey-data +# application/mosskey-request +application/mp21 m21 mp21 +application/mp4 mp4s +# application/mpeg4-generic +# application/mpeg4-iod +# application/mpeg4-iod-xmt +# application/mrb-consumer+xml +# application/mrb-publish+xml +# application/msc-ivr+xml +# application/msc-mixer+xml +application/msword doc dot +application/mxf mxf +# application/nasdata +# application/news-checkgroups +# application/news-groupinfo +# application/news-transmission +# application/nlsml+xml +# application/nss +# application/ocsp-request +# application/ocsp-response +application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy +application/oda oda +# application/odx +application/oebps-package+xml opf +application/ogg ogx +application/omdoc+xml omdoc +application/onenote onetoc onetoc2 onetmp onepkg +application/oxps oxps +# application/p2p-overlay+xml +# application/parityfec +application/patch-ops-error+xml xer +application/pdf pdf +# application/pdx +application/pgp-encrypted pgp +# application/pgp-keys +application/pgp-signature asc sig +application/pics-rules prf +# application/pidf+xml +# application/pidf-diff+xml +application/pkcs10 p10 +# application/pkcs12 +application/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +application/pkcs8 p8 +application/pkix-attr-cert ac +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp pki +application/pls+xml pls +# application/poc-settings+xml +application/postscript ai eps ps +# application/ppsp-tracker+json +# application/problem+json +# application/problem+xml +# application/provenance+xml +# application/prs.alvestrand.titrax-sheet +application/prs.cww cww +# application/prs.hpub+zip +# application/prs.nprend +# application/prs.plucker +# application/prs.rdf-xml-crypt +# application/prs.xsf+xml +application/pskc+xml pskcxml +# application/qsig +# application/raptorfec +# application/rdap+json +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +# application/remote-printing +# application/reputon+json +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +# application/rfc+xml +# application/riscos +# application/rlmi+xml +application/rls-services+xml rs +application/rpki-ghostbusters gbr +application/rpki-manifest mft +application/rpki-roa roa +# application/rpki-updown +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +# application/rtploopback +# application/rtx +# application/samlassertion+xml +# application/samlmetadata+xml +application/sbml+xml sbml +# application/scaip+xml +# application/scim+json +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +# application/sep+xml +# application/sep-exi +# application/session-info +# application/set-payment +application/set-payment-initiation setpay +# application/set-registration +application/set-registration-initiation setreg +# application/sgml +# application/sgml-open-catalog +application/shf+xml shf +# application/sieve +# application/simple-filter+xml +# application/simple-message-summary +# application/simplesymbolcontainer +# application/slate +# application/smil +application/smil+xml smi smil +# application/smpte336m +# application/soap+fastinfoset +# application/soap+xml +application/sparql-query rq +application/sparql-results+xml srx +# application/spirits-event+xml +# application/sql +application/srgs gram +application/srgs+xml grxml +application/sru+xml sru +application/ssdl+xml ssdl +application/ssml+xml ssml +# application/tamp-apex-update +# application/tamp-apex-update-confirm +# application/tamp-community-update +# application/tamp-community-update-confirm +# application/tamp-error +# application/tamp-sequence-adjust +# application/tamp-sequence-adjust-confirm +# application/tamp-status-query +# application/tamp-status-response +# application/tamp-update +# application/tamp-update-confirm +application/tei+xml tei teicorpus +application/thraud+xml tfi +# application/timestamp-query +# application/timestamp-reply +application/timestamped-data tsd +# application/ttml+xml +# application/tve-trigger +# application/ulpfec +# application/urc-grpsheet+xml +# application/urc-ressheet+xml +# application/urc-targetdesc+xml +# application/urc-uisocketdesc+xml +# application/vcard+json +# application/vcard+xml +# application/vemmi +# application/vividence.scriptfile +# application/vnd.3gpp-prose+xml +# application/vnd.3gpp-prose-pc3ch+xml +# application/vnd.3gpp.access-transfer-events+xml +# application/vnd.3gpp.bsf+xml +# application/vnd.3gpp.mid-call+xml +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +# application/vnd.3gpp.sms +# application/vnd.3gpp.sms+xml +# application/vnd.3gpp.srvcc-ext+xml +# application/vnd.3gpp.srvcc-info+xml +# application/vnd.3gpp.state-and-event-info+xml +# application/vnd.3gpp.ussd+xml +# application/vnd.3gpp2.bcmcsinfo+xml +# application/vnd.3gpp2.sms +application/vnd.3gpp2.tcap tcap +# application/vnd.3lightssoftware.imagescal +application/vnd.3m.post-it-notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp atc acutc +application/vnd.adobe.air-application-installer-package+zip air +# application/vnd.adobe.flash.movie +application/vnd.adobe.formscentral.fcdt fcdt +application/vnd.adobe.fxp fxp fxpl +# application/vnd.adobe.partial-upload +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +# application/vnd.aether.imp +# application/vnd.ah-barcode +application/vnd.ahead.space ahead +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +# application/vnd.amazon.mobi8-ebook +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +# application/vnd.amundsen.maze+xml +application/vnd.android.package-archive apk +# application/vnd.anki +application/vnd.anser-web-certificate-issue-initiation cii +application/vnd.anser-web-funds-transfer-initiation fti +application/vnd.antix.game-component atx +# application/vnd.apache.thrift.binary +# application/vnd.apache.thrift.compact +# application/vnd.apache.thrift.json +# application/vnd.api+json +application/vnd.apple.installer+xml mpkg +application/vnd.apple.mpegurl m3u8 +# application/vnd.arastra.swi +application/vnd.aristanetworks.swi swi +# application/vnd.artsquare +application/vnd.astraea-software.iota iota +application/vnd.audiograph aep +# application/vnd.autopackage +# application/vnd.avistar+xml +# application/vnd.balsamiq.bmml+xml +# application/vnd.balsamiq.bmpr +# application/vnd.bekitzur-stech+json +# application/vnd.biopax.rdf+xml +application/vnd.blueice.multipass mpm +# application/vnd.bluetooth.ep.oob +# application/vnd.bluetooth.le.oob +application/vnd.bmi bmi +application/vnd.businessobjects rep +# application/vnd.cab-jscript +# application/vnd.canon-cpdl +# application/vnd.canon-lips +# application/vnd.cendio.thinlinc.clientconf +# application/vnd.century-systems.tcp_stream +application/vnd.chemdraw+xml cdxml +# application/vnd.chess-pgn +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +# application/vnd.cirpack.isdn-ext +# application/vnd.citationstyles.style+xml +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +application/vnd.cluetrust.cartomobile-config c11amc +application/vnd.cluetrust.cartomobile-config-pkg c11amz +# application/vnd.coffeescript +# application/vnd.collection+json +# application/vnd.collection.doc+json +# application/vnd.collection.next+json +# application/vnd.comicbook+zip +# application/vnd.commerce-battelle +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +# application/vnd.coreos.ignition+json +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +# application/vnd.ctct.ws+xml +# application/vnd.cups-pdf +# application/vnd.cups-postscript +application/vnd.cups-ppd ppd +# application/vnd.cups-raster +# application/vnd.cups-raw +# application/vnd.curl +application/vnd.curl.car car +application/vnd.curl.pcurl pcurl +# application/vnd.cyan.dean.root+xml +# application/vnd.cybank +application/vnd.dart dart +application/vnd.data-vision.rdz rdz +# application/vnd.debian.binary-package +application/vnd.dece.data uvf uvvf uvd uvvd +application/vnd.dece.ttml+xml uvt uvvt +application/vnd.dece.unspecified uvx uvvx +application/vnd.dece.zip uvz uvvz +application/vnd.denovo.fcselayout-link fe_launch +# application/vnd.desmume.movie +# application/vnd.dir-bi.plate-dl-nosuffix +# application/vnd.dm.delegation+xml +application/vnd.dna dna +# application/vnd.document+json +application/vnd.dolby.mlp mlp +# application/vnd.dolby.mobile.1 +# application/vnd.dolby.mobile.2 +# application/vnd.doremir.scorecloud-binary-document +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +# application/vnd.drive+json +application/vnd.ds-keypoint kpxx +# application/vnd.dtg.local +# application/vnd.dtg.local.flash +# application/vnd.dtg.local.html +application/vnd.dvb.ait ait +# application/vnd.dvb.dvbj +# application/vnd.dvb.esgcontainer +# application/vnd.dvb.ipdcdftnotifaccess +# application/vnd.dvb.ipdcesgaccess +# application/vnd.dvb.ipdcesgaccess2 +# application/vnd.dvb.ipdcesgpdd +# application/vnd.dvb.ipdcroaming +# application/vnd.dvb.iptv.alfec-base +# application/vnd.dvb.iptv.alfec-enhancement +# application/vnd.dvb.notif-aggregate-root+xml +# application/vnd.dvb.notif-container+xml +# application/vnd.dvb.notif-generic+xml +# application/vnd.dvb.notif-ia-msglist+xml +# application/vnd.dvb.notif-ia-registration-request+xml +# application/vnd.dvb.notif-ia-registration-response+xml +# application/vnd.dvb.notif-init+xml +# application/vnd.dvb.pfr +application/vnd.dvb.service svc +# application/vnd.dxr +application/vnd.dynageo geo +# application/vnd.dzr +# application/vnd.easykaraoke.cdgdownload +# application/vnd.ecdis-update +application/vnd.ecowin.chart mag +# application/vnd.ecowin.filerequest +# application/vnd.ecowin.fileupdate +# application/vnd.ecowin.series +# application/vnd.ecowin.seriesrequest +# application/vnd.ecowin.seriesupdate +# application/vnd.emclient.accessrequest+xml +application/vnd.enliven nml +# application/vnd.enphase.envoy +# application/vnd.eprints.data+xml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +# application/vnd.ericsson.quickcall +application/vnd.eszigno3+xml es3 et3 +# application/vnd.etsi.aoc+xml +# application/vnd.etsi.asic-e+zip +# application/vnd.etsi.asic-s+zip +# application/vnd.etsi.cug+xml +# application/vnd.etsi.iptvcommand+xml +# application/vnd.etsi.iptvdiscovery+xml +# application/vnd.etsi.iptvprofile+xml +# application/vnd.etsi.iptvsad-bc+xml +# application/vnd.etsi.iptvsad-cod+xml +# application/vnd.etsi.iptvsad-npvr+xml +# application/vnd.etsi.iptvservice+xml +# application/vnd.etsi.iptvsync+xml +# application/vnd.etsi.iptvueprofile+xml +# application/vnd.etsi.mcid+xml +# application/vnd.etsi.mheg5 +# application/vnd.etsi.overload-control-policy-dataset+xml +# application/vnd.etsi.pstn+xml +# application/vnd.etsi.sci+xml +# application/vnd.etsi.simservs+xml +# application/vnd.etsi.timestamp-token +# application/vnd.etsi.tsl+xml +# application/vnd.etsi.tsl.der +# application/vnd.eudora.data +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +# application/vnd.f-secure.mobile +# application/vnd.fastcopy-disk-image +application/vnd.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed seed dataless +# application/vnd.ffsns +# application/vnd.filmit.zfc +# application/vnd.fints +# application/vnd.firemonkeys.cloudcell +application/vnd.flographit gph +application/vnd.fluxtime.clip ftc +# application/vnd.font-fontforge-sfd +application/vnd.framemaker fm frame maker book +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +# application/vnd.fujixerox.art-ex +# application/vnd.fujixerox.art4 +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +# application/vnd.fujixerox.docuworks.container +# application/vnd.fujixerox.hbpl +# application/vnd.fut-misnet +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +# application/vnd.geo+json +# application/vnd.geocube+xml +application/vnd.geogebra.file ggb +application/vnd.geogebra.slides ggs +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.geonext gxt +application/vnd.geoplan g2w +application/vnd.geospace g3w +# application/vnd.gerber +# application/vnd.globalplatform.card-content-mgt +# application/vnd.globalplatform.card-content-mgt-response +application/vnd.gmx gmx +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +# application/vnd.gov.sk.e-form+xml +# application/vnd.gov.sk.e-form+zip +# application/vnd.gov.sk.xmldatacontainer+xml +application/vnd.grafeq gqf gqs +# application/vnd.gridmp +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +# application/vnd.hal+json +application/vnd.hal+xml hal +application/vnd.handheld-entertainment+xml zmm +application/vnd.hbci hbci +# application/vnd.hcl-bireports +# application/vnd.hdt +# application/vnd.heroku+json +application/vnd.hhe.lesson-player les +application/vnd.hp-hpgl hpgl +application/vnd.hp-hpid hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-pcl pcl +application/vnd.hp-pclxl pclxl +# application/vnd.httphone +application/vnd.hydrostatix.sof-data sfd-hdstx +# application/vnd.hyperdrive+json +# application/vnd.hzn-3d-crossword +# application/vnd.ibm.afplinedata +# application/vnd.ibm.electronic-media +application/vnd.ibm.minipay mpy +application/vnd.ibm.modcap afp listafp list3820 +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +# application/vnd.ieee.1905 +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +# application/vnd.ims.imsccv1p1 +# application/vnd.ims.imsccv1p2 +# application/vnd.ims.imsccv1p3 +# application/vnd.ims.lis.v2.result+json +# application/vnd.ims.lti.v2.toolconsumerprofile+json +# application/vnd.ims.lti.v2.toolproxy+json +# application/vnd.ims.lti.v2.toolproxy.id+json +# application/vnd.ims.lti.v2.toolsettings+json +# application/vnd.ims.lti.v2.toolsettings.simple+json +# application/vnd.informedcontrol.rms+xml +# application/vnd.informix-visionary +# application/vnd.infotech.project +# application/vnd.infotech.project+xml +# application/vnd.innopath.wamp.notification +application/vnd.insors.igm igm +application/vnd.intercon.formnet xpw xpx +application/vnd.intergeo i2g +# application/vnd.intertrust.digibox +# application/vnd.intertrust.nncp +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +# application/vnd.iptc.g2.catalogitem+xml +# application/vnd.iptc.g2.conceptitem+xml +# application/vnd.iptc.g2.knowledgeitem+xml +# application/vnd.iptc.g2.newsitem+xml +# application/vnd.iptc.g2.newsmessage+xml +# application/vnd.iptc.g2.packageitem+xml +# application/vnd.iptc.g2.planningitem+xml +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.isac.fcs fcs +application/vnd.jam jam +# application/vnd.japannet-directory-service +# application/vnd.japannet-jpnstore-wakeup +# application/vnd.japannet-payment-wakeup +# application/vnd.japannet-registration +# application/vnd.japannet-registration-wakeup +# application/vnd.japannet-setstore-wakeup +# application/vnd.japannet-verification +# application/vnd.japannet-verification-wakeup +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +# application/vnd.jsk.isdn-ngn +application/vnd.kahootz ktz ktr +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.kinar kne knp +application/vnd.koan skp skd skt skm +application/vnd.kodak-descriptor sse +application/vnd.las.las+xml lasxml +# application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 +application/vnd.lotus-approach apr +application/vnd.lotus-freelance pre +application/vnd.lotus-notes nsf +application/vnd.lotus-organizer org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp +application/vnd.macports.portpkg portpkg +# application/vnd.mapbox-vector-tile +# application/vnd.marlin.drm.actiontoken+xml +# application/vnd.marlin.drm.conftoken+xml +# application/vnd.marlin.drm.license+xml +# application/vnd.marlin.drm.mdcf +# application/vnd.mason+json +# application/vnd.maxmind.maxmind-db +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +# application/vnd.meridian-slingshot +application/vnd.mfer mwf +application/vnd.mfmp mfm +# application/vnd.micro+json +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +# application/vnd.microsoft.portable-executable +# application/vnd.miele+json +application/vnd.mif mif +# application/vnd.minisoft-hp3000-save +# application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf daf +application/vnd.mobius.dis dis +application/vnd.mobius.mbk mbk +application/vnd.mobius.mqy mqy +application/vnd.mobius.msl msl +application/vnd.mobius.plc plc +application/vnd.mobius.txf txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +# application/vnd.motorola.flexsuite +# application/vnd.motorola.flexsuite.adsi +# application/vnd.motorola.flexsuite.fis +# application/vnd.motorola.flexsuite.gotap +# application/vnd.motorola.flexsuite.kmr +# application/vnd.motorola.flexsuite.ttc +# application/vnd.motorola.flexsuite.wem +# application/vnd.motorola.iprm +application/vnd.mozilla.xul+xml xul +# application/vnd.ms-3mfdocument +application/vnd.ms-artgalry cil +# application/vnd.ms-asf +application/vnd.ms-cab-compressed cab +# application/vnd.ms-color.iccprofile +application/vnd.ms-excel xls xlm xla xlc xlt xlw +application/vnd.ms-excel.addin.macroenabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb +application/vnd.ms-excel.sheet.macroenabled.12 xlsm +application/vnd.ms-excel.template.macroenabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +# application/vnd.ms-office.activex+xml +application/vnd.ms-officetheme thmx +# application/vnd.ms-opentype +# application/vnd.ms-package.obfuscated-opentype +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +# application/vnd.ms-playready.initiator+xml +application/vnd.ms-powerpoint ppt pps pot +application/vnd.ms-powerpoint.addin.macroenabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm +application/vnd.ms-powerpoint.slide.macroenabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm +application/vnd.ms-powerpoint.template.macroenabled.12 potm +# application/vnd.ms-printdevicecapabilities+xml +# application/vnd.ms-printing.printticket+xml +# application/vnd.ms-printschematicket+xml +application/vnd.ms-project mpp mpt +# application/vnd.ms-tnef +# application/vnd.ms-windows.devicepairing +# application/vnd.ms-windows.nwprinting.oob +# application/vnd.ms-windows.printerpairing +# application/vnd.ms-windows.wsd.oob +# application/vnd.ms-wmdrm.lic-chlg-req +# application/vnd.ms-wmdrm.lic-resp +# application/vnd.ms-wmdrm.meter-chlg-req +# application/vnd.ms-wmdrm.meter-resp +application/vnd.ms-word.document.macroenabled.12 docm +application/vnd.ms-word.template.macroenabled.12 dotm +application/vnd.ms-works wps wks wcm wdb +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +# application/vnd.msa-disk-image +application/vnd.mseq mseq +# application/vnd.msign +# application/vnd.multiad.creator +# application/vnd.multiad.creator.cif +# application/vnd.music-niff +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.mynfc taglet +# application/vnd.ncd.control +# application/vnd.ncd.reference +# application/vnd.nervana +# application/vnd.netfpx +application/vnd.neurolanguage.nlu nlu +# application/vnd.nintendo.nitro.rom +# application/vnd.nintendo.snes.rom +application/vnd.nitf ntf nitf +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +# application/vnd.nokia.catalogs +# application/vnd.nokia.conml+wbxml +# application/vnd.nokia.conml+xml +# application/vnd.nokia.iptv.config+xml +# application/vnd.nokia.isds-radio-presets +# application/vnd.nokia.landmark+wbxml +# application/vnd.nokia.landmark+xml +# application/vnd.nokia.landmarkcollection+xml +# application/vnd.nokia.n-gage.ac+xml +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +# application/vnd.nokia.ncd +# application/vnd.nokia.pcd+wbxml +# application/vnd.nokia.pcd+xml +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.edm edm +application/vnd.novadigm.edx edx +application/vnd.novadigm.ext ext +# application/vnd.ntt-local.content-share +# application/vnd.ntt-local.file-transfer +# application/vnd.ntt-local.ogw_remote-access +# application/vnd.ntt-local.sip-ta_remote +# application/vnd.ntt-local.sip-ta_tcp_stream +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template odft +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +# application/vnd.obn +# application/vnd.oftn.l10n+json +# application/vnd.oipf.contentaccessdownload+xml +# application/vnd.oipf.contentaccessstreaming+xml +# application/vnd.oipf.cspg-hexbinary +# application/vnd.oipf.dae.svg+xml +# application/vnd.oipf.dae.xhtml+xml +# application/vnd.oipf.mippvcontrolmessage+xml +# application/vnd.oipf.pae.gem +# application/vnd.oipf.spdiscovery+xml +# application/vnd.oipf.spdlist+xml +# application/vnd.oipf.ueprofile+xml +# application/vnd.oipf.userprofile+xml +application/vnd.olpc-sugar xo +# application/vnd.oma-scws-config +# application/vnd.oma-scws-http-request +# application/vnd.oma-scws-http-response +# application/vnd.oma.bcast.associated-procedure-parameter+xml +# application/vnd.oma.bcast.drm-trigger+xml +# application/vnd.oma.bcast.imd+xml +# application/vnd.oma.bcast.ltkm +# application/vnd.oma.bcast.notification+xml +# application/vnd.oma.bcast.provisioningtrigger +# application/vnd.oma.bcast.sgboot +# application/vnd.oma.bcast.sgdd+xml +# application/vnd.oma.bcast.sgdu +# application/vnd.oma.bcast.simple-symbol-container +# application/vnd.oma.bcast.smartcard-trigger+xml +# application/vnd.oma.bcast.sprov+xml +# application/vnd.oma.bcast.stkm +# application/vnd.oma.cab-address-book+xml +# application/vnd.oma.cab-feature-handler+xml +# application/vnd.oma.cab-pcc+xml +# application/vnd.oma.cab-subs-invite+xml +# application/vnd.oma.cab-user-prefs+xml +# application/vnd.oma.dcd +# application/vnd.oma.dcdc +application/vnd.oma.dd2+xml dd2 +# application/vnd.oma.drm.risd+xml +# application/vnd.oma.group-usage-list+xml +# application/vnd.oma.lwm2m+json +# application/vnd.oma.lwm2m+tlv +# application/vnd.oma.pal+xml +# application/vnd.oma.poc.detailed-progress-report+xml +# application/vnd.oma.poc.final-report+xml +# application/vnd.oma.poc.groups+xml +# application/vnd.oma.poc.invocation-descriptor+xml +# application/vnd.oma.poc.optimized-progress-report+xml +# application/vnd.oma.push +# application/vnd.oma.scidm.messages+xml +# application/vnd.oma.xcap-directory+xml +# application/vnd.omads-email+xml +# application/vnd.omads-file+xml +# application/vnd.omads-folder+xml +# application/vnd.omaloc-supl-init +# application/vnd.onepager +# application/vnd.openblox.game+xml +# application/vnd.openblox.game-binary +# application/vnd.openeye.oeb +application/vnd.openofficeorg.extension oxt +# application/vnd.openxmlformats-officedocument.custom-properties+xml +# application/vnd.openxmlformats-officedocument.customxmlproperties+xml +# application/vnd.openxmlformats-officedocument.drawing+xml +# application/vnd.openxmlformats-officedocument.drawingml.chart+xml +# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml +# application/vnd.openxmlformats-officedocument.extended-properties+xml +# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml +# application/vnd.openxmlformats-officedocument.presentationml.comments+xml +# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +# application/vnd.openxmlformats-officedocument.presentationml.slide+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml +# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml +# application/vnd.openxmlformats-officedocument.presentationml.tags+xml +application/vnd.openxmlformats-officedocument.presentationml.template potx +# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml +# application/vnd.openxmlformats-officedocument.theme+xml +# application/vnd.openxmlformats-officedocument.themeoverride+xml +# application/vnd.openxmlformats-officedocument.vmldrawing +# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml +# application/vnd.openxmlformats-package.core-properties+xml +# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml +# application/vnd.openxmlformats-package.relationships+xml +# application/vnd.oracle.resource+json +# application/vnd.orange.indata +# application/vnd.osa.netdeploy +application/vnd.osgeo.mapguide.package mgp +# application/vnd.osgi.bundle +application/vnd.osgi.dp dp +application/vnd.osgi.subsystem esa +# application/vnd.otps.ct-kip+xml +# application/vnd.oxli.countgraph +# application/vnd.pagerduty+json +application/vnd.palm pdb pqa oprc +# application/vnd.panoply +# application/vnd.paos.xml +application/vnd.pawaafile paw +# application/vnd.pcos +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +# application/vnd.piaccess.application-licence +application/vnd.picsel efif +application/vnd.pmi.widget wg +# application/vnd.poc.group-advertisement+xml +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +# application/vnd.powerbuilder6-s +# application/vnd.powerbuilder7 +# application/vnd.powerbuilder7-s +# application/vnd.powerbuilder75 +# application/vnd.powerbuilder75-s +# application/vnd.preminet +application/vnd.previewsystems.box box +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +application/vnd.pvi.ptid1 ptid +# application/vnd.pwg-multiplexed +# application/vnd.pwg-xhtml-print+xml +# application/vnd.qualcomm.brew-app-res +# application/vnd.quarantainenet +application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb +# application/vnd.quobject-quoxdocument +# application/vnd.radisys.moml+xml +# application/vnd.radisys.msml+xml +# application/vnd.radisys.msml-audit+xml +# application/vnd.radisys.msml-audit-conf+xml +# application/vnd.radisys.msml-audit-conn+xml +# application/vnd.radisys.msml-audit-dialog+xml +# application/vnd.radisys.msml-audit-stream+xml +# application/vnd.radisys.msml-conf+xml +# application/vnd.radisys.msml-dialog+xml +# application/vnd.radisys.msml-dialog-base+xml +# application/vnd.radisys.msml-dialog-fax-detect+xml +# application/vnd.radisys.msml-dialog-fax-sendrecv+xml +# application/vnd.radisys.msml-dialog-group+xml +# application/vnd.radisys.msml-dialog-speech+xml +# application/vnd.radisys.msml-dialog-transform+xml +# application/vnd.rainstor.data +# application/vnd.rapid +# application/vnd.rar +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +# application/vnd.renlearn.rlprint +application/vnd.rig.cryptonote cryptonote +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.rn-realmedia-vbr rmvb +application/vnd.route66.link66+xml link66 +# application/vnd.rs-274x +# application/vnd.ruckus.download +# application/vnd.s3sms +application/vnd.sailingtracker.track st +# application/vnd.sbm.cid +# application/vnd.sbm.mid2 +# application/vnd.scribus +# application/vnd.sealed.3df +# application/vnd.sealed.csf +# application/vnd.sealed.doc +# application/vnd.sealed.eml +# application/vnd.sealed.mht +# application/vnd.sealed.net +# application/vnd.sealed.ppt +# application/vnd.sealed.tiff +# application/vnd.sealed.xls +# application/vnd.sealedmedia.softseal.html +# application/vnd.sealedmedia.softseal.pdf +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.simtech-mindmapper twd twds +# application/vnd.siren+json +application/vnd.smaf mmf +# application/vnd.smart.notebook +application/vnd.smart.teacher teacher +# application/vnd.software602.filler.form+xml +# application/vnd.software602.filler.form-xml-zip +application/vnd.solent.sdkm+xml sdkm sdkd +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +# application/vnd.sss-cod +# application/vnd.sss-dtf +# application/vnd.sss-ntf +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd +application/vnd.stardivision.math smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.stepmania.package smzip +application/vnd.stepmania.stepchart sm +# application/vnd.street-stream +# application/vnd.sun.wadl+xml +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +application/vnd.sus-calendar sus susp +application/vnd.svd svd +# application/vnd.swiftview-ics +application/vnd.symbian.install sis sisx +application/vnd.syncml+xml xsm +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +# application/vnd.syncml.dm.notification +# application/vnd.syncml.dmddf+wbxml +# application/vnd.syncml.dmddf+xml +# application/vnd.syncml.dmtnds+wbxml +# application/vnd.syncml.dmtnds+xml +# application/vnd.syncml.ds.notification +application/vnd.tao.intent-module-archive tao +application/vnd.tcpdump.pcap pcap cap dmp +# application/vnd.tmd.mediaflex.api+xml +# application/vnd.tml +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +# application/vnd.truedoc +# application/vnd.ubisoft.webplayer +application/vnd.ufdl ufd ufdl +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml +# application/vnd.uplanet.alert +# application/vnd.uplanet.alert-wbxml +# application/vnd.uplanet.bearer-choice +# application/vnd.uplanet.bearer-choice-wbxml +# application/vnd.uplanet.cacheop +# application/vnd.uplanet.cacheop-wbxml +# application/vnd.uplanet.channel +# application/vnd.uplanet.channel-wbxml +# application/vnd.uplanet.list +# application/vnd.uplanet.list-wbxml +# application/vnd.uplanet.listcmd +# application/vnd.uplanet.listcmd-wbxml +# application/vnd.uplanet.signal +# application/vnd.uri-map +# application/vnd.valve.source.material +application/vnd.vcx vcx +# application/vnd.vd-study +# application/vnd.vectorworks +# application/vnd.vel+json +# application/vnd.verimatrix.vcas +# application/vnd.vidsoft.vidconference +application/vnd.visio vsd vst vss vsw +application/vnd.visionary vis +# application/vnd.vividence.scriptfile +application/vnd.vsf vsf +# application/vnd.wap.sic +# application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +# application/vnd.wfa.p2p +# application/vnd.wfa.wsc +# application/vnd.windows.devicepairing +# application/vnd.wmc +# application/vnd.wmf.bootstrap +# application/vnd.wolfram.mathematica +# application/vnd.wolfram.mathematica.package +application/vnd.wolfram.player nbp +application/vnd.wordperfect wpd +application/vnd.wqd wqd +# application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf stf +# application/vnd.wv.csp+wbxml +# application/vnd.wv.csp+xml +# application/vnd.wv.ssp+xml +# application/vnd.xacml+json +application/vnd.xara xar +application/vnd.xfdl xfdl +# application/vnd.xfdl.webform +# application/vnd.xmi+xml +# application/vnd.xmpie.cpkg +# application/vnd.xmpie.dpkg +# application/vnd.xmpie.plan +# application/vnd.xmpie.ppkg +# application/vnd.xmpie.xlim +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg +# application/vnd.yamaha.remote-setup +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +# application/vnd.yamaha.through-ngn +# application/vnd.yamaha.tunnel-udpencap +# application/vnd.yaoweme +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +# application/vq-rtcpxr +application/wasm wasm +# application/watcherinfo+xml +# application/whoispp-query +# application/whoispp-response +application/widget wgt +application/winhlp hlp +# application/wita +# application/wordperfect5.1 +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-7z-compressed 7z +application/x-abiword abw +application/x-ace-compressed ace +# application/x-amf +application/x-apple-diskimage dmg +application/x-authorware-bin aab x32 u32 vox +application/x-authorware-map aam +application/x-authorware-seg aas +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-blorb blb blorb +application/x-bzip bz +application/x-bzip2 bz2 boz +application/x-cbr cbr cba cbt cbz cb7 +application/x-cdlink vcd +application/x-cfs-compressed cfs +application/x-chat chat +application/x-chess-pgn pgn +# application/x-compress +application/x-conference nsc +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb udeb +application/x-dgc-compressed dgc +application/x-director dir dcr dxr cst cct cxt w3d fgd swa +application/x-doom wad +application/x-dtbncx+xml ncx +application/x-dtbook+xml dtb +application/x-dtbresource+xml res +application/x-dvi dvi +application/x-envoy evy +application/x-eva eva +application/x-font-bdf bdf +# application/x-font-dos +# application/x-font-framemaker +application/x-font-ghostscript gsf +# application/x-font-libgrx +application/x-font-linux-psf psf +application/x-font-pcf pcf +application/x-font-snf snf +# application/x-font-speedo +# application/x-font-sunos-news +application/x-font-type1 pfa pfb pfm afm +# application/x-font-vfont +application/x-freearc arc +application/x-futuresplash spl +application/x-gca-compressed gca +application/x-glulx ulx +application/x-gnumeric gnumeric +application/x-gramps-xml gramps +application/x-gtar gtar +# application/x-gzip +application/x-hdf hdf +application/x-install-instructions install +application/x-iso9660-image iso +application/x-java-jnlp-file jnlp +application/x-latex latex +application/x-lzh-compressed lzh lha +application/x-mie mie +application/x-mobipocket-ebook prc mobi +application/x-ms-application application +application/x-ms-shortcut lnk +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-ms-xbap xbap +application/x-msaccess mdb +application/x-msbinder obd +application/x-mscardfile crd +application/x-msclip clp +application/x-msdownload exe dll com bat msi +application/x-msmediaview mvb m13 m14 +application/x-msmetafile wmf wmz emf emz +application/x-msmoney mny +application/x-mspublisher pub +application/x-msschedule scd +application/x-msterminal trm +application/x-mswrite wri +application/x-netcdf nc cdf +application/x-nzb nzb +application/x-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-rar-compressed rar +application/x-research-info-systems ris +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-silverlight-app xap +application/x-sql sql +application/x-stuffit sit +application/x-stuffitx sitx +application/x-subrip srt +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-t3vm-image t3 +application/x-tads gam +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-tex-tfm tfm +application/x-texinfo texinfo texi +application/x-tgif obj +application/x-ustar ustar +application/x-wais-source src +# application/x-www-form-urlencoded +application/x-x509-ca-cert der crt +application/x-xfig fig +application/x-xliff+xml xlf +application/x-xpinstall xpi +application/x-xz xz +application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 +# application/x400-bp +# application/xacml+xml +application/xaml+xml xaml +# application/xcap-att+xml +# application/xcap-caps+xml +application/xcap-diff+xml xdf +# application/xcap-el+xml +# application/xcap-error+xml +# application/xcap-ns+xml +# application/xcon-conference-info+xml +# application/xcon-conference-info-diff+xml +application/xenc+xml xenc +application/xhtml+xml xhtml xht +# application/xhtml-voice+xml +application/xml xml xsl +application/xml-dtd dtd +# application/xml-external-parsed-entity +# application/xml-patch+xml +# application/xmpp+xml +application/xop+xml xop +application/xproc+xml xpl +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvml xvm +application/yang yang +application/yin+xml yin +application/zip zip +# application/zlib +# audio/1d-interleaved-parityfec +# audio/32kadpcm +# audio/3gpp +# audio/3gpp2 +# audio/ac3 +audio/adpcm adp +# audio/amr +# audio/amr-wb +# audio/amr-wb+ +# audio/aptx +# audio/asc +# audio/atrac-advanced-lossless +# audio/atrac-x +# audio/atrac3 +audio/basic au snd +# audio/bv16 +# audio/bv32 +# audio/clearmode +# audio/cn +# audio/dat12 +# audio/dls +# audio/dsr-es201108 +# audio/dsr-es202050 +# audio/dsr-es202211 +# audio/dsr-es202212 +# audio/dv +# audio/dvi4 +# audio/eac3 +# audio/encaprtp +# audio/evrc +# audio/evrc-qcp +# audio/evrc0 +# audio/evrc1 +# audio/evrcb +# audio/evrcb0 +# audio/evrcb1 +# audio/evrcnw +# audio/evrcnw0 +# audio/evrcnw1 +# audio/evrcwb +# audio/evrcwb0 +# audio/evrcwb1 +# audio/evs +# audio/example +# audio/fwdred +# audio/g711-0 +# audio/g719 +# audio/g722 +# audio/g7221 +# audio/g723 +# audio/g726-16 +# audio/g726-24 +# audio/g726-32 +# audio/g726-40 +# audio/g728 +# audio/g729 +# audio/g7291 +# audio/g729d +# audio/g729e +# audio/gsm +# audio/gsm-efr +# audio/gsm-hr-08 +# audio/ilbc +# audio/ip-mr_v2.5 +# audio/isac +# audio/l16 +# audio/l20 +# audio/l24 +# audio/l8 +# audio/lpc +audio/midi mid midi kar rmi +# audio/mobile-xmf +audio/mp4 m4a mp4a +# audio/mp4a-latm +# audio/mpa +# audio/mpa-robust +audio/mpeg mpga mp2 mp2a mp3 m2a m3a +# audio/mpeg4-generic +# audio/musepack +audio/ogg oga ogg spx opus +# audio/opus +# audio/parityfec +# audio/pcma +# audio/pcma-wb +# audio/pcmu +# audio/pcmu-wb +# audio/prs.sid +# audio/qcelp +# audio/raptorfec +# audio/red +# audio/rtp-enc-aescm128 +# audio/rtp-midi +# audio/rtploopback +# audio/rtx +audio/s3m s3m +audio/silk sil +# audio/smv +# audio/smv-qcp +# audio/smv0 +# audio/sp-midi +# audio/speex +# audio/t140c +# audio/t38 +# audio/telephone-event +# audio/tone +# audio/uemclip +# audio/ulpfec +# audio/vdvi +# audio/vmr-wb +# audio/vnd.3gpp.iufp +# audio/vnd.4sb +# audio/vnd.audiokoz +# audio/vnd.celp +# audio/vnd.cisco.nse +# audio/vnd.cmles.radio-events +# audio/vnd.cns.anp1 +# audio/vnd.cns.inf1 +audio/vnd.dece.audio uva uvva +audio/vnd.digital-winds eol +# audio/vnd.dlna.adts +# audio/vnd.dolby.heaac.1 +# audio/vnd.dolby.heaac.2 +# audio/vnd.dolby.mlp +# audio/vnd.dolby.mps +# audio/vnd.dolby.pl2 +# audio/vnd.dolby.pl2x +# audio/vnd.dolby.pl2z +# audio/vnd.dolby.pulse.1 +audio/vnd.dra dra +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +# audio/vnd.dvb.file +# audio/vnd.everad.plj +# audio/vnd.hns.audio +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +# audio/vnd.nokia.mobile-xmf +# audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +# audio/vnd.octel.sbc +# audio/vnd.qcelp +# audio/vnd.rhetorex.32kadpcm +audio/vnd.rip rip +# audio/vnd.sealedmedia.softseal.mpeg +# audio/vnd.vmx.cvsd +# audio/vorbis +# audio/vorbis-config +audio/webm weba +audio/x-aac aac +audio/x-aiff aif aiff aifc +audio/x-caf caf +audio/x-flac flac +audio/x-matroska mka +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin rmp +# audio/x-tta +audio/x-wav wav +audio/xm xm +chemical/x-cdx cdx +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-csml csml +# chemical/x-pdb +chemical/x-xyz xyz +font/collection ttc +font/otf otf +# font/sfnt +font/ttf ttf +font/woff woff +font/woff2 woff2 +image/avif avif +image/bmp bmp +image/cgm cgm +# image/dicom-rle +# image/emf +# image/example +# image/fits +image/g3fax g3 +image/gif gif +image/ief ief +# image/jls +# image/jp2 +image/jpeg jpeg jpg jpe +# image/jpm +# image/jpx +image/jxl jxl +image/ktx ktx +# image/naplps +image/png png +image/prs.btif btif +# image/prs.pti +# image/pwg-raster +image/sgi sgi +image/svg+xml svg svgz +# image/t38 +image/tiff tiff tif +# image/tiff-fx +image/vnd.adobe.photoshop psd +# image/vnd.airzip.accelerator.azv +# image/vnd.cns.inf2 +image/vnd.dece.graphic uvi uvvi uvg uvvg +image/vnd.djvu djvu djv +image/vnd.dvb.subtitle sub +image/vnd.dwg dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +# image/vnd.globalgraphics.pgb +# image/vnd.microsoft.icon +# image/vnd.mix +# image/vnd.mozilla.apng +image/vnd.ms-modi mdi +image/vnd.ms-photo wdp +image/vnd.net-fpx npx +# image/vnd.radiance +# image/vnd.sealed.png +# image/vnd.sealedmedia.softseal.gif +# image/vnd.sealedmedia.softseal.jpg +# image/vnd.svf +# image/vnd.tencent.tap +# image/vnd.valve.source.texture +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +# image/vnd.zbrush.pcx +image/webp webp +# image/wmf +image/x-3ds 3ds +image/x-cmu-raster ras +image/x-cmx cmx +image/x-freehand fh fhc fh4 fh5 fh7 +image/x-icon ico +image/x-mrsid-image sid +image/x-pcx pcx +image/x-pict pic pct +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-tga tga +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +# message/cpim +# message/delivery-status +# message/disposition-notification +# message/example +# message/external-body +# message/feedback-report +# message/global +# message/global-delivery-status +# message/global-disposition-notification +# message/global-headers +# message/http +# message/imdn+xml +# message/news +# message/partial +message/rfc822 eml mime +# message/s-http +# message/sip +# message/sipfrag +# message/tracking-status +# message/vnd.si.simp +# message/vnd.wfa.wsc +# model/example +# model/gltf+json +model/iges igs iges +model/mesh msh mesh silo +model/vnd.collada+xml dae +model/vnd.dwf dwf +# model/vnd.flatland.3dml +model/vnd.gdl gdl +# model/vnd.gs-gdl +# model/vnd.gs.gdl +model/vnd.gtw gtw +# model/vnd.moml+xml +# model/vnd.mts +# model/vnd.opengex +# model/vnd.parasolid.transmit.binary +# model/vnd.parasolid.transmit.text +# model/vnd.rosette.annotated-data-model +# model/vnd.valve.source.compiled-map +model/vnd.vtu vtu +model/vrml wrl vrml +model/x3d+binary x3db x3dbz +# model/x3d+fastinfoset +model/x3d+vrml x3dv x3dvz +model/x3d+xml x3d x3dz +# model/x3d-vrml +# multipart/alternative +# multipart/appledouble +# multipart/byteranges +# multipart/digest +# multipart/encrypted +# multipart/example +# multipart/form-data +# multipart/header-set +# multipart/mixed +# multipart/parallel +# multipart/related +# multipart/report +# multipart/signed +# multipart/voice-message +# multipart/x-mixed-replace +# text/1d-interleaved-parityfec +text/cache-manifest appcache +text/calendar ics ifb +text/css css +text/csv csv +# text/csv-schema +# text/directory +# text/dns +# text/ecmascript +# text/encaprtp +# text/enriched +# text/example +# text/fwdred +# text/grammar-ref-list +text/html html htm +text/javascript js mjs +# text/jcr-cnd +# text/markdown +# text/mizar +text/n3 n3 +# text/parameters +# text/parityfec +text/plain txt text conf def list log in +# text/provenance-notation +# text/prs.fallenstein.rst +text/prs.lines.tag dsc +# text/prs.prop.logic +# text/raptorfec +# text/red +# text/rfc822-headers +text/richtext rtx +# text/rtf +# text/rtp-enc-aescm128 +# text/rtploopback +# text/rtx +text/sgml sgml sgm +# text/t140 +text/tab-separated-values tsv +text/troff t tr roff man me ms +text/turtle ttl +# text/ulpfec +text/uri-list uri uris urls +text/vcard vcard +# text/vnd.a +# text/vnd.abc +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.mcurl mcurl +text/vnd.curl.scurl scurl +# text/vnd.debian.copyright +# text/vnd.dmclientscript +text/vnd.dvb.subtitle sub +# text/vnd.esmertec.theme-descriptor +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv +text/vnd.in3d.3dml 3dml +text/vnd.in3d.spot spot +# text/vnd.iptc.newsml +# text/vnd.iptc.nitf +# text/vnd.latex-z +# text/vnd.motorola.reflex +# text/vnd.ms-mediapackage +# text/vnd.net2phone.commcenter.command +# text/vnd.radisys.msml-basic-layout +# text/vnd.si.uricatalogue +text/vnd.sun.j2me.app-descriptor jad +# text/vnd.trolltech.linguist +# text/vnd.wap.si +# text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-asm s asm +text/x-c c cc cxx cpp h hh dic +text/x-fortran f for f77 f90 +text/x-java-source java +text/x-nfo nfo +text/x-opml opml +text/x-pascal p pas +text/x-setext etx +text/x-sfv sfv +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +# text/xml +# text/xml-external-parsed-entity +# video/1d-interleaved-parityfec +video/3gpp 3gp +# video/3gpp-tt +video/3gpp2 3g2 +# video/bmpeg +# video/bt656 +# video/celb +# video/dv +# video/encaprtp +# video/example +video/h261 h261 +video/h263 h263 +# video/h263-1998 +# video/h263-2000 +video/h264 h264 +# video/h264-rcdo +# video/h264-svc +# video/h265 +# video/iso.segment +video/jpeg jpgv +# video/jpeg2000 +video/jpm jpm jpgm +video/mj2 mj2 mjp2 +# video/mp1s +# video/mp2p +video/mp2t ts m2t m2ts mts +video/mp4 mp4 mp4v mpg4 +# video/mp4v-es +video/mpeg mpeg mpg mpe m1v m2v +# video/mpeg4-generic +# video/mpv +# video/nv +video/ogg ogv +# video/parityfec +# video/pointer +video/quicktime qt mov +# video/raptorfec +# video/raw +# video/rtp-enc-aescm128 +# video/rtploopback +# video/rtx +# video/smpte292m +# video/ulpfec +# video/vc1 +# video/vnd.cctv +video/vnd.dece.hd uvh uvvh +video/vnd.dece.mobile uvm uvvm +# video/vnd.dece.mp4 +video/vnd.dece.pd uvp uvvp +video/vnd.dece.sd uvs uvvs +video/vnd.dece.video uvv uvvv +# video/vnd.directv.mpeg +# video/vnd.directv.mpeg-tts +# video/vnd.dlna.mpeg-tts +video/vnd.dvb.file dvb +video/vnd.fvt fvt +# video/vnd.hns.video +# video/vnd.iptvforum.1dparityfec-1010 +# video/vnd.iptvforum.1dparityfec-2005 +# video/vnd.iptvforum.2dparityfec-1010 +# video/vnd.iptvforum.2dparityfec-2005 +# video/vnd.iptvforum.ttsavc +# video/vnd.iptvforum.ttsmpeg2 +# video/vnd.motorola.video +# video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.ms-playready.media.pyv pyv +# video/vnd.nokia.interleaved-multimedia +# video/vnd.nokia.videovoip +# video/vnd.objectvideo +# video/vnd.radgamettools.bink +# video/vnd.radgamettools.smacker +# video/vnd.sealed.mpeg1 +# video/vnd.sealed.mpeg4 +# video/vnd.sealed.swf +# video/vnd.sealedmedia.softseal.mov +video/vnd.uvvu.mp4 uvu uvvu +video/vnd.vivo viv +# video/vp8 +video/webm webm +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-m4v m4v +video/x-matroska mkv mk3d mks +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-vob vob +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +video/x-smv smv +x-conference/x-cooltalk ice diff --git a/docs/docroot/index.html b/docs/docroot/index.html new file mode 100644 index 0000000..f5f1c37 --- /dev/null +++ b/docs/docroot/index.html @@ -0,0 +1 @@ +

    It works!

    diff --git a/docs/doxygen.conf b/docs/doxygen.conf new file mode 100644 index 0000000..dad045a --- /dev/null +++ b/docs/doxygen.conf @@ -0,0 +1,74 @@ +PROJECT_NAME=Apache2 + +# make the generated documentation searchable +SEARCHENGINE=YES +INPUT=. +RECURSIVE=YES +FILE_PATTERNS=*.h + +OUTPUT_DIRECTORY=docs/dox + +#EXTRACT_STATIC=YES +EXTRACT_ALL=YES + +# add documentation for functions that are declared internal use only +INTERNAL_DOCS=YES +HAVE_DOT=YES +CLASS_GRAPH=YES + + +ENABLE_PREPROCESSING=YES +MACRO_EXPANSION=YES +QUIET=YES +EXPAND_ONLY_PREDEF=YES +#EXPAND_AS_DEFINED= +# not sure why this doesn't work as EXPAND_AS_DEFINED, it should! +PREDEFINED="APR_DECLARE(x)=x" \ + "APR_DECLARE_NONSTD(x)=x" \ + "AP_DECLARE_HOOK(ret,name,args)=ret name args;" \ + "APR_DECLARE_OPTIONAL_FN(ret,name,args)=ret name args;" \ + "APR_DECLARE_EXTERNAL_HOOK(ns,link,ret,name,args)= ret ns##_hook_##name args;" \ + "AP_DECLARE(x)=x" \ + "AP_DECLARE_NONSTD(x)=x" \ + AP_CORE_DECLARE(x)=x \ + "AP_CORE_DECLARE_NONSTD(x)=x" \ + "APR_HAS_THREADS" \ + "APR_HAS_MMAP" \ + APR_HAS_INLINE \ + APR_HAS_FLOCK_SERIALIZE \ + APR_HAS_SYSVSEM_SERIALIZE \ + APR_HAS_POSIXSEM_SERIALIZE \ + APR_HAS_FCNTL_SERIALIZE \ + APR_HAS_PROC_PTHREAD_SERIALIZE \ + APR_HAS_RWLOCK_SERIALIZE \ + APR_HAS_SHARED_MEMORY \ + APR_HAS_SENDFILE \ + APR_HAS_FORK \ + APR_HAS_RANDOM \ + APR_HAS_XLATE \ + APR_HAS_OTHER_CHILD \ + APR_HAS_DSO \ + APR_HAS_SO_ACCEPTFILTER \ + APR_HAS_UNICODE_FS \ + APR_HAS_PROC_INVOKED \ + APR_HAS_USER \ + APR_HAS_LARGE_FILES \ + APR_HAS_XTHREAD_FILES \ + DOXYGEN= \ + APU_DECLARE_DATA= \ + __pre_nw__= \ + "APU_DECLARE(x)=x" \ + "CACHE_DECLARE(x)=x" \ + "PROXY_DECLARE(x)=x" + + +OPTIMIZE_OUTPUT_FOR_C=YES + +GENERATE_TREEVIEW=YES + +FULL_PATH_NAMES=YES +# some autoconf guru needs to make configure set this correctly... +#STRIP_FROM_PATH=/var/www/lxr/source + +#GENERATE_TAGFILE=docs/dox/httpd.tag +#TAGFILES=../apr/docs/dox/apr.tag=/apr ../apr-util/docs/dox/apu.tag=/apr-util diff --git a/docs/error/HTTP_BAD_GATEWAY.html.var b/docs/error/HTTP_BAD_GATEWAY.html.var new file mode 100644 index 0000000..2288037 --- /dev/null +++ b/docs/error/HTTP_BAD_GATEWAY.html.var @@ -0,0 +1,371 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Proxy server obdržel od nadÅ™azeného + serveru chybnou odpovÄ›Ä. + + + + + + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Der Proxy-Server erhielt eine fehlerhafte Antwort + eines übergeordneten Servers oder Proxies. + + + + + + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + The proxy server received an invalid + response from an upstream server. + + + + + + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + El servidor 'proxy' ha recibido; información + no válida del servidor de origen. + + + + + + + + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + Le serveur proxy a reçu une réponse + incorrecte de la part d'un serveur supérieur. + + + + + + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Fuair an seachfhreastalaí freagairt neamhbhailí + ó freastalaí thuasthrutha. + + + + + + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + Il server proxy ha ricevuto una risposta + non valida dal server precedente. + + + + + + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + プロクシサーãƒã¯ä¸Šæµã‚µãƒ¼ãƒã‹ã‚‰ä¸æ­£ãªå¿œç­”ã‚’å—ä¿¡ã—ã¾ã—ãŸã€‚ + + + + + + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + 프ë¡ì‹œ 서버가 ë” ìœ—ìª½ì˜ ì„œë²„ë¡œë¶€í„° ìž˜ëª»ëœ ì‘ë‹µì„ ë°›ì•˜ìŠµë‹ˆë‹¤. + + + + + + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + De proxy server heeft een ongeldig + antwoord ontvangen van een gecontacteerde server. + + + + + + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + Proxyserveren mottok et ugyldig svar fra + en oppstrøms server. + + + + + + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Serwer otrzymał nieprawidłową odpowiedź + od kolejnego serwera. + + + + + + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + O servidor proxy recebeu uma resposta + inválida do servidor destino. + + + + + + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + O servidor de proxy recebeu uma resposta + inválida de um outro servidor externo a ele. + + + + + + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + Serverul proxy a primit un raspuns invalid + de la serverul precedent. + + + + + + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + ПрокÑи-Ñервер получил недопуÑтимый ответ от + вышеÑтоÑщего Ñервера. + + + + + + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + ПоÑреднички Ñервер је примио неиÑправан + одговор од Ñледећег Ñервера у низу. + + + + + + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + Proxyservern mottog ett felaktigt svar från + en tidigare server. + + + + + + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + Vekil sunucu üstbirim sunucudan + anlamsız bir yanıt aldı. + + + + + + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + ä»£ç†æœåŠ¡å™¨ä»Žä¸Šæ¸¸æœåŠ¡å™¨æ”¶åˆ°äº†æ— æ•ˆçš„å“应。 + + + + + + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + 代ç†ä¼ºæœå™¨å¾žä¸ŠéŠä¼ºæœå™¨æ”¶åˆ°äº†ç„¡æ•ˆçš„響應。 + + + + + + + +----------zh-tw-- diff --git a/docs/error/HTTP_BAD_REQUEST.html.var b/docs/error/HTTP_BAD_REQUEST.html.var new file mode 100644 index 0000000..86cce54 --- /dev/null +++ b/docs/error/HTTP_BAD_REQUEST.html.var @@ -0,0 +1,266 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Váš prohlížeÄ (nebo proxy server) vyslal požadavek, + kterému tento server nerozumÄ›l. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Ihr Browser (oder Proxy) hat eine ungültige Anfrage + gesendet, die vom Server nicht beantwortet werden kann. + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + Your browser (or proxy) sent a request that + this server could not understand. + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + Su navegador (o 'proxy') ha enviado una petición + que el servidor no ha podido entender. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + Votre navigateur (ou votre proxy) a envoyé + une demande que ce serveur n'a pas comprise. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Seol do chuid brabhsálaí (nó + seachfhreastalaí) freagairt nárbh fhéidir leis an + fhreastalaí seo a thuisceant. + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + Il tuo browser (o il proxy) ha inviato a + questo server una richiesta incomprensibile. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + ãŠä½¿ã„ã®ãƒ–ラウザ (ã¾ãŸã¯ãƒ—ロクシ) + ãŒã€ã‚µãƒ¼ãƒã®ç†è§£ã§ããªã„リクエストをé€ä¿¡ã—ã¾ã—ãŸã€‚ + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + 브ë¼ìš°ì € ë˜ëŠ” 프ë¡ì‹œê°€ + ì´ ì„œë²„ê°€ 처리할 수 없는 ìž˜ëª»ëœ ìš”ì²­ì„ ë³´ëƒˆìŠµë‹ˆë‹¤. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + Uw browser (of proxy) stuurde een vraag die + deze server niet kon begrijpen. + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + Din nettleser eller proxy sendte en forespørsel + som denne serveren ikke kunne forstÃ¥. + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Twoja przeglądarka (lub serwer pośredniczący) wysłał żądanie, + którego ten serwer nie potrafi obsłużyć. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + Seu "browser" (ou o servidor proxy) enviou uma + requisição inválida ao servidor. + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + O seu browser ou proxy enviou + um pedido que este servidor não compreendeu. + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + Browserul (sau proxy-ul) dumneavoastra a trimis + serverului o cerere ce nu poate fi procesata. + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + ЗапроÑ, поÑланный Вашим браузером (или прокÑи-Ñервером), + Ñодержит ошибку и не может быть обработан. + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + Ваш читач (или поÑреднички Ñервер) поÑлао је захтев који + овај Ñервер није могао да разуме. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + Din webbläsare eller proxy skickade en förfrågan + som denna server inte kunde förstå. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + Tarayıcınız (veya vekil sunucunuz) bu sunucunun + anlayamadığı bir istekte bulundu. + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + 您的æµè§ˆå™¨ï¼ˆæˆ–代ç†ï¼‰å‘é€äº†ä¸€ä¸ªæœåŠ¡å™¨æ— æ³•è§£æžçš„请求。 + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + 您的ç€è¦½å™¨ï¼ˆæˆ–代ç†ï¼‰ç™¼é€äº†ä¸€å€‹ä¼ºæœå™¨ç„¡æ³•è§£æžçš„請求。 + + +----------zh-tw-- diff --git a/docs/error/HTTP_FORBIDDEN.html.var b/docs/error/HTTP_FORBIDDEN.html.var new file mode 100644 index 0000000..a8a8d7d --- /dev/null +++ b/docs/error/HTTP_FORBIDDEN.html.var @@ -0,0 +1,476 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + + + Nemáte právo pro přístup do požadovaného adresáře. BuÄ neexistuje žádný + dokument s obsahem (tzv. index), nebo je adresář chránÄ›n proti Ätení. + + + + Nemáte právo pro přístup k požadovanému objektu. + BuÄ je chránÄ›n proti Ätení, nebo není serverem Äitelný. + + + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + + + Der Zugriff auf das angeforderte Verzeichnis ist nicht möglich. + Entweder ist kein Index-Dokument vorhanden oder das Verzeichnis + ist zugriffsgeschützt. + + + + Der Zugriff auf das angeforderte Objekt ist nicht möglich. + Entweder kann es vom Server nicht gelesen werden oder es + ist zugriffsgeschützt. + + + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + + + You don't have permission to access the requested directory. + There is either no index document or the directory is read-protected. + + + + You don't have permission to access the requested object. + It is either read-protected or not readable by the server. + + + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + + + Usted no tiene permiso para acceder al directorio solicitado. + No existe un documento índice, o el directorio está + protegido contra lectura. + + + + Usted no tiene permiso para acceder al objeto solicitado. + El objeto está protegido contra lectura o + el servidor no puede leerlo. + + + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + + + Vous n'avez pas le droit d'accéder au répertoire + demandé. Soit il n'y a pas de document index soit le répertoire + est protégé. + + + + Vous n'avez pas le droit d'accéder à l'objet + demandé. Soit celui-ci est protégé, soit il ne peut + être lu par le serveur. + + + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + + + Níl cead agat rochtain a dhéanamh ar an comhadlann faoi + iarratais. Is féidir nach bhfuil aon doiciméad + innéacs, nó go bhfuil cosaint ar lémh an comhadlann. + + + + Níl cead agat rochtain a dhéanamh ar an aidhm faoi iarratais. + Is féidir go bhfuil cosaint ar lé air, nó go bhfuil + sé doléite don freastalaí. + + + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + + + Non disponi dei permessi necessari per accedere alla + directory richiesta oppure non esiste il documento indice. + + + + Non disponi dei permessi necessari per accedere all'oggetto + richiesto, oppure l'oggetto non può essere letto dal server. + + + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + + + è¦æ±‚ã•れãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ãŒã‚りã¾ã›ã‚“。 + インデックスドキュメントãŒå­˜åœ¨ã—ãªã„ã‹ã€ + ディレクトリã®èª­ã¿è¾¼ã¿ãŒè¨±å¯ã•れã¦ã„ã¾ã›ã‚“。 + + + + è¦æ±‚ã•れãŸã‚ªãƒ–ジェクトã¸ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©ãŒã‚りã¾ã›ã‚“。 + 読ã¿è¾¼ã¿ãŒè¨±å¯ã•れã¦ã„ãªã„ã‹ã€ + サーãƒãŒèª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ãŸã‹ã§ã—ょã†ã€‚ + + + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + + + 요청한 ë””ë ‰í† ë¦¬ì— ì ‘ê·¼í•  수 있는 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤. + ë””ë ‰í† ë¦¬ì— ì²« 페ì´ì§€ê°€ 없거나 아니면 ì½ê¸° 보호가 ë˜ì–´ 있습니다. + + + + 요청한 ê°ì²´ì— 접근할 수 있는 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤. + ì½ê¸° 보호가 ë˜ì–´ 있거나 웹서버가 ì½ì„ 수 ì—†ë„ë¡ ë˜ì–´ 있습니다. + + + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + + + U hebt niet de toestemming om toegang te krijgen tot de gevraagde map. + Er is of wel geen index document of de map is beveiligd tegen lezen. + + + + U hebt niet de toestemming om toegang te krijgen tot de gevraagde map. + Die is ofwel beveiligd tegen lezen of onleesbaar door de server. + + + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + + + Du har ikke tilstrekkelige rettigheter for Ã¥ fÃ¥ tilgang til den + ønskede katalogen. Det eksisterer ikke et indeksdokument, eller + katalogen er lesebeskyttet. + + + + Du har ikke tilstrekkelige rettigheter for Ã¥ fÃ¥ adgang til det + ønskede dokumentet. Objektet er lesebeskyttet, eller ikke lesbart + for serveren. + + + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + + + Nie masz prawa dostępu do żądanego katalogu. W katalogu nie + ma indeksu lub katalog jest zabezpieczony przed odczytem. + + + + Nie masz dostępu do żądanego obiektu. Jest on zabezpieczony + przed odczytem lub nie może być odczytany przez serwer. + + + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + + + Você não tem permissão para acessar o + diretório requisitado. + Pode não existir o arquivo de índice ou + o diretório pode estar protegido contra leitura. + + + + Você não tem permissão para acessar o + objeto requisitado. Ele pode estar protegido contra leitura ou + não ser legível pelo servidor. + + + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + + + Não tem permissão para aceder ao directório + que deseja. Ou não existe o documento de índice + ou o directório está protegido contra leitura. + + + + Não tem permissão para aceder ao objecto + que deseja. Este está protegido contra leitura ou + o servidor não o consegue ler. + + + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + + + Nu aveti permisiunea sa accesati directorul cerut. + Nu este nici un document index sau directorul este protejat la citire. + + + + Nu aveti permisiunea sa accesati obiectul cerut. + Este protejat la citire sau nu poate fi citit de server. + + + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + + + У Ð’Ð°Ñ Ð½ÐµÑ‚ прав доÑтупа к Ñтой директории. + ОтÑутÑтвует индекÑный файл, или Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупна Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ. + + + + У Ð’Ð°Ñ Ð½ÐµÑ‚ прав доÑтупа к Ñтому объекту. + Файл недоÑтупен Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ, или Ñервер не может его прочитать. + + + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + + + Ðемате дозволу да приÑтупите захтеваном директоријуму. + Могуће је да нема индекÑног документа, или да је директоријум заштићен од читања. + + + + Ðемате дозволу да приÑтупите захтеваном објекту. + Могуће је да је заштићен од читања, или да га Ñервер не може прочитати. + + + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + + + Du har inte tillräckliga rättigheter för att få + tillgång till den önskade katalogen. Det existerar inget + indexdokument eller så är katalogen lässkyddad. + + + + Du har inte tillräckliga rättigheter för att få + tillgång till det önskade objektet. Objektet är + lässkyddat eller inte läsbart för servern. + + + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + + + Talep ettiÄŸiniz dizine eriÅŸim izniniz yok. + Ya dizin içerik dosyası yok, ya da dizin okumaya karşı korumalı. + + + + Talep ettiÄŸiniz dizine eriÅŸim izniniz yok. + Dizin, ya okumaya karşı korumalı + ya da sunucu tarafından okunamıyor. + + + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + + + 您无æƒè®¿é—®æ‰€è¯·æ±‚的目录。 + 这是由于没有主页或该目录ä¸å…许被读å–导致的。 + + + + 您无æƒè®¿é—®æ‰€è¯·æ±‚的对象。 + 它å¯èƒ½ä¸å…è®¸è¢«è¯»å–æˆ–无法被æœåŠ¡å™¨è¯»å–。 + + + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + + + æ‚¨ç„¡æ¬Šè¨ªå•æ‰€è«‹æ±‚的目錄。 + é€™æ˜¯ç”±æ–¼æ²’æœ‰ä¸»é æˆ–該目錄ä¸å…許被讀å–導致的。 + + + + æ‚¨ç„¡æ¬Šè¨ªå•æ‰€è«‹æ±‚的物件。 + 它å¯èƒ½ä¸å…è¨±è¢«è®€å–æˆ–無法被伺æœå™¨è®€å–。 + + + + +----------zh-tw-- diff --git a/docs/error/HTTP_GONE.html.var b/docs/error/HTTP_GONE.html.var new file mode 100644 index 0000000..89f6689 --- /dev/null +++ b/docs/error/HTTP_GONE.html.var @@ -0,0 +1,534 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Požadované URL již není na tomto serveru k dispozici, ani není k dispozici + žádná adresa k pÅ™esmÄ›rování. + + + + Informujte, prosím, autora + ">odkazující + stránky, že odkaz je zastaralý. + + + + Pokud jste následovali odkaz z cizí stránky, kontaktujte, prosím, + jejího autora. + + + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Der angeforderte URL existiert auf dem Server nicht mehr + und wurde dauerhaft entfernt. + Eine Weiterleitungsadresse ist nicht verfügbar. + + + + Bitte informieren Sie den Autor der + ">verweisenden + Seite, dass der Link nicht mehr aktuell ist. + + + + Falls Sie einem Link von einer anderen Seite gefolgt sind, + informieren Sie bitte den Autor dieser Seite hierüber. + + + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + The requested URL is no longer available on this server and there is no + forwarding address. + + + + Please inform the author of the + ">referring + page that the link is outdated. + + + + If you followed a link from a foreign page, please contact the + author of this page. + + + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + La URL solicitada ya no está disponible en este servidor y + no existe una dirección a la cual remitirle. + + + + Por favor, comunique al autor de la + ">página + que le ha remitido que la URL está obsoleta. + + + + Si usted ha seguido un enlace de una página externa, + por favor contacte con el autor de esa página. + + + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + L'URL demandée n'est plus accessible sur ce serveur et il + n'y a pas d'adresse de redirection. + + + + Nous vous prions d'informer l'auteur de + ">la + page en question que la référence n'est plus valable. + + + + Si vous avez suivi une référence issue d'une page autre, + veuillez contacter l'auteur de cette page. + + + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Níl an URL iarraithe ar fáil ar an fhreastalaí seo + a thuilleadh, agus níl aon seoladh nua ann dó. + + + + Cur in úil do úadar an + ">leathanach + thagarthach go bhfuil an nasc as-dáta, le do thoil. + + + + Má leanfá nasc ó leathanach iasachta, téigh i + dteaghmháil le úadar an leathanach sin, le do thoil. + + + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + L'URL richiesto non è più disponibile su questo server + e non esistono indirizzi verso i quali sia possibile inoltrare + la richiesta. + + + + Per favore, informa l'autore della + ">pagina + di provenienza che il link non è più valido. + + + + Se sei arrivato da una pagina esterna, informa l'autore della + pagina di provenienza che il link non è più valido. + + + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + è¦æ±‚ã•れ㟠URL ã¯æ—¢ã«æœ¬ã‚µãƒ¼ãƒã§ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“ã—〠+ 移動先もã‚ã‹ã‚Šã¾ã›ã‚“。 + + + + " + >å‚照元ページã®è‘—者ã«ã€ + リンクãŒå¤ããªã£ã¦ã„ã‚‹ã“ã¨ã‚’ã”連絡ãã ã•ã„。 + + + + ä»–ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ã®ãƒªãƒ³ã‚¯ã‚’辿ã£ã¦ããŸå ´åˆã¯ã€ + ãã®ãƒšãƒ¼ã‚¸ã®è‘—者ã«ã”連絡ãã ã•ã„。 + + + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + 요청한 URLì€ ë” ì´ìƒ ì´ ì„œë²„ì— ë‚¨ì•„ìžˆì§€ 않으며, + ê·¸ ê°ì²´ê°€ 옮겨진 다른 URL 역시 남아있지 않습니다. + + + + ">ì´ì „ + 페ì´ì§€ì˜ 만든ì´ì—게 주소가 잘못ë˜ì—ˆë‹¤ê³  알려주시기 ë°”ëžë‹ˆë‹¤. + + + + 다른 페ì´ì§€ì˜ ë§í¬ë¥¼ ë”°ë¼ì˜¤ì…¨ë‹¤ë©´, ê·¸ 페ì´ì§€ì˜ 만든ì´ì—게 ì—°ë½ì„ 하시기 + ë°”ëžë‹ˆë‹¤. + + + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + De gevraagde URL is niet langer beschikbaar op deze server en er is geen + doorverwijsadres. + + + + Gelieve aan de auteur van + ">deze pagina + te melden dat deze link niet langer actueel is. + + + + Indien u deze link hebt gekregen van een andere pagina, gelieve + de auteur van deze pagina te contacteren. + + + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + Den ønskede adressen er ikke lenger tilgjengelig hos denne + serveren og det finnes ingen adresse for videresending. + + + + Venligst informer forfatteren bak + ">den + aktuelle siden om at lenken er utdatert. + + + + Om du fulgte en lenke fra en ekstern side, venligst kontakt + forfatteren bak den siden. + + + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Poszukiwany zasób nie jest już dostępny na tym serwerze i nie + podano nowego adresu zasobu. + + + + Prosimy poinformować autora + ">referującej + strony o nieaktualnym linku. + + + + Jeśli podążyłeś za linkiem z innej strony, skontaktuj się z jej + autorem. + + + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + A URL solicitada não está disponível neste servidor + e não existe um endereço alternativo. + + + + Por favor informe o autor da + ">página + referida que a URL está desatualizada. + + + + Se você seguiu um "link" de uma página externa, por favor + entre em contato com o autor desta página e o informe sobre a + mudança do "link". + + + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + O URL desejado já não está disponível + neste servidor e não existe endereço alternativo. + + + + Por favor informe o autor da + ">página + originária que a hiperligação está + desactualizada. + + + + Se chegou aqui a partir de uma hiperligação externa, + por favor contacte o autor dessa página. + + + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + URL-ul cerut nu mai este disponibil pe acest server si nu + exista o adresa de inaintare. + + + + Va rugam informati autorul + ">paginii + referite ca link-ul nu mai este de actualitate. + + + + Va rugam contactati autorul acestei pagini daca ati urmat + un link dintr-o pagina externa. + + + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + Документ удалён, и Ð°Ð´Ñ€ÐµÑ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÑутÑтвует. + + + + ПожалуйÑта, Ñообщите автору + ">Ñтраницы, + ÑÑылающейÑÑ Ð½Ð° документ, что ÑÑылка уÑтарела. + + + + ЕÑли Ð’Ñ‹ обратилиÑÑŒ к документу по ÑÑылке Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтраницы, пожалуйÑта, + Ñообщите её автору об ошибке. + + + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + Захтевани УРЛ није више доÑтупан на овом Ñерверу и нема + адреÑе на коју биÑте могли бити проÑлеђени. + + + + Молимо обавеÑтите аутора + ">иÑходишне + Ñтранице да је веза заÑтарела. + + + + Ðко Ñте пратили везу Ñа Ñпољне Ñтранице, молимо обавеÑтите + аутора те Ñтранице. + + + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + Den önskade adressen är inte längre tillgänglig hos + denna server och det finns inte någon adress för vidarebefodran. + + + + Vänligen informera författaren bakom + ">den aktuella + sidan att länken är inaktuell. + + + + Om du följde en länk från en extern sida, vänligen + kontakta författaren av den sidan. + + + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + Talep ettiÄŸiniz URL artık kullanılabilir deÄŸil + ve herhangi bir yönlendirme de mevcut deÄŸil. + + + + Lütfen + ">istenen sayfanın + yazarına, bu baÄŸlantının güncel olmadığını bildirin. + + + + BaÅŸka bir sunucudaki bir baÄŸlantıyı izleyerek buraya geldiyseniz, + lütfen sözkonusu sayfanın yazarına baÄŸlantının güncel olmadığını bildirin. + + + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + 您请求的 URL 在此æœåŠ¡å™¨ä¸Šä¸å†å¯ç”¨ï¼Œä¸”没有设置转å‘的地å€ã€‚ + + + + 请通知">æ¥æºé¡µé¢çš„作者,该链接已过期。 + + + + 如果您从外部页é¢çš„一个链接访问,请è”系该页é¢çš„作者。 + + + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + 您請求的 URL 在此伺æœå™¨ä¸Šä¸å†å¯ç”¨ï¼Œä¸”沒有設置轉發的ä½å€ã€‚ + + + + 請通知">來æºé é¢çš„作者,該連çµå·²éŽæœŸã€‚ + + + + 如果您從外部é é¢çš„一個連çµè¨ªå•,請è¯ç¹«æ­¤é é¢çš„作者。 + + + + +----------zh-tw-- diff --git a/docs/error/HTTP_INTERNAL_SERVER_ERROR.html.var b/docs/error/HTTP_INTERNAL_SERVER_ERROR.html.var new file mode 100644 index 0000000..b00df31 --- /dev/null +++ b/docs/error/HTTP_INTERNAL_SERVER_ERROR.html.var @@ -0,0 +1,576 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + + + Nastala vnitÅ™ní chyba a server nebyl schopen + dokonÄit Váš požadavek. + + + + Chybová zpráva +
    + + + + Nastala vnitÅ™ní chyba a server nebyl schopen + dokonÄit Váš požadavek. BuÄ je server + pÅ™etížen, nebo doÅ¡lo k chybÄ› v CGI skriptu. + + + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + + + Die Anfrage kann nicht beantwortet werden, da im Server + ein interner Fehler aufgetreten ist. + + + + Fehlermeldung: +
    + + + + Die Anfrage kann nicht beantwortet werden, da im Server + ein interner Fehler aufgetreten ist. + Der Server ist entweder überlastet oder ein Fehler in + einem CGI-Skript ist aufgetreten. + + + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + + + The server encountered an internal error and was + unable to complete your request. + + + + Error message: +
    + + + + The server encountered an internal error and was + unable to complete your request. Either the server is + overloaded or there was an error in a CGI script. + + + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + Se ha producido un error interno en el servidor y no + se ha podido completar su solicitud. + + + + + Mensaje de error:
    + + + + + Se ha producido un error interno en el servidor y no se + ha podido completar su solicitud. O el servidor está + sobrecargado o ha habido un fallo en la ejecución de + un programa CGI. + + + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + + + Le serveur a été victime d'une erreur interne et n'a pas + été capable de faire aboutir votre requête. + + + + Message d'erreur: +
    + + + + Le serveur a été victime d'une erreur interne et n'a pas + été capable de faire aboutir votre requête. + Soit le server est surchargé soit il s'agit d'une erreur dans + le script CGI. + + + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + + + Thit an freastalaí ar earráid inmheánach + agus theip air do chuid iarratais a comhlíonadh. + + + + Teachtaireacht earráide: +
    + + + + Thit an freastalaí ar earráid inmheánach + agus theip air do chuid iarratais a comhlíonadh. + Is féidir go bhfuil an freastalaí + rólóaidithe, nó go raibh earráid + i script CGI éigin. + + + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + + + Il server ha generato un errore interno e non è + in grado di soddisfare la richiesta. + + + + Messaggio di errore: +
    + + + + Il server ha generato un errore interno e non è + in grado di soddisfare la richiesta. Il server potrebbe + essere sovraccarico oppure si è verificato un + errore in uno script CGI. + + + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + + + サーãƒå†…部ã§éšœå®³ãŒç™ºç”Ÿã—〠+ リクエストã«å¿œãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + + + + Error message: +
    + + + + サーãƒå†…部ã§éšœå®³ãŒç™ºç”Ÿã—〠+ リクエストã«å¿œãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + サーãƒãŒéŽè² è·ã§ã‚ã‚‹ã‹ã€ + CGI スクリプトã«ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã™ã€‚ + + + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + + + ì„œë²„ì— ë‚´ë¶€ 오류가 ë°œìƒí•˜ì—¬ ìš”ì²­ì„ ë까지 처리하지 못했습니다. + + + + 오류 ë‚´ìš©: +
    + + + + ì„œë²„ì— ë‚´ë¶€ 오류가 ìƒê²¨ ìš”ì²­ì„ ë까지 처리하지 못했습니다. + ì„œë²„ì— ê³¼ë¶€í•˜ê°€ 걸렸거나 아니면 CGI í”„ë¡œê·¸ëž¨ì— ì˜¤ë¥˜ê°€ 있었습니다. + + + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + + + + + Foutbericht: +
    + + + + De server kreeg een interne fout en kon + uw vraag niet beantwoorden. De server is overbelast + of er was een fout in een CGI script. + + + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + + + Det inntraff en intern feil hos serveren, og det var ikke mulig å + gjennomføre din forespørsel. + + + + Feilmelding: +
    + + + + Det inntraff en intern feil hos serveren, og det var ikke mulig Ã¥ + gjennomføre din forespørsel. Serveren er enten overbelastet, eller + CGI-skriptet inneholder feil. + + + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + + + Serwer napotkał błąd wewnętrzny i nie jest w stanie + zrealizować twojego żądania. + + + + Informacja o błędzie: +
    + + + + Serwer napotkał błąd wewnętrzny i nie jest w stanie + zrealizować twojego żądania. Serwer jest przeciążony lub + napotkał na błąd w skrypcie CGI. + + + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + + + O servidor encontrou um erro interno e não pode + completar sua requisição. + + + + Mensagem de Erro: +
    + + + + O servidor encontrou um erro interno e não + foi possível completar sua requisição. + O servidor está sobrecarregado ou existe um + erro em um script CGI. + + + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + + + O servidor encontrou um erro interno e não pode completar + o seu pedido. + + + + Mensagem de erro: +
    + + + + O servidor encontrou um erro interno e não pode completar + o seu pedido. Ou o servidor está sobrecarregado, ou ocorreu + um erro num script CGI. + + + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + + + Serverul a intalnit o eroare interna si nu a + putut rezolva cererea dumneavoastra. + + + + Mesajul de eroare : +
    + + + + Serverul a intalnit o eroare interna si nu a + putut rezolva cererea dumneavoastra. Serverul este + supraincarcat sau a fost o eroare intr-un script CGI. + + + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + + + Произошла внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñервера, в результате которой + Ñерверу не удалоÑÑŒ завершить обработку Вашего запроÑа. + + + + Error message: +
    + + + + Произошла внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñервера, в результате которой + Ñерверу не удалоÑÑŒ завершить обработку Вашего запроÑа. + Сервер перегружен, или в CGI-Ñкрипте обнаружена ошибка. + + + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + + + Сервер је имао унутрашњу грешку и није био + у могућноÑти да иÑпуни ваш захтев. + + + + Порука о грешци: +
    + + + + Сервер је имао унутрашњу грешку и није био + у могућноÑти да иÑпуни ваш захтев. Могуће је да је Ñервер + преоптерећен, или да Ñе деÑила грешка у CGI Ñкрипти. + + + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + + + Servern råkade ut för ett internt fel och det var inte möjligt + att slutföra din begäran. + + + + Felmeddelande: +
    + + + + Servern råkade ut för ett internt fel och det var inte möjligt + att slutföra din begäran. Servern är antingen överbelastad + eller så innehåller CGI-skriptet fel. + + + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + + + Sunucuda içsel bir hata oluÅŸtuÄŸundan sunucu isteÄŸinizi yerine getiremiyor. + + + + Hata iletisi: +
    + + + + Sunucuda içsel bir hata oluÅŸtuÄŸundan sunucu isteÄŸinizi yerine getiremiyor. + Ya sunucu aşırı yüklü ya da CGI betiÄŸinde bir hata oluÅŸtu. + + + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + + + æœåС噍å‘ç”Ÿäº†å†…éƒ¨é”™è¯¯ï¼Œæ— æ³•å¤„ç†æ‚¨çš„请求。 + + + + 错误信æ¯ï¼š +
    + + + + æœåС噍å‘ç”Ÿäº†å†…éƒ¨é”™è¯¯ï¼Œæ— æ³•å¤„ç†æ‚¨çš„请求。原因å¯èƒ½æ˜¯æœåŠ¡å™¨è¿‡è½½æˆ–åœ¨ CGI 脚本中出错。 + + + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + + + 伺æœå™¨ç™¼ç”Ÿäº†å…§éƒ¨éŒ¯èª¤ï¼Œç„¡æ³•è™•ç†æ‚¨çš„請求。 + + + + 錯誤資訊: +
    + + + + 伺æœå™¨ç™¼ç”Ÿäº†å…§éƒ¨éŒ¯èª¤ï¼Œç„¡æ³•è™•ç†æ‚¨çš„請求。原因å¯èƒ½æ˜¯ä¼ºæœå™¨è¶…載或在 CGI 腳本中出錯。 + + + + +----------zh-tw-- diff --git a/docs/error/HTTP_LENGTH_REQUIRED.html.var b/docs/error/HTTP_LENGTH_REQUIRED.html.var new file mode 100644 index 0000000..cbc7910 --- /dev/null +++ b/docs/error/HTTP_LENGTH_REQUIRED.html.var @@ -0,0 +1,279 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Požadavek metodou + vyžaduje korektní hlaviÄku Content-Length. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Die Anfrage kann nicht beantwortet werden. + Bei Verwendung der -Methode + muß ein korrekter Content-Length-Header + angegeben werden. + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + A request with the + method requires a valid Content-Length header. + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + Una petición con el método requiere que el encabezado + Content-Length sea válido. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + Une requête utilisant la méthode nécessite un en-tête + Content-Length (indiquant la longueur) valable. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Is gá go mbhéadh ceanntáisc + Content-Length + bhailí do iarratais faoin modh + . + + +----------ga-- + + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + Una richiesta con il metodo + + richiede che venga specificato un header Content-Length + valido. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + + メソッドã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã§ã¯ã€ + æ­£ã—ã„ Content-Length ヘッダãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚ + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + ë°©ì‹ì„ 쓰는 + ìš”ì²­ì€ ì˜¬ë°”ë¥¸ Content-Length í—¤ë”ë„ í•¨ê»˜ 보내야만 합니다. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + Een vraag met het + type methode heeft een correcte Content-Length lijn nodig. + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + En forespørsel med + metoden krever en korrekt Content-Length header. + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Żądanie + wymaga poprawnego nagłówka Content-Length. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + Uma requisição + do método + requer um cabeçalho Content-Length válido. + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + Um pedido com o método + necessita de um cabeçalho Content-Length válido. + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + O cerere cu metoda + necesita un header Content-Length valid. + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + Ð—Ð°Ð¿Ñ€Ð¾Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ метода + должен иметь правильное значение длины в поле Content-Length. + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + Захтев Ñа + методом мора имати иÑправно Content-Length + (дужина Ñадржаја) заглавље. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + En förfrågan med + metoden kräver ett korrekt Content-Length huvud. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + yöntemini kullanan bir istek + geçerli bir Content-Length (içerik uzunluÄŸu) baÅŸlığı gerektirir. + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + 对 方法的请求必须带有有效的 + Content-Length 头字段。 + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + å° æ–¹æ³•çš„è«‹æ±‚å¿…é ˆå¸¶æœ‰æœ‰æ•ˆçš„ + Content-Length 頭欄ä½ã€‚ + + +----------zh-tw-- diff --git a/docs/error/HTTP_METHOD_NOT_ALLOWED.html.var b/docs/error/HTTP_METHOD_NOT_ALLOWED.html.var new file mode 100644 index 0000000..16a8c91 --- /dev/null +++ b/docs/error/HTTP_METHOD_NOT_ALLOWED.html.var @@ -0,0 +1,269 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Metoda + není pro požadované URL povolena. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Die -Methode + ist für den angeforderten URL nicht erlaubt. + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + The + method is not allowed for the requested URL. + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + No se permite el método + para la URL solicitada. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + La méthode + n'est pas utilisable pour l'URL demandée. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Níl cead an modh + + a úasáid leis an URL iarraithe. + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + Il metodo + non è consentito per l'URL richiesto. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + + メソッドã¯ã€è¦æ±‚ã•れ㟠URL ã«å¯¾ã—ã¦ã¯è¨±å¯ã•れã¦ã„ã¾ã›ã‚“。 + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + ë°©ì‹ì€ + 요청한 URLì— ì‚¬ìš©í•  수 없습니다. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + Het + type methode is niet toegelaten voor de gevraagde URL. + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + metoden er ikke + tillatt for den forespurte adressen. + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Metoda + jest niedozwolona dla podanego URL-a. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + O método + não é permitido para a URL requisitada. + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + O método não + é permitido para o URL pedido. + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + Metoda + nu este permisa pentru URL-ul cerut. + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + Метод + Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ к запрашиваемому реÑурÑу. + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + + метод није дозвољен за захтевани УРЛ. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + + metoden är inte tillåten för den förfrågade + adressen. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + + yöntemi istediÄŸiniz URL için kullanılamaz. + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + 在请求的 URL 上ä¸å…许使用 + 方法。 + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + 在請求的 URL 上ä¸å…許使用 + 方法。 + + +----------zh-tw-- diff --git a/docs/error/HTTP_NOT_FOUND.html.var b/docs/error/HTTP_NOT_FOUND.html.var new file mode 100644 index 0000000..9a8be31 --- /dev/null +++ b/docs/error/HTTP_NOT_FOUND.html.var @@ -0,0 +1,536 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Požadované URL nebylo na tomto serveru nalezeno. + + + + Zdá se, že odkaz na + ">odkazující + stránce je chybný nebo zastaralý. Informujte, prosím, autora + ">této stránky + o chybÄ›. + + + + Pokud jste zadal(a) URL ruÄnÄ›, zkontrolujte, prosím, + zda jste zadal(a) URL správnÄ›, a zkuste to znovu. + + + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Der angeforderte URL konnte auf dem Server nicht gefunden werden. + + + + Der Link auf der + ">verweisenden + Seite scheint falsch oder nicht mehr aktuell zu sein. + Bitte informieren Sie den Autor + ">dieser Seite + über den Fehler. + + + + Sofern Sie den URL manuell eingegeben haben, + überprüfen Sie bitte die Schreibweise und versuchen Sie es erneut. + + + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + The requested URL was not found on this server. + + + + The link on the + ">referring + page seems to be wrong or outdated. Please inform the author of + ">that page + about the error. + + + + If you entered the URL manually please check your + spelling and try again. + + + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + No se ha localizado la URL solicitada en este servidor. + + + + La URL de la ">página que le ha remitido + parece ser errónea o estar obsoleta. Por favor, informe del error + al autor de ">esa + página. + + + + Si usted ha introducido la URL manualmente, por favor revise su + ortografía e inténtelo de nuevo. + + + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + L'URL demandée n'a pas pu être trouvée sur ce serveur. + + + + La référence sur + ">la page + citée + semble être erronée ou perimée. Nous vous prions + d'informer l'auteur de + ">cette page + de cette erreur. + + + + Si vous avez tapé l'URL à la main, veuillez vérifier + l'orthographe et réessayer. + + + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Níor aimsigh an URL iarraithe ar an fhreastalaí seo. + + + + Is cosúil go bhfuil an nasc ar an + ">leathanach + thagarthach mícheart nó as dáta. + Cur in iúl d'úadar + " + >an leathanach sin go bhfuil earráid ann, le do thoil. + + + + Má chuir tú isteach an URL tú féin, deimhnigh + go bhfuil sé litrithe i gceart agat, agus déan iarracht eile + le do thoil. + + + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + L'URL richiesto non esiste su questo server. + + + + Il link della + ">pagina da cui + sei arrivato potrebbe essere errato o non essere più valido. + Per favore, informa dell'errore l'autore della + ">pagina. + + + + Se hai scritto l'URL a mano, per favore controlla che + non ci siano errori. + + + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + è¦æ±‚ã•れ㟠URL ã¯æœ¬ã‚µãƒ¼ãƒã§ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + + + + "> + å‚照元ページã®ãƒªãƒ³ã‚¯ãŒé–“é•ã£ã¦ã„ã‚‹ã‹ã€å¤ããªã£ã¦ã—ã¾ã£ã¦ã„るよã†ã§ã™ã€‚ + " + >ページã®è‘—者ã«ã“ã®ã‚¨ãƒ©ãƒ¼ã‚’ãŠçŸ¥ã‚‰ã›ä¸‹ã•ã„。 + + + + ã‚‚ã—æ‰‹å…¥åŠ›ã§ URL を入力ã—ãŸå ´åˆã¯ã€ç¶´ã‚Šã‚’確èªã—ã¦å†åº¦ãŠè©¦ã—下ã•ã„。 + + + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + 요청한 URLì„ ì´ ì„œë²„ì—서 ì°¾ì„ ìˆ˜ 없습니다. + + + + ">ì´ì „ + 페ì´ì§€ì— 있는 ë§í¬ê°€ 잘못ë˜ì—ˆê±°ë‚˜ 오래ë˜ì–´ 없어진 것 같습니다. + ">ê·¸ 페ì´ì§€ë¥¼ + 만든ì´ì—게 ì´ ì‚¬ì‹¤ì„ ì•Œë ¤ì£¼ì‹œê¸° ë°”ëžë‹ˆë‹¤. + + + + URLì„ ì§ì ‘ 입력하셨다면 바르게 입력하셨는지 확ì¸í•˜ì‹œê³  다시 시ë„하시기 + ë°”ëžë‹ˆë‹¤. + + + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + De gevraagde URL was niet gevonden op deze server. + + + + De link op + ">deze pagina + pagina is verkeerd of achterhaald. Gelieve de auteur van + ">die pagina + in te lichten over deze fout. + + + + Indien u de URL manueel hebt ingevuld, gelieve uw + spelling te controleren en probeer opnieuw. + + + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + Den etterspurte adressen finnes ikke pÃ¥ denne serveren. + + + + Lenken pÃ¥ den + ">forrige siden +ser ut til Ã¥ være feil eller utdatert. Venligst informer forfatteren av + ">siden + om feilen. + + + + Om du skrev inn adressen manuelt, vennligst kontroller stavingen og + forsøk igjen. + + + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Nie znaleziono żądanego URL-a na tym serwerze. + + + + Odnośnik na + ">referującej stronie + wydaje się być nieprawidłowy lub nieaktualny. Poinformuj autora + ">tej strony + o problemie. + + + Jeśli wpisałeś URL-a ręcznie, sprawdź, czy się nie pomyliłeś. + + + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + A URL requisitada não foi encontrada neste servidor. + + + + O link na + ">página + referida parece estar com algum erro ou desatualizado. Por favor informe o + autor ">desta + página sobre o erro. + + + + Se você digitou o endereço (URL) manualmente, + por favor verifique novamente a sintaxe do endereço. + + + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + O método não + é permitido para o URL pedido. + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + URL-ul cerut nu a fost gasit pe acest server. + + + + Link-ul de pe + ">pagina + de unde ati venit pare a fi gresit sau invechit. Va rugam informati autorul + ">acestei pagini + despre eroare. + + + + Daca ati introdus URL-ul manual, va rugam verificati + corectitudinea si incercati din nou. + + + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + Запрашиваемый реÑÑƒÑ€Ñ Ð½Ðµ найден. + + + + СÑылка на + ">Ñтранице + неверна или уÑтарела. ПожалуйÑта, Ñообщите автору + ">Ñтой Ñтраницы + об ошибке. + + + + ЕÑли Ð’Ñ‹ ввели Ð°Ð´Ñ€ÐµÑ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ реÑурÑа вручную, пожалуйÑта, удоÑтовертеÑÑŒ, + что в напиÑании адреÑа нет ошибок. + + + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + Захтевани УРЛ није пронађен на овом Ñерверу. + + + + Изгледа да је веза на + ">иÑходишној + Ñтраници погрешна или заÑтарела. Молимо обавеÑтите аутора + ">те Ñтранице + о грешци. + + + + Уколико Ñте УРЛ унели ручно, молимо проверите могуће + грешке и пробајте поново. + + + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + Den efterfrågade adressen hittades inte på denna server. + + + + Länken på den + ">tidigare sidan + verkar vara felaktig eller inaktuell. Vänligen informera författaren av + ">sidan + om felet. + + + + Om du skrev in adressen manuellt så kontrollera din stavning och + försök igen. + + + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + Talep ettiÄŸiniz URL, sunucu üzerinde bulunmuyor. + + + + ">İstek yapılan sayfa + üzerindeki baÄŸlantı güncel deÄŸil. Lütfen ">sayfa yazarını hata hakkında bilgilendirin. + + + + URL'yi elle girdiyseniz, yazdıklarınızı gözden geçirip yeniden deneyin. + + + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + 您请求的 URL 在该æœåŠ¡å™¨ä¸Šæœªæ‰¾åˆ°ã€‚ + + + + 您的">æ¥æºé¡µé¢ä¸Šçš„链接å¯èƒ½å‡ºé”™æˆ–过期。 + 请将错误通知给">该页é¢çš„作者。 + + + + 如果您是手动输入的 URL ,请检查拼写并é‡è¯•。 + + + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + 您請求的 URL 在該伺æœå™¨ä¸Šæœªæ‰¾åˆ°ã€‚ + + + + 您的">來æºé é¢ä¸Šçš„連çµå¯èƒ½å‡ºéŒ¯æˆ–éŽæœŸã€‚ + 請將錯誤通知給">該來æºé é¢çš„作者。 + + + + 如果您是手動輸入的 URL ,請檢查拼寫並é‡è©¦ã€‚ + + + + +----------zh-tw-- diff --git a/docs/error/HTTP_NOT_IMPLEMENTED.html.var b/docs/error/HTTP_NOT_IMPLEMENTED.html.var new file mode 100644 index 0000000..67f596e --- /dev/null +++ b/docs/error/HTTP_NOT_IMPLEMENTED.html.var @@ -0,0 +1,254 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Server nepodporuje akci požadovanou prohlížeÄem. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Die vom Browser angeforderte Aktion wird vom Server + nicht unterstützt. + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + The server does not support the action requested by the browser. + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + El servidor no soporta la acción + solicitada por el navegador. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + Le serveur n'est pas en mesure d'effectuer l'action + demandée par le navigateur. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Níl tacaíocht ag an fhreastalaí don gníomh + atá á iarraidh ag an mbrabhsálaí. + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + Il server non supporta il tipo di azione richiesta dal browser. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + ブラウザã®è¦æ±‚ã—ãŸã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¯ã€ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。 + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + 브ë¼ìš°ì €ê°€ 보낸 ìš”ì²­ì„ ì´ ì„œë²„ê°€ ì§€ì›í•˜ì§€ 않습니다. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + De server ondersteunt de actie, gevraagd door de browser, niet. + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + Serveren støtter ikke den handlingen som ønskes utført av + nettleseren. + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Ten serwer nie obsługuje żądania przesłanego przez przeglądarkę. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + O servidor não suporta a ação requisitada pelo + seu "browser". + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + O servidor não suporta a acção pedida pelo + browser. + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + Serverul nu suporta actiunea ceruta de browser. + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + Сервер не поддерживает возможноÑтей, необходимых Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ запроÑа. + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + Сервер не подржава акцију коју је читач захтевао. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + Servern stödjer inte den handling som önskades + av webbläsaren. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + Sunucu, tarayıcı tarafından istenen eylemi desteklemiyor. + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + æœåС噍䏿”¯æŒæµè§ˆå™¨è¯·æ±‚的动作。 + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + 伺æœå™¨ä¸æ”¯æ´ç€è¦½å™¨è«‹æ±‚的動作。 + + +----------zh-tw-- diff --git a/docs/error/HTTP_PRECONDITION_FAILED.html.var b/docs/error/HTTP_PRECONDITION_FAILED.html.var new file mode 100644 index 0000000..8bf2716 --- /dev/null +++ b/docs/error/HTTP_PRECONDITION_FAILED.html.var @@ -0,0 +1,257 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Vstupní podmínka pro požadavek o zadané URL nesplnila pozitivní + vyhodnocení. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Die für den Abruf der angeforderten URL notwendige + Vorbedingung wurde nicht erfüllt. + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + The precondition on the request for the URL failed positive evaluation. + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + No se ha evaluado positivamente la pre-condición + de la petición para la URL. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + La précondition pour l'URL demandé a été + évaluée négativement. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Theip meastóireacht an réamhchoinníoll + don iarratais den URL. + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + I criteri di precondizione per consentire l'invio dell'URL + richiesto non sono stati soddisfatti. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + 指定ã•れ㟠URL ã¸ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ãŠã‘ã‚‹äº‹å‰æ¡ä»¶ãŒæº€ãŸã•れã¾ã›ã‚“ã§ã—ãŸã€‚ + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + 미리 주어진 ì¡°ê±´ì´ ë§Œì¡±ë˜ì§€ 않아서 URL ìš”ì²­ì„ ì²˜ë¦¬í•  수 없습니다. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + Een startvoorwaarde werd niet voldaan bij verwerking van de vraag naar de URL. + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + Den nødvendige forutsetningen for forespørselen passerte ikke + vurderingen med positivt resultat. + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Warunek wstępny dla URL-a nie został spełniony. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + A condição necessária para a + requisição da URL foi avaliada como falsa. + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + A condição necessária ao pedido do URL + foi avaliada com resultado negativo. + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + Preconditionarea pentru cererea URL-ului nu a fost evaluata pozitiv. + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + УÑловие в запроÑе к данному реÑурÑу не было выполнено. + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + ПредуÑлов за захтев УРЛ-а није иÑпуњен. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + Den nödvändiga förutsättningen för + adressförfrågan passerade inte utvärderingen + med acceptabelt resultat. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + URL talebinin önkoÅŸulu olumlanamadı. + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + 对该 URL å‘é€çš„请求,包å«çš„先决æ¡ä»¶ä¸æˆç«‹ã€‚ + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + å°è©² URL 發é€çš„請求,包å«çš„先決æ¢ä»¶ä¸æˆç«‹ã€‚ + + +----------zh-tw-- diff --git a/docs/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var b/docs/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var new file mode 100644 index 0000000..c821951 --- /dev/null +++ b/docs/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var @@ -0,0 +1,282 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Metoda + nedovoluje pÅ™enos dat nebo objem dat + pÅ™esahuje kapacitní limit. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Die bei der Anfrage übermittelten Daten sind für + die -Methode + nicht erlaubt oder die Datenmenge hat das Maximum überschritten. + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + The + method does not allow the data transmitted, or the data volume + exceeds the capacity limit. + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + El método + no permite transmitir la información, o el + volumen de la información excede los límites + de capacidad del mismo. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + La méthode + n'autorise pas le transfert de ces données ou bien le volume + des données excède la limite de capacité. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Ní ligeann an modh an + tarchur sonraíocht tríd, nó tá an méid + sonraíocht breis ar an teoireann cumas. + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + Il metodo + non consente di trasferire dati, oppure la quantità di dati + richiesti è eccessiva. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + + メソッドãŒãƒ‡ãƒ¼ã‚¿ã®é€ä¿¡ã‚’許å¯ã—ã¦ã„ãªã„ã‹ã€ + データé‡ãŒè¨±å®¹é‡ã‚’è¶…ãˆã¦ã„ã¾ã™ã€‚ + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + ë°©ì‹ì˜ + 요청으로는 ë‚´ìš©ì„ ë³´ë‚¼ 수 없거나, ë˜ëŠ” 보내온 ë‚´ìš©ì´ ê·¸ ë°©ì‹ì—서 허용하는 + 최대 길ì´ë¥¼ 넘었습니다. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + Het type methode laat niet toe + data te versturen of het datavolume is groter dan maximaal toegelaten. + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + metoden tillater ikke + de sendte data eller sÃ¥ overskrider datamengenden + kapasitetsbegrensningen. + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Metoda + nie zezwala na typ przesyłanych danych lub rozmiar danych przekracza + ustalony limit. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + O método + não permite a transmissão dos dados, + ou o volume de dados excede a capacidade limite. + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + O método + não permite todos os dados que foram transmitidos, + ou o volume de dados excede o limite da capacidade. + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + Metoda + nu permite transmiterea datelor, sau volumul de date + depaseste limita capacitatii. + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + Тип передаваеиых данных запрещён методом , + или размера тела запроÑа Ñлишком велик. + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + + метод не дозвољава Ð¿Ñ€ÐµÐ½Ð¾Ñ Ð¾Ð²Ð¸Ñ… података, или количина података + премашује ограничења могућноÑти. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + metoden tillåter + inte den skickade datan eller så överskrider datavolymen + kapacitetsnivån. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + yöntemi ya veri aktarımına + izin vermiyor ya da veri hacmi iÅŸlenemeyecek kadar büyük. + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + 方法ä¸å…许传输数æ®ï¼Œæˆ–æ•°æ®é‡è¶…过容é‡é™åˆ¶ã€‚ + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + 方法ä¸å…許傳輸資料,或資料é‡è¶…éŽå®¹é‡é™åˆ¶ã€‚ + + +----------zh-tw-- diff --git a/docs/error/HTTP_REQUEST_TIME_OUT.html.var b/docs/error/HTTP_REQUEST_TIME_OUT.html.var new file mode 100644 index 0000000..81eeca5 --- /dev/null +++ b/docs/error/HTTP_REQUEST_TIME_OUT.html.var @@ -0,0 +1,270 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Server uzavÅ™el síťové spojení, protože prohlížeÄ + nedokonÄil požadavek ve stanoveném Äase. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Der Server konnte nicht mehr länger auf die Beendigung + der Browseranfrage warten; die Netzwerkverbindung wurde + vom Server geschlossen. + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + The server closed the network connection because the browser + didn't finish the request within the specified time. + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + El servidor ha cerrado la conexión de red + debido a que el navegador no ha finalizado la solicitud + dentro del tiempo permitido. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + Le serveur a fermé la connection car le navigateur n'a pas + fini la requête dans le temps spécifié. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Dún an freastalaí an nasc líonra, + mar níor chríochnaidh an brabhsálaí + leis an iarratais, taobh istigh den am sonraithe. + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + Il server ha chiuso la connessione in quanto è stato + superato il limite di tempo entro il quale il browser avrebbe + dovuto eseguire la richiesta. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + ãƒ–ãƒ©ã‚¦ã‚¶ãŒæŒ‡å®šæ™‚間以内ã«ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’完了ã—ãªã‹ã£ãŸã®ã§ã€ + サーãƒã¯æŽ¥ç¶šã‚’切りã¾ã—ãŸã€‚ + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + 브ë¼ìš°ì €ê°€ 너무 오랫ë™ì•ˆ ìš”ì²­ì„ ëë‚´ì§€ 않아서 서버가 ë„¤íŠ¸ì›Œí¬ ì—°ê²°ì„ + 강제로 ëŠì—ˆìŠµë‹ˆë‹¤. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + De server heeft de netwerkverbinding gesloten omdat de browser + de vraag niet heeft beëindigd binnen een gestelde tijd. + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + Serveren stengte forbindelsen fordi nettleseren ikke avsluttet + forespørselen innen tidsgrensen. + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Serwer zamknął połączenie sieciowe, ponieważ przeglądarka + nie zakończyła operacji w przewidywanym czasie. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + O servidor encerrou a conexão porque o "browser" + não finalizou a requisição dentro + do tempo limite. + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + O servidor interrompeu a ligação de rede porque o + browser não terminou o pedido dentro do tempo limite. + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + Serverul a terminat conexiunea cu browserul pentru ca acesta + nu a terminat cererea in limita timpului specificat. + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + Сервер закрыл Ñоединение из-за иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸, + отведённого браузеру на выполнение запроÑа. + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + Сервер је прекинуо везу Ñа мрежом јер читач + није завршио захтев за дозвољено време. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + Servern stängde förbindelsen därför att + webbläsaren inte avslutade förfrågan inom + förbestämd tid. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + Tarayıcı isteÄŸi zamanında tamamlayamadığından sunucu aÄŸ baÄŸlantısını kapattı. + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + 由于æµè§ˆå™¨æœªåœ¨æŒ‡å®šæ—¶é—´å†…完æˆè¯·æ±‚,æœåŠ¡å™¨å…³é—­äº†ç½‘ç»œè¿žæŽ¥ã€‚ + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + 由於ç€è¦½å™¨æœªåœ¨æŒ‡å®šæ™‚間內完æˆè«‹æ±‚,伺æœå™¨é—œé–‰äº†ç¶²è·¯é€£æŽ¥ã€‚ + + +----------zh-tw-- diff --git a/docs/error/HTTP_REQUEST_URI_TOO_LARGE.html.var b/docs/error/HTTP_REQUEST_URI_TOO_LARGE.html.var new file mode 100644 index 0000000..f147cb4 --- /dev/null +++ b/docs/error/HTTP_REQUEST_URI_TOO_LARGE.html.var @@ -0,0 +1,271 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Délka požadovaného URL pÅ™esahuje kapacitní limit tohoto + serveru. Požadavek nemůže být zpracován. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Der bei der Anfrage übermittelte URI überschreitet + die maximale Länge. + Die Anfrage kann nicht ausgeführt werden. + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + The length of the requested URL exceeds the capacity limit for + this server. The request cannot be processed. + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + La longitud de la URL solicitada excede el límite de + capacidad para este servidor. No se puede procesar la solicitud. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + La longueur de l'URL demandée excède la limite de + capacitè pour ce serveur. Nous ne pouvons donner suite + à votre requête. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Tá faid an URL iarraithe breis ar an teorainn cumas don + freastalaí seo. Ní féidir an iarratas a + phróiseáil. + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + La lunghezza dell'indirizzo (URL) trasmesso supera il + limite massimo imposto da questo server. + La richiesta non può essere soddisfatta. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + リクエスト㮠URL ã®é•·ã•ãŒã€æ‰±ãˆã‚‹é•·ã•ã‚’è¶…ãˆã¦ã„ã¾ã™ã€‚ + リクエストã®å‡¦ç†ã‚’ç¶šã‘られã¾ã›ã‚“。 + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + 요청한 URLì´ ë„ˆë¬´ 길어서 ì´ ì„œë²„ê°€ 처리할 수 없습니다. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + De lengte van de aangeboden URL overschreidt het maximum + voor deze server. De vraag kan niet verwerkt worden. + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + Lengden pÃ¥ adressen som etterspurtes overskrider + kapasitetsgrensen for denne serveren. Forespørselen kan + ikke prosesseres. + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Długość żądanego URL-a przekracza limit ustanowiony dla tego + serwera. Żądanie nie może zostać zrealizowane. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + O tamanho do endereço (URL) excede a capacidade limite + desse servidor. A requisição não pode ser + processada. + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + O tamanho do URL pedido excede o limite da capacidade deste + servidor. O pedido não pode ser processado. + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + Lungimea URL-ului cerut depaseste limita capacitatii pentru + acest server. Cererea nu poate fi procesata. + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + Длина запрашиваемого URL превышает макÑимально допуÑтимую + Ñервером. Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ может быть обработан. + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + Дужина захтеваног УРЛ-а премашује ограничења могућноÑти + овог Ñервера. Захтев не може бити обрађен. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + Längden på adressen som efterfrågas överskrider + kapacitetsgränsen för denna server. Förfrågan kan + inte verkställas. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + Talep edilen URI'nin uzunluÄŸu, sunucunun sınırlarını + aÅŸtığından istek yerine getirilemiyor. + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + 请求 URL 的长度超出了æœåŠ¡å™¨çš„é•¿åº¦é™åˆ¶ã€‚该请求无法处ç†ã€‚ + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + 請求 URL 的長度超出了伺æœå™¨çš„長度é™åˆ¶ã€‚該請求無法處ç†ã€‚ + + +----------zh-tw-- diff --git a/docs/error/HTTP_SERVICE_UNAVAILABLE.html.var b/docs/error/HTTP_SERVICE_UNAVAILABLE.html.var new file mode 100644 index 0000000..6f9fb6b --- /dev/null +++ b/docs/error/HTTP_SERVICE_UNAVAILABLE.html.var @@ -0,0 +1,286 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Server doÄasnÄ› nemůže zpracovat Váš požadavek + kvůli údržbÄ› nebo kapacitním problémům. + Zkuste to, prosím, pozdÄ›ji. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Der Server ist derzeit nicht in der Lage die Anfrage + zu bearbeiten. Entweder ist der Server derzeit überlastet + oder wegen Wartungsarbeiten nicht verfügbar. + Bitte versuchen Sie es später wieder. + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + The server is temporarily unable to service your + request due to maintenance downtime or capacity + problems. Please try again later. + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + El servidor no puede procesar su solicitud en este momento + debido a tareas de mantenimiento o a problemas de capacidad. + Por favor, inténtelo de nuevo más tarde. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + En raison de travaux de maintenance ou de problèmes + de capacité le serveur n'est pas en mesure de répondre + à votre requête pour l'instant. Veuillez réessayer + plus tard. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Níl an freastalaí seo in ann do chuid + iarratais a líonadh ag an am seo, toisc + cóthábháil nó fhaidhbeanna cumas. + Déan iarracht eile níos déanaí, le do thoil. + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + Il server in questo momento non è in grado di + soddisfare la richiesta per motivi di manutenzione + o di sovraccarico del sistema. + Per favore, riprova più tardi. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + メンテナンスã§åœæ­¢ä¸­ã‹ã€ã‚µãƒ¼ãƒã®å‡¦ç†èƒ½åŠ›ã®å•題ã®ãŸã‚〠+ ç¾åœ¨ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«å¿œã˜ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + 後ã»ã©å†åº¦ãŠè©¦ã—下ã•ã„。 + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + 관리 작업ì´ë‚˜ 용량 문제로 서버가 잠시ë™ì•ˆ ìš”ì²­ì„ ì²˜ë¦¬í•  수 없습니다. + ë‚˜ì¤‘ì— ë‹¤ì‹œ 시ë„해주시기 ë°”ëžë‹ˆë‹¤. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + De server kan tijdelijk uw vraag niet verwerken + door onderhoud of problemen met de capaciteit van de server. + Gelieve later nog eens opnieuw te proberen. + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + Serveren er midlertidig ikke i stand til Ã¥ utføre din + forespørsel. Vennligst prøv igjen senere. + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Serwer nie może zrealizować twojego żądania + ze względu na konserwację lub zbyt duże obciążenie. + Prosimy spróbować później. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + O servidor está temporariamente fora de serviço + para manutanção ou devido a problemas de capacidade. + Por favor tente acessar mais tarde. + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + O servidor está temporáriamente incapaz de servir + o seu pedido devido a uma interrupção para + manutenção ou problemas de capacidade. Por favor + tente de novo mais tarde. + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + Serverul nu poate, temporar, sa raspunda cererii + dumneavoastra datorita intretinerii acestuia sau a + unor probleme de capacitate. Va rugam incercati mai tarziu. + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + Сервер временно не имеет возможноÑти обработать Ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ + по техничеÑким причинам. ПожалуйÑта, повторите позже. + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + Сервер тренутно није у могућноÑти да уÑлужи ваш + захтев пошто је затворен због одржавања или има недовољан + капацитет. Молимо покушајте поново каÑније. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + Servern är för tillfället oförmögen att + utföra din förfrågan på grund av underhåll + eller kapacitetsbegränsningar. Vänligen försök + igen senare. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + Sunucu, bakım gerektiren çeÅŸitli sorunlardan ötürü, + bir süreliÄŸine taleplerinize yanıt veremiyor. + Lütfen daha sonra tekrar deneyin. + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + 由于æœåŠ¡å™¨ç»´æŠ¤æˆ–è´Ÿè½½é—®é¢˜ï¼ŒæœåŠ¡å™¨æš‚æ—¶æ— æ³•å¤„ç†æ‚¨çš„请求。请ç¨åŽé‡è¯•。 + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + 由於伺æœå™¨ç¶­è­·æˆ–負載å•題,伺æœå™¨æš«æ™‚ç„¡æ³•è™•ç†æ‚¨çš„請求。請ç¨å¾Œé‡è©¦ã€‚ + + +----------zh-tw-- diff --git a/docs/error/HTTP_UNAUTHORIZED.html.var b/docs/error/HTTP_UNAUTHORIZED.html.var new file mode 100644 index 0000000..5bd8554 --- /dev/null +++ b/docs/error/HTTP_UNAUTHORIZED.html.var @@ -0,0 +1,423 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Server nemohl ověřit, že jste autorizován(a) k přístupu + k URL "". + BuÄ jste dodal(a) neplatné pověření (napÅ™. chybné heslo) nebo Váš + prohlížeÄ neumí dodat požadované ověření. + + + + V případÄ›, že smíte požadovat tento dokument, zkontrolujte, prosím, + VaÅ¡i uživatelskou identifikaci a heslo a zkuste to znovu. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Der Server konnte nicht verifizieren, ob Sie autorisiert sind, + auf den URL "" zuzugreifen. + Entweder wurden falsche Referenzen (z.B. ein falsches Passwort) + angegeben oder ihr Browser versteht nicht, wie die geforderten + Referenzen zu übermitteln sind. + + + + Sofern Sie für den Zugriff berechtigt sind, überprüfen + Sie bitte die eingegebene User-ID und das Passwort und versuchen Sie + es erneut. + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + This server could not verify that you are authorized to access + the URL "". + You either supplied the wrong credentials (e.g., bad password), or your + browser doesn't understand how to supply the credentials required. + + + + In case you are allowed to request the document, please + check your user-id and password and try again. + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + El servidor no puede certificar que usted esté autorizado + para acceder a la URL "". + Ha podido suministrar información incorrecta (ej. + contraseña no válida) o el navegador no sabe + cómo suministrar la información requerida. + + + + En caso de que usted tenga permiso para acceder al documento, + por favor verifique su nombre de usuario y contraseña y + vuélvalo a intentar. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + Ce server n'a pas été en mesure de vérifier que + vous êtes autorisé à accéder à cette + URL "". + + Vous avez ou bien fourni des coordonnées erronées + (p.ex. mot de passe inexact) ou bien votre navigateur ne parvient + pas à fournir les données exactes. + + + + Si vous êtes autorisé à requérir le document, + veuillez vérifier votre nom d'utilisateur et votre mot de passe + et réessayer. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Níorbh fhéidir leis an freastalaí a dheimhniú + go bhfuil an údaráis agat rochtain a dheanamh ar an URL + "". Is féidir go + soláthair tú faisnéis mícheart (m.s., + pasfhocail mícheart), nó nach dtuigeann do chuid + brabhsálaí conas an faisnéis is gá a + soláthair i gceart. + + + + Más é gur ceart go mbhéadh cead agat iarratais a + dheanamh don doiciméid, deimhnigh go bhfuil do chuid ainm + úsáideora agus pasfhocal i gceart, agus dean iarracht eile, + le do thoil. + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + Questo server non può verificare l'autorizzazione + all'accesso a "". + Questo errore potrebbe essere causato da credenziali errate + (nome utente o password errata) oppure da un browser che non + riesce a comunicare il nome utente e la password in modo corretto. + + + + Nel caso in cui ritieni di aver diritto ad accedere al documento, + controlla il nome utente e la password forniti e riprova. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + URL "" + ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ãŒã‚ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + é–“é•ã£ãŸè³‡æ ¼æƒ…å ± (例ãˆã°ã€èª¤ã£ãŸãƒ‘スワード) を入力ã—ãŸã‹ã€ + ブラウザãŒå¿…è¦ãªè³‡æ ¼æƒ…報をé€ä¿¡ã™ã‚‹æ–¹æ³•ã‚’ç†è§£ã—ã¦ã„ãªã„ã‹ã§ã™ã€‚ + + + + ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’è¦æ±‚ã§ãã‚‹ç­ˆã§ã‚ã‚‹å ´åˆã¯ã€ + ユーザ ID ã¨ãƒ‘スワードをå†ç¢ºèªã—ã¦ä¸‹ã•ã„。 + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + ì´ ì„œë²„ê°€ "" URLì„ + 접근할 수 있는 ê¶Œí•œì´ ìžˆëŠ”ì§€ 확ì¸í•˜ì§€ 못했습니다. + ìž˜ëª»ëœ ì¸ì¦ ì •ë³´(가령, ìž˜ëª»ëœ ì•”í˜¸)를 보냈거나 아니면 + 사용하시는 브ë¼ìš°ì €ê°€ 필요한 ì¸ì¦ 정보를 어떻게 보내는지 모르는 것입니다. + + + + ì´ ë¬¸ì„œë¥¼ 사용할 수 있ë„ë¡ í—ˆê°€ë¥¼ 받았는ë°ë„ ì´ëŸ°ë‹¤ë©´, + ì‚¬ìš©ìž ID와 암호를 확ì¸í•˜ì‹œê³  다시 시ë„하시기 ë°”ëžë‹ˆë‹¤. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + De server kon niet controleren of u gemachtigd bent om toegang te krijgen + tot de URL "". + U hebt zich onvoldoende geauthenticeerd ( vb : verkeerd paswoord ), of + uw browser is niet in staat de nodige authentificatiegegevens door te geven. + + + + Indien u toch gemachtigd bent toegang te krijgen tot het document, + controleer uw gebruikersnaam en paswoord en probeer opnieuw. + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + Serveren kunne ikke verifisere at du har tillatelse til Ã¥ besøke + adressen "". Enten + oppga du feil opplysninger (f.eks. feil passord) eller sÃ¥ støtter + ikke din nettleser dette autentiseringsystemet. + + + + Om du har tillatelse til Ã¥ besøke siden, vennligst kontroler ditt + brukernavn og passord og forsøk igjen. + + +----------nb-- + + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Serwer nie może zweryfikować, że masz uprawnienia dostępu do + URL-a "". + Nie podałeś prawidłowych danych autoryzacyjnych (np. hasła) + lub twoja przeglądarka nie potrafi ich przesłać. + + + + Jeśli masz prawo dostępu do żądanego dokumentu, sprawdź + podaną nazwę użytkownika i hasło. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + Este servidor não pode autorizar o seu acesso à URL + "". + Você deve ter fornecido dados incorretos (ex. senha errada), ou o seu + "browser" não fornece as credenciais necessárias. + + + + No caso de você realmente possuir permissão para este documento, + por favor checar seu login e sua senha e tentar novamente. + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + Este servidor não conseguiu validar a sua autoridade para aceder + ao URL "". + Ou forneceu as credenciais erradas (e.g.: senha incorrecta) + ou o seu browser não sabe como fornecer as credenciais + necessárias. + + + + Caso lhe seja permitido aceder ao documento, por favor verifique o + seu nome de utilizador e senha e tente de novo. + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + Acest server nu a putut verifica daca sunteti autorizat sa accesati + URL-ul "". + Ati furnizat parametrii de acreditare gresiti (ex: parola gresita), sau browserul + dumneavoastra nu poate furniza aceste detalii de acreditare. + + + + In cazul in care nu va este permis sa cereti un document, va rugam + sa va verificati numele de utilizator si parola si sa incercati din nou. + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + Сервер не Ñмог проверить данные аутентификации + на доÑтуп к "". + Ð’Ñ‹ предоÑтавили неверные учётные данные (например: пароль), или Ваш + браузер не знает, как их предоÑтавить. + + + + ЕÑли Вам разрешено запрашивать данный документ, пожалуйÑта, + проверьте Ñвои учётные данные и повторите запроÑ. + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + Овај Ñервер није могао да потврди да Ñте овлашћени да приÑтупите + УРЛ-у "". + Могуће је или да Ñте навели погрешне личне податке (нпр. нетачну лозинку), или да + ваш читач не разуме како да пошаље захтеване личне податке. + + + + Уколико вам је дозвољено да преузимате документ, молимо да + проверите Ñвоје кориÑничко име и лозинку и пробате поново. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + Servern kunde inte verifiera att du har tillåtelse att besöka + adressen "". + Antingen angav du felaktiga uppgifter (ex. fel lösenord) eller så + stödjer inte din webbläsare detta autentiseringssätt. + + + + Om du har tillåtelse att besöka sidan, vänligen kontrollera ditt + användarnamn samt lösenord och försök igen. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + Sunucu "" adresine eriÅŸim + izninizi doÄŸrulayamadı. Ya saÄŸladığınız kanıtlar yanlış (yanlış parola gibi) + ya da tarayıcınız bu kanıtların nasıl saÄŸlanacağını bilmiyor. + + + + EÄŸer eriÅŸim izniniz olduÄŸuna eminseniz, lütfen kullanıcı adınızı + ve parolanızı gözden geçirip yeniden deneyin. + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + æ­¤æœåŠ¡å™¨æ— æ³•éªŒè¯æ‚¨æ˜¯å¦æœ‰æƒè®¿é—® URL ""。 + 原因å¯èƒ½æ˜¯æ‚¨æä¾›äº†é”™è¯¯çš„凭æ®ï¼ˆä¾‹å¦‚,错误的密ç ï¼‰ï¼Œæˆ–您的æµè§ˆå™¨ä¸çŸ¥é“如何æä¾›æ‰€éœ€çš„凭æ®ã€‚ + + + + 如果您有æƒè®¿é—®è¯¥æ–‡æ¡£ï¼Œè¯·æ£€æŸ¥æ‚¨çš„用户å和密ç å¹¶é‡è¯•。 + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + 此伺æœå™¨ç„¡æ³•é©—è­‰æ‚¨æ˜¯å¦æœ‰æ¬Šè¨ªå• URL ""。 + 原因å¯èƒ½æ˜¯æ‚¨æä¾›äº†éŒ¯èª¤çš„æ†‘據(例如,錯誤的密碼),或您的ç€è¦½å™¨ä¸çŸ¥é“如何æä¾›æ‰€éœ€çš„æ†‘據。 + + + + 如果您有權訪å•該文檔,請檢查您的使用者å和密碼並é‡è©¦ã€‚ + + +----------zh-tw-- diff --git a/docs/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var b/docs/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var new file mode 100644 index 0000000..29adee5 --- /dev/null +++ b/docs/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var @@ -0,0 +1,252 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Server nepodporuje typ prostÅ™edku (media) pÅ™eneseného v požadavku. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Das bei der Anfrage übermittelte Format (Media Type) + wird vom Server nicht unterstützt. + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + The server does not support the media type transmitted in the request. + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + El servidor no soporta el tipo + de medio transmitido en la solicitud. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + Le serveur ne supporte pas le type de média utilisé + dans votre requête. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Ní tachaíonn an fhreastalaí an cineáil + meán a sheoladh san iarratais. + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + Il server non è in grado di gestire il + tipo del formato dei dati trasmesso nella richiesta. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + ãƒªã‚¯ã‚¨ã‚¹ãƒˆã§æŒ‡å®šã•れãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚¿ã‚¤ãƒ—ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。 + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + 요청으로 보내온 미디어 형ì‹ì„ ì´ ì„œë²„ê°€ ì§€ì›í•˜ì§€ 않습니다. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + De server ondersteunt het gevraagde formaat ( media type ) niet. + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + Serveren støtter ikke den mediatypen som ble forespurt. + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Serwer nie zna typu danych przesłanych w żądaniu. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + O servidor não suporta o tipo de mídia + transmitida nesta requisição. + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + O servidor não suporta o media type transmitido no pedido. + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + Serverul nu suporta tipul de date trimise in cerere. + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + Сервер не поддерживает работу Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ типом данных. + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + Сервер не подржава врÑту медија пренеÑену у захтеву. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + Servern stödjer inte den mediatyp som skickats i förfrågan. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + Sunucu, istekte belirtilen ortam türünü desteklemiyor. + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + æœåС噍䏿”¯æŒè¯·æ±‚中传输的媒体类型。 + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + 伺æœå™¨ä¸æ”¯æŒè«‹æ±‚中傳輸的媒體型å¼ã€‚ + + +----------zh-tw-- diff --git a/docs/error/HTTP_VARIANT_ALSO_VARIES.html.var b/docs/error/HTTP_VARIANT_ALSO_VARIES.html.var new file mode 100644 index 0000000..9de84b1 --- /dev/null +++ b/docs/error/HTTP_VARIANT_ALSO_VARIES.html.var @@ -0,0 +1,278 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- + + + Varianta požadované entity má sama více variant. Přístup není možný. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- + + + Ein Zugriff auf das angeforderte Objekt bzw. einer + Variante dieses Objektes ist nicht möglich, da es ebenfalls + ein variables Objekt darstellt. + + +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- + + + A variant for the requested entity + is itself a negotiable resource. + Access not possible. + + +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- + + + + Una variante de la entidad solicitada es por si misma + un recurso negociable. + No es posible tener acceso a la entidad. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- + + + Une variante pour l'entité demandée + est elle-même une ressource négociable. + L'accès est impossible. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- + + + Is é ceann de na athraithaí + don aonán iarraithe acmhainn + intráchta féin. + Rochtain dodhéanta. + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- + + + Non è possibile accedere all'entità + richiesta perché è essa stessa + una risorsa negoziabile. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- + + + リクエストã•れãŸã‚‚ã®ã® variant + ã¯ãれ自体もã¾ãŸã€ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³å¯èƒ½ãªãƒªã‚½ãƒ¼ã‚¹ã§ã™ã€‚ + アクセスã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- + + + 요청한 ê°ì²´ì˜ 형태 ë˜í•œ 여러 형태를 가지고 있어서 + ì ‘ê·¼ì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- + + + Een variant van het gevraagde object + is op zich ook een te onderhandelen variant. + Toegang is niet mogelijk. + + +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- + + + En variant av den forespurte enheten er i seg selv en forhandelbar + ressurs. Tilgang ikke mulig. + + +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- + + + Wariant żądanego zasobu jest również zasobem negocjowalnym. + Dostęp jest niemożliwy. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- + + + Uma variante da entidade de requisição + é por si mesma um recurso negociável. + Acesso não é possível. + + +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- + + + A variante relativa à entidade pedida é ela mesma + um recurso negociável. Não é possível + ter acesso. + + +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- + + + O varianta pentru entitatea ceruta + este ea insasi o resursa negociabila. + Accesul nu este posibil. + + +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- + + + Вариант запрашиваемого объекта - и Ñам реÑÑƒÑ€Ñ Ð½ÐµÐ¿Ð¾ÑтоÑнный. + ДоÑтуп к объекту невозможен. + + +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- + + + Варијанта захтеваног ентитета + је и Ñама реÑÑƒÑ€Ñ ÐºÐ¾Ñ˜Ð¸ поÑтоји у више варијанти. + ПриÑтуп није могућ. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- + + + En variant av den förfrågade enheten är i + sig själv en giltig resurs. Åtkomst är inte + möjlig. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- + + + İstenen gösterim çeÅŸidinin kendisi zaten kendi içinde uzlaşımlı. + EriÅŸim mümkün deÄŸil. + + +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- + + + 请求实体的一个å˜å…ƒè‡ªèº«æ˜¯ä¸€ä¸ªå¯è¢«å商的资æºã€‚无法访问。 + + +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- + + + 請求實體的一個變元自身是一個å¯è¢«å”商的資æºã€‚無法訪å•。 + + +----------zh-tw-- diff --git a/docs/error/README b/docs/error/README new file mode 100644 index 0000000..fd9de91 --- /dev/null +++ b/docs/error/README @@ -0,0 +1,40 @@ + + Multi Language Custom Error Documents + ------------------------------------- + + The 'error' directory contains HTTP error messages in multiple languages. + If the preferred language of a client is available it is selected + automatically via the MultiViews feature. This feature is enabled + by default via the Options, Language and ErrorDocument directives. + + You may configure the design and markup of the documents by modifying + the HTML files in the directory 'error/include'. + + Supported Languages: + + +-----------------------+------------------------------------------+ + | Language | Contributed by | + +-----------------------+------------------------------------------+ + | Brazilian (pt-br) | Ricardo Leite | + | Chinese (zh-cn/zh-tw) | CodeingBoy & popcorner | + | Czech (cs) | Marcel Kolaja | + | Dutch (nl) | Peter Van Biesen | + | English (en) | Lars Eilebrecht | + | French (fr) | Cecile de Crecy | + | German (de) | Lars Eilebrecht | + | Italian (it) | Luigi Rosa | + | Japanese (ja) | TAKAHASHI Makoto | + | Korean (ko) | Jaeho Shin | + | Norwegian BokmÃ¥l (nb) | Tom Fredrik Klaussen | + | Polish (pl) | Tomasz Kepczynski | + | Romanian (ro) | Andrei Besleaga | + | Russian (ru) | Alexander Gaganashvili | + | Serbian (sr) | Nikola Smolenski | + | Spanish (es) | Karla Quintero | + | Swedish (sv) | Thomas Sjögren | + | Turkish (tr) | Emre Sokullu & Nilgün Belma Bugüner | + | Irish (ga) | Noirin Shirley | + +-----------------------+------------------------------------------+ + (Please see http://httpd.apache.org/docs-project/ if you would + like to contribute the pages in an additional language.) + diff --git a/docs/error/contact.html.var b/docs/error/contact.html.var new file mode 100644 index 0000000..bcae258 --- /dev/null +++ b/docs/error/contact.html.var @@ -0,0 +1,153 @@ +Content-language: cs +Content-type: text/html; charset=UTF-8 +Body:----------cs-- +Pokud si myslíte, že toto je chyba serveru, kontaktujte, prosím, +">webmastera. +----------cs-- + +Content-language: de +Content-type: text/html; charset=UTF-8 +Body:----------de-- +Sofern Sie dies für eine Fehlfunktion des Servers halten, +informieren Sie bitte den +">Webmaster +hierüber. +----------de-- + +Content-language: en +Content-type: text/html; charset=UTF-8 +Body:----------en-- +If you think this is a server error, please contact +the ">webmaster. +----------en-- + +Content-language: es +Content-type: text/html +Body:----------es-- +Si usted cree que esto es un error del servidor, por favor comuníqueselo al +">administrador +del portal. +----------es-- + +Content-language: fr +Content-type: text/html; charset=UTF-8 +Body:----------fr-- +Si vous pensez qu'il s'agit d'une erreur du serveur, veuillez contacter le +">webmestre. +----------fr-- + +Content-language: ga +Content-type: text/html; charset=UTF-8 +Body:----------ga-- +Má cheapann tú gur earráid fhreastalaí í seo, +téigh i dteagmháil leis an +"> +stiúrthóir gréasáin, le do thoil. +----------ga-- + +Content-language: it +Content-type: text/html; charset=UTF-8 +Body:----------it-- +Se pensi che questo sia un errore del server, per favore contatta il +">webmaster. +----------it-- + +Content-language: ja +Content-type: text/html; charset=UTF-8 +Body:----------ja-- +サーãƒãƒ¼ã®éšœå®³ã¨æ€ã‚れる場åˆã¯ã€" +>ウェブ管ç†è€…ã¾ã§ã”連絡ãã ã•ã„。 +----------ja-- + +Content-language: ko +Content-type: text/html; charset=UTF-8 +Body:----------ko-- +만약 ì´ê²ƒì´ 서버 오류ë¼ê³  ìƒê°ë˜ë©´, +">웹 관리ìžì—게 ì—°ë½í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤. +----------ko-- + +Content-language: nl +Content-type: text/html; charset=UTF-8 +Body:----------nl-- +Indien u van oordeel bent dat deze server in fout is, gelieve +de ">webmaster te contacteren. +----------nl-- + +Content-language: nb +Content-type: text/html; charset=UTF-8 +Body:----------nb-- +Om du tror dette skyldes en serverfeil, venligst kontakt +">webansvarlig. +----------nb-- + +Content-language: pl +Content-type: text/html; charset=UTF-8 +Body:----------pl-- +Jeśli myślisz, że jest to błąd tego serwera, skontaktuj się z +">administratorem. +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=UTF-8 +Body:-------pt-br-- +Se você acredita ter encontrado um problema no servidor, +por favor entre em contato com o +">webmaster. +-------pt-br-- + +Content-language: pt +Content-type: text/html; charset=ISO-8859-1 +Body:----------pt-- +Se considera que o servidor está errado, por favor contacte o +">webmaster. +----------pt-- + +Content-language: ro +Content-type: text/html; charset=UTF-8 +Body:----------ro-- +Va rugam sa il contactati pe +">webmaster +in cazul in care credeti ca aceasta este o eroare a serverului. +----------ro-- + +Content-language: ru +Content-type: text/html; charset=UTF-8 +Body:----------ru-- +ЕÑли Ð’Ñ‹ Ñчитаете, что Ñто ошибка Ñервера, пожалуйÑта, Ñообщите об Ñтом +">веб-маÑтеру. +----------ru-- + +Content-language: sr +Content-type: text/html; charset=UTF-8 +Body:----------sr-- +Ðко миÑлите да је ово грешка Ñервера, молимо обавеÑтите +">вебмаÑтера. +----------sr-- + +Content-language: sv +Content-type: text/html; charset=UTF-8 +Body:----------sv-- +Om du tror att detta beror på ett serverfel, vänligen kontakta +">webbansvarig. +----------sv-- + +Content-language: tr +Content-type: text/html; charset=UTF-8 +Body:----------tr-- +Bunun bir sunucu hatası olduğunu düşÃ¼nüyorsanız, lütfen +">site +yöneticisi ile iletişime geçin. +----------tr-- + +Content-language: zh-cn +Content-type: text/html; charset=UTF-8 +Body:----------zh-cn-- +如果您认为这是一个æœåŠ¡å™¨é”™è¯¯ï¼Œè¯·è”ç³»">网站管ç†å‘˜ã€‚ +----------zh-cn-- + +Content-language: zh-tw +Content-type: text/html; charset=UTF-8 +Body:----------zh-tw-- +如果您èªç‚ºé€™æ˜¯ä¸€å€‹ä¼ºæœå™¨éŒ¯èª¤ï¼Œè«‹è¯ç¹«">網站管ç†å“¡ã€‚ +----------zh-tw-- diff --git a/docs/error/include/bottom.html b/docs/error/include/bottom.html new file mode 100644 index 0000000..971de02 --- /dev/null +++ b/docs/error/include/bottom.html @@ -0,0 +1,12 @@ +

    +

    + +

    + +

    Error

    +
    +
    + +
    + + diff --git a/docs/error/include/spacer.html b/docs/error/include/spacer.html new file mode 100644 index 0000000..7d5e595 --- /dev/null +++ b/docs/error/include/spacer.html @@ -0,0 +1,2 @@ +

    +

    diff --git a/docs/error/include/top.html b/docs/error/include/top.html new file mode 100644 index 0000000..ae63020 --- /dev/null +++ b/docs/error/include/top.html @@ -0,0 +1,21 @@ + + +" xml:lang=""> + +<!--#echo encoding="none" var="TITLE" --> +" /> + + + + +

    +

    diff --git a/docs/icons/README b/docs/icons/README new file mode 100644 index 0000000..48250d5 --- /dev/null +++ b/docs/icons/README @@ -0,0 +1,166 @@ +Public Domain Icons + + These icons were originally made for Mosaic for X and have been + included in the NCSA httpd and Apache server distributions in the + past. They are in the public domain and may be freely included in any + application. The originals were done by Kevin Hughes (kevinh@kevcom.com). + Andy Polyakov tuned the icon colors and added a few new images. + + If you'd like to contribute additions to this set, contact the httpd + documentation project . + + Almost all of these icons are 20x22 pixels in size. There are + alternative icons in the "small" directory that are 16x16 in size, + provided by Mike Brown (mike@hyperreal.org). + +Suggested Uses + +The following are a few suggestions, to serve as a starting point for ideas. +Please feel free to tweak and rename the icons as you like. + + a.gif + This might be used to represent PostScript or text layout + languages. + + alert.black.gif, alert.red.gif + These can be used to highlight any important items, such as a + README file in a directory. + + back.gif, forward.gif + These can be used as links to go to previous and next areas. + + ball.gray.gif, ball.red.gif + These might be used as bullets. + + binary.gif + This can be used to represent binary files. + + binhex.gif + This can represent BinHex-encoded data. + + blank.gif + This can be used as a placeholder or a spacing element. + + bomb.gif + This can be used to represent core files. + + box1.gif, box2.gif + These icons can be used to represent generic 3D applications and + related files. + + broken.gif + This can represent corrupted data. + + burst.gif + This can call attention to new and important items. + + c.gif + This might represent C source code. + + comp.blue.gif, comp.gray.gif + These little computer icons can stand for telnet or FTP + sessions. + + compressed.gif + This may represent compressed data. + + continued.gif + This can be a link to a continued listing of a directory. + + down.gif, up.gif, left.gif, right.gif + These can be used to scroll up, down, left and right in a + listing or may be used to denote items in an outline. + + dir.gif + Identical to folder.gif below. + + diskimg.gif + This can represent floppy disk storage. + + dvi.gif + This can represent DVI files. + + f.gif + This might represent FORTRAN or Forth source code. + + folder.gif, folder.open.gif, folder.sec.gif + The folder can represent directories. There is also a version + that can represent secure directories or directories that cannot + be viewed. + + generic.gif, generic.sec.gif, generic.red.gif + These can represent generic files, secure files, and important + files, respectively. + + hand.right.gif, hand.up.gif + These can point out important items (pun intended). + + image1.gif, image2.gif, image3.gif + These can represent image formats of various types. + + index.gif + This might represent a WAIS index or search facility. + + layout.gif + This might represent files and formats that contain graphics as + well as text layout, such as HTML and PDF files. + + link.gif + This might represent files that are symbolic links. + + movie.gif + This can represent various movie formats. + + p.gif + This may stand for Perl or Python source code. + + pie0.gif ... pie8.gif + These icons can be used in applications where a list of + documents is returned from a search. The little pie chart images + can denote how relevant the documents may be to your search + query. + + patch.gif + This may stand for patches and diff files. + + portal.gif + This might be a link to an online service or a 3D world. + + pdf.gif, ps.gif, quill.gif + These may represent PDF and PostScript files. + + screw1.gif, screw2.gif + These may represent CAD or engineering data and formats. + + script.gif + This can represent any of various interpreted languages, such as + Perl, python, TCL, and shell scripts, as well as server + configuration files. + + sound1.gif, sound2.gif + These can represent sound files. + + sphere1.gif, sphere2.gif + These can represent 3D worlds or rendering applications and + formats. + + tar.gif + This can represent TAR archive files. + + tex.gif + This can represent TeX files. + + text.gif + This can represent generic (plain) text files. + + transfer.gif + This can represent FTP transfers or uploads/downloads. + + unknown.gif + This may represent a file of an unknown type. + + uu.gif, uuencoded.gif + This can stand for uuencoded data. + + world1.gif, world2.gif + These can represent 3D worlds or other 3D formats. diff --git a/docs/icons/README.html b/docs/icons/README.html new file mode 100644 index 0000000..a8b82b9 --- /dev/null +++ b/docs/icons/README.html @@ -0,0 +1,815 @@ + + + + + +

    Public Domain Icons

    + +

    These icons were originally made for Mosaic for X and have been +included in the NCSA httpd and Apache server distributions in the +past. They are in the public domain and may be freely included in any +application. The originals were done by Kevin Hughes (kevinh@kevcom.com). +Andy Polyakov tuned the icon colors and added few new images.

    + +

    If you'd like to contribute additions to this set, contact the httpd +documentation project http://httpd.apache.org/docs-project/.

    + +

    Almost all of these icons are 20x22 pixels in size. There are +alternative icons in the "small" directory that are 16x16 in size, +provided by Mike Brown (mike@hyperreal.org).

    + +

    Suggested Uses

    + +

    The following are a few suggestions, to serve as a starting point for ideas. +Please feel free to tweak and rename the icons as you like.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + a.gif +
    a.png
    This might be used to represent PostScript or text layout +languages.
    + alert.black.gif +
    alert.black.png
    + alert.red.gif +
    alert.red.png
    These can be used to highlight any important items, +such as a README file in a directory.
    + back.gif +
    back.png
    + forward.gif +
    forward.png
    + small.gif +
    small/back.png
    + small/forward.gif +
    small/forward.png
    These can be used as links to go to previous and next +areas.
    + ball.gray.gif +
    ball.gray.png
    + ball.red.gif +
    ball.red.png
    These might be used as bullets.
    + binary.gif +
    binary.png
    + small/binary.gif +
    small/binary.png
    This can be used to represent binary files.
    + binhex.gif +
    binhex.png
    + small/binhex.gif +
    small/binhex.png
    This can represent BinHex-encoded data.
    + blank.gif +
    blank.png
    + small/blank.gif +
    small/blank.png
    This can be used as a placeholder or a spacing +element.
    + bomb.gif +
    bomb.png
    This can be used to represent core files.
    + box1.gif +
    box1.png
    + box2.gif +
    box2.png
    These icons can be used to represent generic 3D +applications and related files.
    + broken.gif +
    broken.png
    + small/broken.gif +
    small/broken.png
    This can represent corrupted data.
    + burst.gif +
    burst.png
    + small/burst.gif +
    small/burst.png
    This can call attention to new and important items.
    + c.gif +
    c.png
    This might represent C source code.
    + comp.blue.gif +
    comp.blue.png
    + comp.gray.gif +
    comp.gray.png
    + small/comp1.gif +
    small/comp1.png
    + small/comp2.gif +
    small/comp2.png
    These little computer icons can stand for telnet or FTP +sessions.
    + compressed.gif +
    compressed.png
    + small/compressed.gif +
    small/compressed.png
    This may represent compressed data.
    + continued.gif +
    continued.png
    + small/continued.gif +
    small/continued.png
    This can be a link to a continued listing of a +directory.
    + down.gif +
    down.png
    + up.gif +
    up.png
    + left.gif +
    left.png
    + right.gif +
    right.png
    These can be used to scroll up, down, left and right in a +listing or may be used to denote items in an outline.
    + dir.gif +
    dir.png
    Identical to folder.gif (.png) below.
    + diskimg.gif +
    diskimg.png
    This can represent floppy disk storage.
    + small/doc.gif +
    small/doc.png
    This can represent document files.
    + dvi.gif +
    dvi.png
    This can represent DVI files.
    + f.gif +
    f.png
    This might represent FORTRAN or Forth source code.
    + folder.gif +
    folder.png
    + folder.open.gif +
    folder.open.png
    + folder.sec.gif +
    folder.sec.png
    + small/folder.gif +
    small/folder.png
    + small/folder2.gif +
    small/folder2.png
    The folder can represent directories. There is also a +version that can represent secure directories or directories that cannot +be viewed.
    + generic.gif +
    generic.png
    + generic.sec.gif +
    generic.sec.png
    + generic.red.gif +
    generic.red.png
    + small/generic.gif +
    small/generic.png
    + small/generic2.gif +
    small/generic2.png
    + small/generic3.gif +
    small/generic3.png
    These can represent generic files, secure files, and +important files, respectively.
    + hand.right.gif +
    hand.right.png
    + hand.up.gif +
    hand.up.png
    These can point out important items (pun intended).
    + image1.gif +
    image1.png
    + image2.gif +
    image2.png
    + image3.gif +
    image3.png
    + small/image.gif +
    small/image.png
    + small/image2.gif +
    small/image2.png
    These can represent image formats of various types.
    + index.gif +
    index.png
    + small/index.gif +
    small/index.png
    This might represent a WAIS index or search facility.
    + small/key.gif +
    small/key.png
    This might represent a locked file.
    + layout.gif +
    layout.png
    This might represent files and formats that contain +graphics as well as text layout, such as HTML and PDF files.
    + link.gif +
    link.png
    This might represent files that are symbolic links.
    + movie.gif +
    movie.png
    + small/movie.gif +
    small/movie.png
    This can represent various movie formats.
    + p.gif +
    p.png
    This may stand for Perl or Python source code.
    + pie0.gif +
    pie0.png
    + pie1.gif +
    pie1.png
    + pie2.gif +
    pie2.png
    + pie3.gif +
    pie3.png
    + pie4.gif +
    pie4.png
    + pie5.gif +
    pie5.png
    + pie6.gif +
    pie6.png
    + pie7.gif +
    pie7.png
    + pie8.gif +
    pie8.png
    These icons can be used in applications where a list of +documents is returned from a search. The little pie chart images +can denote how relevant the documents may be to your search query.
    + patch.gif +
    patch.png
    + small/patch.gif +
    small/patch.png
    This may stand for patches and diff files.
    + portal.gif +
    portal.png
    This might be a link to an online service or a 3D +world.
    + pdf.gif +
    pdf.png
    + ps.gif +
    ps.png
    + quill.gif +
    quill.png
    + small/ps.gif +
    small/ps.png
    These may represent PDF and PostScript files.
    + screw1.gif +
    screw1.png
    + screw2.gif +
    screw2.png
    These may represent CAD or engineering data and +formats.
    + script.gif +
    script.png
    This can represent any of various interpreted languages, +such as Perl, python, TCL, and shell scripts, as well as server configuration +files.
    + sound1.gif +
    sound1.png
    + sound2.gif +
    sound2.png
    + small/sound.gif +
    small/sound.png
    + small/sound2.gif +
    small/sound2.png
    These can represent sound files.
    + sphere1.gif +
    sphere1.png
    + sphere2.gif +
    sphere2.png
    These can represent 3D worlds or rendering applications and +formats.
    + tar.gif +
    tar.png
    + small/tar.gif +
    small/tar.png
    This can represent TAR archive files.
    + tex.gif +
    tex.png
    This can represent TeX files.
    + text.gif +
    text.png
    + small/text.gif +
    small/text.png
    This can represent generic (plain) text files.
    + transfer.gif +
    transfer.png
    + small/transfer.gif +
    small/transfer.png
    This can represent FTP transfers or uploads/downloads.
    + unknown.gif +
    unknown.png
    + small/unknown.gif +
    small/unknown.png
    This may represent a file of an unknown type.
    + uu.gif +
    uu.png
    + uuencoded.gif +
    uuencoded.png
    + small/uu.gif +
    small/uu.png
    This can stand for uuencoded data.
    + world1.gif +
    world1.png
    + world2.gif +
    world2.png
    These can represent 3D worlds or other 3D formats.
    + + diff --git a/docs/icons/a.gif b/docs/icons/a.gif new file mode 100644 index 0000000000000000000000000000000000000000..bb23d971f4ce99b43dcadc7179deab4e3f55d2fd GIT binary patch literal 246 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIn&tKm;nhW{__jT$ShV!EGkg|Qki)QB^jv- z1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf2nHIbDd^F&3SUp#HU#9hW!Rw()J9@9Pc4|E2W2srx z@ZjD%n_KH1+_viO4gW0IG)3`1D5IB^&A~|*Z0siQ)e*Jc?U}v(RZqm-rsn%xldEMP i9?8v^arV~QxusXc{Vzw0+BY`Y83|alcZ6{=SOWlx{aaiB literal 0 HcmV?d00001 diff --git a/docs/icons/a.png b/docs/icons/a.png new file mode 100644 index 0000000000000000000000000000000000000000..98fd358b7e050ee97ed023f1a68910a4a9b9ca1b GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DgFST5ZC|z|DXB)f9A}Y#>U1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~s5(bL5-gd^JZ^hHiqMIM)n-dh?= zK12i^m>h9H>2kgAZ^4VdOC=*|1(g_XEQlqBcp=BDPA zFoa}e7Aqtcl_&tI%shpXj8uh!(xjZsWQCOc+{Da0Jq7R7GN6PNWsw3(zNW``#C@x7(8A5T-G@yGywpj6Kg#H literal 0 HcmV?d00001 diff --git a/docs/icons/alert.black.gif b/docs/icons/alert.black.gif new file mode 100644 index 0000000000000000000000000000000000000000..eaecd2172a091ee2994c73f33e784e336b23b58b GIT binary patch literal 242 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIn&tKm;nhW{__jT$ShV!EGkg|Qki)QB^jv- z1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf2sTRBTd^F&3SUp#HU#9hW!Eiwp#*PQqrY@^+(mQa9 zIq>=_)6J=N(?l8rJU#@b9ZU?|#8k#|TH+FuDboTL$LCUaCvA&aeP+vAqk{>XuXw(F ebwjlD^Y4U1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~s5#M8wwgd;ll^g-SR10I%xqJGSI zie8K^WsDp<|Iey8qUezl|9QvZGiTPU)>3acp;T+&G{LoM(~jRME-EXx`pR{GNZuVk zE!+LZ-EV(#)YtaKTs-lGk>S0ljl6z~F3|k264!{5r>mdKI;Vst07_$JasU7T literal 0 HcmV?d00001 diff --git a/docs/icons/alert.red.gif b/docs/icons/alert.red.gif new file mode 100644 index 0000000000000000000000000000000000000000..a4238940433deedd024eb0cada54be82e8f47db0 GIT binary patch literal 247 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 J<8Z*n{{w}=kCOlZ literal 0 HcmV?d00001 diff --git a/docs/icons/apache_pb.png b/docs/icons/apache_pb.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3f6471377f99d8fc39b72ab0ffa6f8a5cc0720 GIT binary patch literal 9691 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 M$tug#NErqH4^^37bN~PV literal 0 HcmV?d00001 diff --git a/docs/icons/apache_pb.svg b/docs/icons/apache_pb.svg new file mode 100644 index 0000000..a7b963f --- /dev/null +++ b/docs/icons/apache_pb.svg @@ -0,0 +1,5879 @@ + + + + + + Powered By: Apache 2.4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Powered By: Apache 2.4 + October 2nd, 2012 + + + Daniel Gruno [humbedooh@apache.org] + + + + + Copyright 2012, Apache Software Foundation + + + + + Apache Software Foun + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Powered by httpd 2.4 + + + + + + + + + + + + + + diff --git a/docs/icons/apache_pb2.gif b/docs/icons/apache_pb2.gif new file mode 100644 index 0000000000000000000000000000000000000000..c81cfc6c09cd24faed58197fd0aa68e787dce2f9 GIT binary patch literal 4234 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 literal 0 HcmV?d00001 diff --git a/docs/icons/back.gif b/docs/icons/back.gif new file mode 100644 index 0000000000000000000000000000000000000000..a694ae1ec3f0636cddbf195dd151abff150af69f GIT binary patch literal 216 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIWsLS&DhwO0R|NR`GsU;7Aqtcl_&tI%shpX zj8uh!(xjZsWQCOc+{Da0Jq7R7GN6P8 zTBKlTX=%!!_>+Z^fq{`h2V@1vb_Ql|iCuU8DGPkc5-<+lz3AMXubFeq{lvP)Ggp6^Q($uOC~PM5!3Knu5hd8zzVA-2Z^g;lkQyz{qtht`EC{l FYXAcbPG|rC literal 0 HcmV?d00001 diff --git a/docs/icons/back.png b/docs/icons/back.png new file mode 100644 index 0000000000000000000000000000000000000000..a97b41e4c16a20aca70bf494e3731c3cc1112ced GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DWL$L5ZC|z|DXB)f9A}YX=!Q3 z#>PP5dEK*~11YAGAiv=M3{STkcma8gN#5=*3>~bp9zaflr;B35ZCoxtISr$e06<$+*xY- zUC-o{?ItqmT{a sWjLf}mgoVE&`}6ZEhtINO-e0NFtoHZE&KL<4$uY$Pgg&ebxsLQ0Q>81lmGw# literal 0 HcmV?d00001 diff --git a/docs/icons/ball.gray.gif b/docs/icons/ball.gray.gif new file mode 100644 index 0000000000000000000000000000000000000000..eb84268c4ccf0146e661f51e63fc7d958d39111f GIT binary patch literal 233 zcmZ?wbhEHb6k!l!c+9}?|Ns9pKy>EJ?%lg*&YaoN(UF#x78)9AY;4Sc4JiKe3(3eV zR!A%=Q2NWsw3(v(5*CkrD310#bD$U2a#7+72kPI#`~Yw`N*?)jcGYB&?6 zl*5^v5@j;O_zpaf^Qf7s_EE`__xyKmPTmvoe(9bH{5w=PbF!#4X}t_l`&F_3!G;Q* IP6h^R09S}j761SM literal 0 HcmV?d00001 diff --git a/docs/icons/ball.gray.png b/docs/icons/ball.gray.png new file mode 100644 index 0000000000000000000000000000000000000000..75a6b76eb37ef5b05d631227d4b3e57234374903 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DY*cj5ZC|z|DOS(GiP@1-aT{X z%#MzZw6wI)&`@JzW1x~>;uo@j6jMo%U+{m1r`rv@fIP+|Z+91l4pvzYAjiwo#W92< zI$5BFnJs9har&Vdll1b07oO4dNt`OMY>9Dk#8DTH%SToBG9N4Pe&1qr`I6RyGoSiq z3M_lj(|68q#?HA4jwQDjH2A17JaClHn7M!Ze4wdeC9V-A$@#gtsd*&~AsLy)3W-G} z3P36|PoX3uRiU6XDJL^oAtgUIF*8q3!8^4KDB)3>o{?ItqmT{aWjLf}mgoVE&`}6Z gEhtINO-e0NFtoHZE&KL<4$uY$Pgg&ebxsLQ0I)%7&Hw-a literal 0 HcmV?d00001 diff --git a/docs/icons/ball.red.gif b/docs/icons/ball.red.gif new file mode 100644 index 0000000000000000000000000000000000000000..a8425cb574b1e4250b8cd35656432245cf4b51c8 GIT binary patch literal 205 zcmZ?wbhEHb6k!l!IK;s49|&g7{BLZ0=KudR1_V(2=NFQZS*(y)RH6W+GV>HlGEx-^ zN|SOjlND0(a}zW3^c1{P%YYIdrRf=|#X1VvAYO(;YG#REa(=FkLU3w9NosCVYLSAW zrKKr@;!hSv1_ovZ9grm;+ZmW0EOy=bXK>1Mb*$?2=q7RLtBj2b0*O~xQ!1DFD^5{O pJnUyaTmRk(8|hQW8HD_tlL9-OLb*IseTr8`t-rA*Y$5}LH2|rsMHm18 literal 0 HcmV?d00001 diff --git a/docs/icons/ball.red.png b/docs/icons/ball.red.png new file mode 100644 index 0000000000000000000000000000000000000000..983ebd34239f3badd623ae7202199d0a40b78116 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DWL$L5ZC`eFmvXAW8*Xb|EB>3 z85ky9+gS>vSW1HYf`O6@4q7X}0Qrnb-tI089jvk*K#sSki(?4K%w&T$X11W23l|zJ zTe%>>V2b346;HSlXK@*Etz>bY(bc7;7qD!?gh|>{RxWwMly0@N#c9SdMZIEJ%$YNdjg1*#K=GenNJeI{LSj*g0+7ngQz*$u zRVXM;%E?StNXgGl%*@kM@J=lQN_do}XQUSEC}e|p84jtLC3?yExjG8LsRbpexk;%- z3Wk=JrVNTdSr{1@7#VaxR)B10V9xZ|wdbROfWzv!D*Gb21Y#8#gjW{Ev9DOlxiI_H z)^#HHvm9UiDQlh^nDJt>gl6-T1rM0J@~%VW#e jit!gMUf+_g-~76GhV}Y)-JD*HO`g_*&g~t+oD9|gOVnOa literal 0 HcmV?d00001 diff --git a/docs/icons/binary.png b/docs/icons/binary.png new file mode 100644 index 0000000000000000000000000000000000000000..c86d3e9b8f15aa545dc1a3999e2453f181013af2 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DWL$L5ZC|z|DOS(GiPSboM~)q z3>2QY^)wHVVk!yp3;xgWbi08UkjI$h?e48 zTBKlTX=%!!_>+Z^fq{`h2V@1vb_V85k6n8{8VES7o~yDia@YFk=4>QQyf+b%kUIiE6v`j kq<41P{%f~vu3nm((IxdxXZmdxm!@WCGePSPUrq*V0OwX&D*ylh literal 0 HcmV?d00001 diff --git a/docs/icons/binhex.png b/docs/icons/binhex.png new file mode 100644 index 0000000000000000000000000000000000000000..5b34c87fad443477ebf7b48827eb5fffc858d6ed GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DWL$L5ZC|z|DXB)f9A}YX=!Q3 z#>PP5dEK*~11YAGAiv=M3{STkcma8gN#5=*3>~bp9zagEr;B3?hb<3tIkZzt}Ib>A#lmqN`5)O#R0TS*`}pkd%~Ca=$2W%I%ZW3xySOW?QbsU75{o zkrd>kWd0z7^=q3fhw$xfMUmG(e(6j!UVG@>E&lr7FOzhySS<42bmjvybCaS>MzSHu z@nI#d5hcm_xw)x%B@7`MnZ*i;MI{PADl<=^BqLR!pfo8bGg%=eKQ}QmPfx)+wG1fX zQJS8STCAgx4dP`uq-K`r0gcd62u>|1NzF}4EmAPFv@|XI_I?h~1_n=8KbLh*2~7Zv COK`IQ literal 0 HcmV?d00001 diff --git a/docs/icons/blank.gif b/docs/icons/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..0ccf01e1983e40365a9ab9f373b6fc497c8603cd GIT binary patch literal 148 zcmZ?wbhEHb6k!l!SjfQe|Ns9p|Nk?9f#N^Ekc`Y?g~Xx~1t67~r%;lSs!&jxl#`jP zkdmL9n3<=i;GJ3ql<+7`&qyuSQOE}IG8|GfOZ1ZSb9EGgQwvH`bCXhw6bvmbO&Jt_ pvM@3*Ff!-Xz$Dz$zw-23{>5{)-0I$ZZ_jW3Hcv(dYXE)}F?;|3 literal 0 HcmV?d00001 diff --git a/docs/icons/blank.png b/docs/icons/blank.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd29a8fda8a542208b5189bf05b0d74fe64b356 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0$P6TZ_3OC;DYgKg5ZC|z|DXB)zc_H+QlJP^ zNswRge}<>q4ZMIn#w2fd7lsa2Sq~tG-_yl0ghMv@&-o7%C$dQ}L}qGj?=1M41C$CY zag8WR&d<$F%`0ID$;d2LNGvK*08*KG3MCn-3I(M}Ihn}{DfzjHnR$8&-l=6k36IkB zjMQQsg=`Qn!yz@ZL=R|$jzVy1K}l+EQfiTcp{1p1*|+y|fHp9Ay85}Sb4q9e0FF0A AIsgCw literal 0 HcmV?d00001 diff --git a/docs/icons/bomb.gif b/docs/icons/bomb.gif new file mode 100644 index 0000000000000000000000000000000000000000..270fdb1c064a678acb8764f49dfab1e4930a437c GIT binary patch literal 308 zcmZ?wbhEHb6k!l!c+9}?9|+DEp8*nQ&g|a3d*;lU9UUEMX=$OMp~l9>3>ZN1pI=Bu zX0bwIQHcVO%FI(J$w*ZwC{4=AOjbzA&rQtC(^K$HEdxq;l%{8-7V9WvgLoMZshK5u z$@#fD3c;xbC8@bdsYMEgmX@Xria%Kx85o!tbU=22T*biBZ*bCc`Hl#c1H12gmgUBI zw%rtC;M!28($IJJckPX3ES?w2x?Bo89C=txUT3k?l5HZ}&Tx;gEOCXiw-3Gxg6|DWOdDPBh)modrP-G!lpRn`N@ne6G} z7{U?ldTt}{Ap-%{3;K#GZ%*-YS2SG->2XL_j8IUXz^dUSdg-T@atdpn*ST-5e_p+O zU6X!f*3IgEPNC#~M`B(~5}tKy*CnssmtTE0xP;uYO_;g!OxnyFZP}T;stXFIcUp(s zI{o)gSe@VB#j9QHz9k2>DQZo>?V;U%;*_(>rS#eQuZ>n-7uG!_5%py9Jkx*d6_$<$ z;=!REK<9;(xJHyD=jZ08=9MsnWMmdABo>t@0IAG8g_4X^g@V$goXli}l>FSp%sf2> z@6XnDYZz!(9+Vh?A!Y}KpPl5UHx3v IIVCg!0B5d|(*OVf literal 0 HcmV?d00001 diff --git a/docs/icons/box1.gif b/docs/icons/box1.gif new file mode 100644 index 0000000000000000000000000000000000000000..65dcd002eafc0513dd4e7f6d54ca1d82345aa4be GIT binary patch literal 251 zcmZ?wbhEHb6k!l!IK;s4|Ns9pKy>EJ%$YNdjg1**8Z)FBGcYhH{__jT$ShV!EGkg| zQki)QB^jv-1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz!(9+VBLGdRGBLf2?gAUMi29WIx%y|;K?))=oQ+_D9Ws|kbwV3Cb!G;~l zr6S87EaNL&_a?hVeW3t@!}Ye?nKK^#j99avpyTG(I#$(nk_Jvoof)on^{`p)&3!-P v58tszhQ3zU#BLwgx4CO~=RuzOzlQVSzZ;^Bd|G^1jC6sd%8G=a9l4vw~(vB zK&18IY@e<~_ho@^^ZaH&Tb>YW#b(Yq% zTQ1&AcawjV68=8A*Y9YAAan80 literal 0 HcmV?d00001 diff --git a/docs/icons/box2.gif b/docs/icons/box2.gif new file mode 100644 index 0000000000000000000000000000000000000000..c43bc4faecfbfc27d83c6ba936a39ae65c42a251 GIT binary patch literal 268 zcmZ?wbhEHb6k!l!IK;s4|Ns9pKy>EJ%$YNdjg1**8Z)FBGcYhH{__jT$ShV!EGkg| zQki)QB^jv-1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz!(9+VBLGdRGBLf2?gAUMi29WIx%=I3-_IxxDa9BN8WnZTCdBN+UN;`V5 zvvyudlx5MGf7Niu+lB8<68M>}CwT0+Sa%>{VugiRTa(75mo;unPcK^%`XY`u`0=&t zU!@MXG|VX05I^^VF*R2EaBhQ*t$*G8!m22pl=_-R+Zy(Sw)W(nhPLXS$-P|O(_IV& Nt>?_0!_UcJ4FEU+X8-^I literal 0 HcmV?d00001 diff --git a/docs/icons/box2.png b/docs/icons/box2.png new file mode 100644 index 0000000000000000000000000000000000000000..0e3812ebd99e690c6fc0ba82095df795d03a1ca0 GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DOS(GiPSboM~)q z%rMiKAjC7HdAc};a9npiXUNrH zAmDOQlPUVWXi$ds%|l_19_uSuFSEH6)tajr?yvGOy|FJW?HJS98GdW#E(?BshU3${ z^h-QmnyL5nx=yT7DNKI+@J(!`m9^PBGn0AF6IOoWYVxr;wQ|A~jU&ZJ-7akm`v1q} zp_;1g$(6_SlXX-KCh~f12f84v#5JNMIX^cyHLrvrBqOs}A+e}L0Z3)$DU@WSDio9^ zFVdQ&MBb@0JXPywEzGB literal 0 HcmV?d00001 diff --git a/docs/icons/broken.gif b/docs/icons/broken.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f8cbe9f7604077bbd3a2bc8bc3a5bb5f569b838 GIT binary patch literal 247 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIn&tKm;nhW{__jT$ShV!EGkg|Qki)QB^jv- z1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf2Sr)tYd^F&3SUp#HU#9hW!Rw()J9@9Pc4`>z_|O^T zk}LelhjUMZx0Uz%<6KNN%O7PlP1)n6a$s{L_l_mk)%DU^kLsajo literal 0 HcmV?d00001 diff --git a/docs/icons/broken.png b/docs/icons/broken.png new file mode 100644 index 0000000000000000000000000000000000000000..2ebe4597c17dd788b6bb5c2c0b6b2f76b8a0749c GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DgFST5ZC|z|DXB)f9A}Y#>U1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~s5-_yl0gd^Jb>_g6@3Ifaz0%8>k zgr}G{9F;!c{C)n*qqmZjTl#+s2ELC`30$ybOJ}xm?yEgB?*4r$@mR6%^LHWnq@tZ2 zThCv;ay0R1_wG!c8;jiol6e*vn(25iQNWsw3(zNW``#C@x7(8A5T-G@y GGywql2zP=2 literal 0 HcmV?d00001 diff --git a/docs/icons/burst.gif b/docs/icons/burst.gif new file mode 100644 index 0000000000000000000000000000000000000000..fbdcf575f78a5ebbd3eeac5bbd9f963962ab664f GIT binary patch literal 235 zcmZ?wbhEHb6k!l!IK;s49|+DEpZWiPW*S3UTAH!3F#{MV{__jT$ShV!EGkg|Qki)Q zB^jv-1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXn zDYZz!(9+VBLGdRGBLf2ygAT}iknIf2aT>es{4+SUl4tW3o}3LYCJ5%-`ZlvqY)y_i zON{zvlk8Qc_r#nUUz;+oS7*8wAfNp1ThKa>J&QI6cbF|deBP(?&CiC}j@vi=I#{!y ctx@66$5l65-@mTg36FLd3o%#&030@6>Hq)$ literal 0 HcmV?d00001 diff --git a/docs/icons/burst.png b/docs/icons/burst.png new file mode 100644 index 0000000000000000000000000000000000000000..aafaa6ddc6717832aa138934ee5e237c33d4298a GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DbWC*5ZC`eaK`w||Nk@77}CG^}4EQ&m= z7q$qnaQ{encep_{hq3YFK1rYdsy%5j`Li!8*G=-c;rc&wg6qnH4%W%@%h>bNz8&_s zv%h&xPg-_ZSl02h&gUEn6SYrrUGe**RsPra1XmHi8uL`Klf?pulrP)gxBnqgTJ{8_cd?SY)nJ6?!7f1n7{k64!{5r>mdKI;Vst00JU>IsgCw literal 0 HcmV?d00001 diff --git a/docs/icons/c.gif b/docs/icons/c.gif new file mode 100644 index 0000000000000000000000000000000000000000..7555b6c164fc1b4fd61b082d8077fa9d91df56f2 GIT binary patch literal 242 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIn&tKm;nhW{__jT$ShV!EGkg|Qki)QB^jv- z1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf2sTRBTd^F&3SUp#HU#9hWL3V*Bp^eh6>z=a~rmo~; z@m;PwF+98fv}{9yhQgnc16&t10u@Ug6@{;Ldlgz{Obt2`rF%DR+wn(!`wtpSjoH_A d@zm!TvfmF~E%;F4@aA{Bxj;^{Ha{nWH2?tDSDF9- literal 0 HcmV?d00001 diff --git a/docs/icons/c.png b/docs/icons/c.png new file mode 100644 index 0000000000000000000000000000000000000000..46abf10cfc20b37878e1ee29606ab602b5436731 GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DgFST5ZC|z|DXB)f9A}Y#>U1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~s5%G1R$gd=+Cxr4k16nK~&R&Q_! zbKnVZVSDiKZ~7|l;HCe6m2NuFu+#VqkNT9LNfNVTl6FRV25#Na@#>wvXWpxO7pt}$ zXn(O$;7Z=rlK$(T82)cPd2`;2$;UckXPp#}xug*<4zwk##5JNMIX^cyHLrvrBqOs} zA+e}L0Z3)$DU@WSDio9^FVdQ&MBb@0RByG>;M1& literal 0 HcmV?d00001 diff --git a/docs/icons/comp.blue.gif b/docs/icons/comp.blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8d76a8c23f018497587e3f99b1ca6de51b3f31c GIT binary patch literal 251 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIWz6d|FpC;V`F26w3!SH42u8!LNYRo6%va| z6o6D_oCMz{sEjG@SutI|Fl`#I8I43{F+7+RH9?U^n~B&57a> z9SY`avJ)3cpWb!+X3wWT_Y&^C>j_NskYN&^eSY~d0}D@y<%x+OBE#9DLr=Z++8Ul6 x7HBJQ=EA9jH5MFGT$gJ@mp5m{0_#-#wxuc*35QMb=U457e-D7YXCOLU#$QD literal 0 HcmV?d00001 diff --git a/docs/icons/comp.blue.png b/docs/icons/comp.blue.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7e006f6591e40f045f279e8bf0fa136c5204b7 GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}YX=nbY zrKK4g8#AQM1WGzp|DO+}m`Z~Dg8wr--EQCoIR&0Bjv*Y^OV8SJ zH5l-;J>++_D!;H!?-66ySB}`V4@7r`Ux>S}_Lbf7{!7IcmQQ^3Js}EO0Zp12S~9{> z{OYIMe@*t*GM4wwvDts4cF{S>_G3ThRQtMTXIciXt6A6~v}*3kmHZK_`?SrDtmge% z^o-B>ptkz%ma_&xyTeLcBTACiGK&=wi%JxLRA!z+Nk*zdL1|J>X0k#` zer{rBo}PktY8g<%qclAuwOB_X8^p_SNX;zK0~(>D5S&_2lA4>8TBKlTX=z&a?fo2} O4Gf;HelF{r5}E+j4t6O3 literal 0 HcmV?d00001 diff --git a/docs/icons/comp.gray.gif b/docs/icons/comp.gray.gif new file mode 100644 index 0000000000000000000000000000000000000000..7664cd03649021707e088ea934495978fb0d2656 GIT binary patch literal 246 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIWz6de`8}~1{hHM=NFQZS*(y)RH6W+GV>Hl zGEx-^N|SOjlND0(a}zW3^c1{P%YYIdrRf=|#X1VvAYO(;YG#REa(=FkLU3w9NosCV zYLSAWrKKr@;!hSv1_nk39gr0u+ZmWMC3fBUXK*TF)m~Py1H0L0ZcY^U=uj|Uqn)@& z`t+`&H+w$)xtDP7U5{X*hYXYW?DNZyDNHgr!s_U-Hfnv#g)JxEX01=i4l~r{ICH)$ lVU2;d{qukWdt+~JZ}<_zu;TaoO4H0{QT5pN7)DM8YXGT7UX1_% literal 0 HcmV?d00001 diff --git a/docs/icons/comp.gray.png b/docs/icons/comp.gray.png new file mode 100644 index 0000000000000000000000000000000000000000..521fd763150166de1b658c306bfc6992e9aa1c7d GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DWL$L5ZC|z|DXB)f9A}YX=nZ$ z8yf?K?}r8X04b)DAiv=M3{STkcma8gN#5=*3>~bp9zaf(r;B3KrsG&f4{%KtBh$Jn0n{kyT_Ov!=Fh0j*{Idv3D&yhRkuXOch zzo71^?ye(SpBqQ?@BK5YO`u|CMpsP0*@kGoJbuYjZ&X7U#)eiIda3IvE8h0_cCrL$ zYgmbEL`iafZfR4hQgf41ixdnkEltb5y`KZLfx*+&&t;ucLK6T) CigaiI literal 0 HcmV?d00001 diff --git a/docs/icons/compressed.gif b/docs/icons/compressed.gif new file mode 100644 index 0000000000000000000000000000000000000000..39e732739f562920d69e21b9d5f766103225471e GIT binary patch literal 1038 zcmbu8%S)7D6vm%!Ft{kRtWAqgQ<5~hoFu0y(5j?VVxWbZa?#}6Rb z^C4&mE(8ey7I`1M2JeEG;9*JiK{cogDnVhj&IhN#x!@!?SgZIT8pH*WAfQr!56}P? zAOQ@hO=)Venboj4_SAdly?75B%ShF$^D16p6ihnx&Uq)^!Jt?x>cx2xFCZgZJ=DW_ zhzF;Vnqq_|C9#;}U}{sET5N_bWHFyp6;;@N9LvZ#b)pWoE-9E4ry?rg_Jm@s!YM?- z_2>sN*-bmRKOwjwsVPQiQnHjB987IWQw!#tr5W>yb1);hAICBhaRU0vbxFabgE-Jf zI!yz}#c~?WZD}R_ASSzM2bs7qHzYO12+dAnk%NP&O=;MPteR=YeBi}sB=_T3Mgsdd z%-8tdmW)qmHpf@7+Sq7wJ@(F8V>|2!@rI@pL)%Sa4ik>0`8n`PG>cNN~PuHj#2TU&K?b$PjISFN2mlgUm*z2muv zKiQEemq|xslYK+k{%BxyxHmh}7Dc}w4}4S#{SXahUj#9ESDbc zOOHnflF24it!!Ke)S!Xtuzwj6iq1sMV&VMamBiM~1Dk->?y_AKLvKGkd3CL_zUO(} z{{Gh4ox9inc{4lTIae9-XIHj->p*v3PgZ}I-!Gd(0R3W>2Z59 z@wZv>Co5WRejm!z{yeqNojm@2_0WZ-{JG+hhh&B-mUxe ZEb;5(orN8>^?I=Ddd=ePr!Oz#=sza7#nJ!( literal 0 HcmV?d00001 diff --git a/docs/icons/compressed.png b/docs/icons/compressed.png new file mode 100644 index 0000000000000000000000000000000000000000..1959b85a1a10b80a8a5cacab276459f287dbb2f3 GIT binary patch literal 1108 zcmbu8%}bO~6vj_!A%?_YR+PodL@q*vIBIG1CGY5nV&lh1%lvqcGt{W*tJ5L~T+|q0 zv}kc6C|VTFqM%hUiwdIEg^Zw(m=+P#YJwsoTHK!d{sS$#;0%Xz?{j|7bH?S=Ku=xm zu393h>rMJY_}+%U?KM^S{B@_lm8gnR{UZtMjHgAa+NXGs5N2@TSKm?#;RHs zt8A6rT`^YFidbPQ zH7Z8gC^-r=MU99NHbM>xcUcXKVKz))#8X3RNDQ$dOa(Q>01ZlDp@+fHhBUPBn4BS3 zBzF!~y?+fJ0D24A7v&Rd8T1 zv>^>Ga>=JKD3J#+@fvY}35MYi z)DQzSUIGgo7z}MllUtFyjW%i=!p0CJ{9!CA#t$X>H8{J`g0WGz&uB>wD$3ohH;U3R zM(Mb1M}{48g1_NA4>PcIzUc%$G~-}^M!`nh{_vT-W@Bfj~`vE|(l8-9NLa%k)N zvrDU&-*-Rg{P4BqWnFe}ecO?Gj2;aWr^AVvTrQXnX(W@K_r~Tz4`117FU$nq?85lD z?1VQtlN-xUw|ITQA{xnssZ226?45O0=0uPUTOiTw4F|JfkQ)!?yn`JbZHw#QZes%V MCI8 zTBKlTX=%!!_>+Z^fq{`h2V@1vb_QloiCuU88JzN5z4yk{OJ&c!6gd(UCY?Un$r?Nn?=Lqvv3P#w6Kw&mW_iT|AE}uhs$W)G1T8PP5dEK*~11YAGAiv=M3{STkcma8gN#5=*3>~bp9zafrr;B3<$IP|oHu4@&5O5Cc z=GAeOk3GU7$gI%H_>SrKdZBQi1Nrm3o2_MLbnEyvCY@U$!f~ZYRlH+Krk=pHuDf~$ z^Jeb9#`@`%%w(pTlXo=zY;OO3E-CKdY`N|S(EP9x*NBqj{M_8syb^|xjLc$%#G(=f zAeEV?P?C|VP*9qblbNiLlAoKHnWv}VomvKz@F-2sNG;Y;$OiE;98xn&^nga_Cyg@&WtvAFs%+oyn@vrAN+!2FgA&7LgdM$msG{jgj*VKw;b&W_&MNEp LeCV-eWUvMRho4eP literal 0 HcmV?d00001 diff --git a/docs/icons/dir.png b/docs/icons/dir.png new file mode 100644 index 0000000000000000000000000000000000000000..df03153b8a2891dbc8f90ed000a694f824375ee2 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DWL$L5ZC`eaAxM2|Nm#E83O@O z_>j=A6+nu)B*-uL|9^(-r+6KKT*f4CcNc~ZR#^`qC&<&qF@z&JIiQJ|?a-M3g$9FA z)^?N}(7F&Y(Ke=Vw$Nk_gTmAR zuENF!0XEgE0UQNP40Q|&M=Q_!&IFnsR^l2_lANELo0?a`5R#EutdLk#q5z~a^At)l zQWXkHlX5bX6;kqZ6EpMl6ueW*fD#_1=^3fTIttk!UWP+zW{Doq2pxss)Pj=K+@#bZ Z1w%_q)3R^x=KyVB@O1TaS?83{1OQgbTNnTU literal 0 HcmV?d00001 diff --git a/docs/icons/diskimg.gif b/docs/icons/diskimg.gif new file mode 100644 index 0000000000000000000000000000000000000000..49b12a8d1ae0b5b0725ff2310c6373aa4e983fa9 GIT binary patch literal 167 zcmZ?wbhEHb6k!l!SoELaz<~pDEG+;3|KGoV|IC>)8yXsnjg1)?7!-f9FajwC9S{Lh z>%g3ov1`u<0SU!(nu}i;Yy3QD%o~;&6sNIJ$7<(=jB`2*wc^*kKX!MUzH`b~=d*lv zms~enUYT?*-b7U^DmQd>f|AU>HTUzbRT)eKynygkW{*rDjP6lfL{kKE1 literal 0 HcmV?d00001 diff --git a/docs/icons/diskimg.png b/docs/icons/diskimg.png new file mode 100644 index 0000000000000000000000000000000000000000..d8f04c219db1484926ab80d6e5b2654b1a7f9d29 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5Z40-4#=^v{Qv)d|Ni|m zXU=SBXfQT521*u$Z_ol#j3q&S!3+-1Zlr-YN#5=*>|%)>uYsHdPZ!4!j_bAO47nN% zcv>IMd8+t!UB~7N+9m7x%Jh_W?#o=vCirK0zkpLlw(6uXk8_d}d(K51@3njWRIPYt zhu#^d`kq4f$0{iflJc9rq}qP-zAd{Xj`QtV-HcBv8^d0(+^sS&p0-2hBG4`dPgg&e IbxsLQ0FN?F#sB~S literal 0 HcmV?d00001 diff --git a/docs/icons/down.gif b/docs/icons/down.gif new file mode 100644 index 0000000000000000000000000000000000000000..a354c871cd0b1871aea54b437a9fcd88608b6945 GIT binary patch literal 163 zcmZ?wbhEHb6k!l!SjfQe|Ns9p|Nk?9f#N^Ekc`Y?g~Xx~1t67~r%;lSs!&jxl#`jP zkdmL9n3<=i;GJ3ql<+7`&qyuSQOE}IG8|GfOZ1ZSb9EGgQwvH`bCXhw6bvmbO&Jt_ zvM@3*Ff!-Xz@*gEzw-23{>5`lI=eR?ORw&$xvkW+W54PQk(%kA+G=b|3CBpKaj^Gwe3BS zVk!yp3;xgWbi08UkjI$h?e4^)=1ctC;Sz=l~m?0jwVDg^;k zHy@a6yy8^%>Ro4E8LaA^x?|U)Hyw+0XDzya`ww%OjrPll!ZztZ1HwvNBTACiGK&=wi%JxLRA!z+Nk*zdL1|J>X0k#`er{rBo}PktY8g<%qclAuwOB_X8^p_S qNX;zK0~(>D5S&_2lA4>8TBKlTX=z&a?fo2}4Gf;HelF{r5}E+${a48V literal 0 HcmV?d00001 diff --git a/docs/icons/dvi.gif b/docs/icons/dvi.gif new file mode 100644 index 0000000000000000000000000000000000000000..791be33105d03f674f9b9949c25ddd54591fa08d GIT binary patch literal 238 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIn&tKm;nhW{__jT$ShV!EGkg|Qki)QB^jv- z1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf2i59!|d^F&3SUp#HpXaXk2Sl>&JZ}wUn<}Oew2Ebh zy5WrhZnywi7`v{UmEc1RMWQW;i796*RD-1HnCY( abURyR&WU;9JD3;O#qV)F(-6+dU=09`UszZG literal 0 HcmV?d00001 diff --git a/docs/icons/dvi.png b/docs/icons/dvi.png new file mode 100644 index 0000000000000000000000000000000000000000..463e1aa917c6acacfb34743888843b2c90a6ca90 GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DgFST5ZC|z|DXB)f9A}Y#>U1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~s5!PCVtgd@83+(pg<3Op4m!<{1sI~16cKL1+>dLD8$i(eJUYD>!r2Fh+5-En(LjA83O^MQ&zI{5z`IFO@B-M+4!8pe&x1B>gARa*A91Gask>ER^l2_lANELo0?a` z5R#EutdLk#q5z~a^At)lQWXkHlX5bX6;kqZ6EpMl6ueW*fD#_1=^3fTIttk!UWP+z pW{Doq2pxss)Pj=K+@#bZ1w%_q)3R^x=KyVB@O1TaS?83{1ONiXYYYGY literal 0 HcmV?d00001 diff --git a/docs/icons/f.gif b/docs/icons/f.gif new file mode 100644 index 0000000000000000000000000000000000000000..fbe353c28223f727deb5144a964b67aa52081e42 GIT binary patch literal 236 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIn&tKm;nhW{__jT$ShV!EGkg|Qki)QB^jv- z1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf2@fN%Gd^F&3SUp#HU#9hW!Rw()I|5y1O%gw{Qrk-4 za}Co**45@VTn>y2mrF4=IdgU;Y~koUdn&jyIjm;NN)0XFePuTmPrrRp@1UjePH&g! XquWjAXkF)P`eAc{t#G$ICxbNr*wRvL literal 0 HcmV?d00001 diff --git a/docs/icons/f.png b/docs/icons/f.png new file mode 100644 index 0000000000000000000000000000000000000000..8c89b274433307da31a563919e30fa2aefe12b91 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DgFST5ZC|z|DXB)f9A}Y#>U1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~s5+|$J|gd=+CxsALB6nIz;gr8xG zV>EOS;F)mf_xUO2Y&$(>uJ4QT)lMtEk3~# z#`s@8x8vtb>;AX(WT3K5P_BFYsYzl2(-&y^0<8!uag8WR&d<$F%`0ID$;d2LNGvK* z08*KG3MCn-3I(M}Ihn}{DfzjHnR$8&-l=6k36IkBjMQQsg=`Qn!yz@ZL=R|$jzVy1 gK}l+EQfiTcp{1p1*|+y|fHp9Ay85}Sb4q9e00PBjWdHyG literal 0 HcmV?d00001 diff --git a/docs/icons/folder.gif b/docs/icons/folder.gif new file mode 100644 index 0000000000000000000000000000000000000000..48264601ae0655bbb5b5539e54ab9c4c52c0ca96 GIT binary patch literal 225 zcmZ?wbhEHb6k!l!IK;s49|+FOJoEqm%rs*lV1NO|e|{kunZ*i;MI{PADl<=^BqLR! zpfo8bGg%=eKQ}QmPfx)+wG1fXQJS8STCAgx4dP`uq-K`rCFkerCyg@&WtvAFs%+oyn@vrAN+!2FgA&7LgdM$msG{jgj*VKw;b&W_&MNEp LeCV-eWUvMRho4eP literal 0 HcmV?d00001 diff --git a/docs/icons/folder.open.gif b/docs/icons/folder.open.gif new file mode 100644 index 0000000000000000000000000000000000000000..30979cb52855157110d56344ce09ff29ad726585 GIT binary patch literal 242 zcmZ?wbhEHblx7fPIK;s49|+FOJoEqm?%lg*rWpeP0~jd&^9#wyELKP?Dp3GZnRyB& z8L0{drAaxN$qFg?xrv#1dJ5jDWk3m!()5hfVjYES5HG_aHM2x7IX_oNAvm?5BsDiF zwMfCx($bVc@h1x-0|OI-4#<3v?F`JR8oTcNGdShBI#=y=&2-5G4yn89^Q6URrb|x} zc)e?b^5WuCck>TOH!hekVIgPfp~Qt9URLv4mOfysiDC|%v8Jjt&35m)a4xxmqX+dL h7rU*#p8HYSdByGb--d-u#V zV;}&^NaYDm22#u=L4Lvi|1(@a#p?*f04ebSn_EM?ZDj%80e`FyYXx9#>S=#vjz z#B6u#t;J%YFTw>t`@>3HBTACiGK&=wi%JxLRA!z+Nk*zdL1|J>X0k#` zer{rBo}PktY8g<%qclAuwOB_X8^p_SNX;zK0~(>D5S&_2lA4>8TBKlTX=z&a?fo2} O4Gf;HelF{r5}E+ykbCg} literal 0 HcmV?d00001 diff --git a/docs/icons/folder.png b/docs/icons/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..df03153b8a2891dbc8f90ed000a694f824375ee2 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DWL$L5ZC`eaAxM2|Nm#E83O@O z_>j=A6+nu)B*-uL|9^(-r+6KKT*f4CcNc~ZR#^`qC&<&qF@z&JIiQJ|?a-M3g$9FA z)^?N}(7F&Y(Ke=Vw$Nk_gTmAR zuENF!0XEgE0UQNP40Q|&M=Q_!&IFnsR^l2_lANELo0?a`5R#EutdLk#q5z~a^At)l zQWXkHlX5bX6;kqZ6EpMl6ueW*fD#_1=^3fTIttk!UWP+zW{Doq2pxss)Pj=K+@#bZ Z1w%_q)3R^x=KyVB@O1TaS?83{1OQgbTNnTU literal 0 HcmV?d00001 diff --git a/docs/icons/folder.sec.gif b/docs/icons/folder.sec.gif new file mode 100644 index 0000000000000000000000000000000000000000..75332d9e59bf1b7d40d5a82279bfeea18611db90 GIT binary patch literal 243 zcmZ?wbhEHb6k!l!IK;s49|+FO{BLZ0=KuehX~t;`493RB3=9m4|NKHSGK&=wi%JxL zRA!z+Nk*zdL1|J>X0k#`er{rBo}PktY8g<%qclAuwOB_X8^p_SNX;zKOU}>LQ3y^g zC`rvtN-a__w6rv3Q2fcl$iTqNpaV3W0c1M^bDG7jJO2z$dEVUl?ms=DL1^Wsd7qggEnTi zLuZN<8Vt^|HZJh+lsuusV%Rz*q`Ozr%fUxoHMDTS3T^=gSJ$qGTrrm(`b;d*>h5A- zbh#pvVt9c!?t@0IAG8g_4X^g@V$goXli}l>FSp%sf2>@6XnDYZz!(9+Vh?A!Y}KpPl5UHx3vIVCg!0QSvkV*mgE literal 0 HcmV?d00001 diff --git a/docs/icons/forward.gif b/docs/icons/forward.gif new file mode 100644 index 0000000000000000000000000000000000000000..b2959b4c85c612f74f3ed207b3c8e09ce906fd70 GIT binary patch literal 219 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIWsLS&DhwO0R|NR`GsU;7Aqtcl_&tI%shpX zj8uh!(xjZsWQCOc+{Da0Jq7R7GN6P8 zTBKlTX=%!!_>+Z^fq{`h2V@1vb_QlYiCuU8wX}SU+2eAh_5B^k_ROg-0w+{X^b?$Q zKX`{e+d0=|9tjPPcd_Mu)Ml%7PAUBP*kHbKD+5<3&kBD{#@jg@+pgRzznQIiy36?2 ILPP5dEK*~11YAGAiv=M3{STkcma8gN#5=*3>~bp9zaflr;B3!#zcl##xo16Uo>5V}A~P zV@|nvzg0cgy0d)dkJ7&4iwEzD_LaYL;*DhSF*a|sPY6`ESeE9q6=+vjiEBhja(-@Z zYF-ILNJeI{LSj*g0+7ngQz*$uRVXM;%E?StNXgGl%*@kM@J=lQN_do}XQUSEC}e|p s84jtLC3-+3bQFS93rbRRlTwQm3@t59%f7vz1GIs`)78&qol`;+0GK>&vj6}9 literal 0 HcmV?d00001 diff --git a/docs/icons/generic.gif b/docs/icons/generic.gif new file mode 100644 index 0000000000000000000000000000000000000000..de60b2940f90cc3bef3e16e2d20b39aa00807327 GIT binary patch literal 221 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIn&tKm;nhW{__jT$ShV!EGkg|Qki)QB^jv- z1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf20T#RVd^F&3SUp#HU#9hW!Rw()J9@9Pc4`>z_|O^T zk}LelhjUMZx0Uz%<6KNNmX9Z{SfkK*HucgE9k$hhnp--1%Xa$c7hcewUAg{5?%98; H3=Gx)qghVl literal 0 HcmV?d00001 diff --git a/docs/icons/generic.png b/docs/icons/generic.png new file mode 100644 index 0000000000000000000000000000000000000000..478e06ee0380266032e27a31e262bca97c3d3978 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DgFST5ZC|z|DXB)f9A}Y#>U1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~t`$lJ1oXudiQ1EP_yT-=lt5==gxGvW2>G!O?mp*3wV@T!X z3$ZM(ivgMzR^l2_lANELo0?a`5R#EutdLk#q5z~a^At)lQWXkHlX5bX6;kqZ6EpMl z6ueW*fD#_1=^3fTIttk!UWP+zW{Doq2pxss)Pj=K+@#bZ1w%_q)3R^x=KyVB@O1Ta JS?83{1OVeJTdV*8 literal 0 HcmV?d00001 diff --git a/docs/icons/generic.red.gif b/docs/icons/generic.red.gif new file mode 100644 index 0000000000000000000000000000000000000000..94743981d931466fd6403a80dc4d1425b744822e GIT binary patch literal 220 zcmZ?wbhEHb6k!l!IK;s49|&g7{GXO~=KudR1_oneV+Jr#{O1>vky)&eSX80_q%!jq zN-|Ov3QCi5GLscj@^ce2^Yj$FQ_Fx79;N9Ssl_@9*&tqqLuzJ;UUGh}jzVy1K}l+E zQfiTcp{1oMgW^vXMg|6E1|5+3Aln(3{XKT=`CK62xLURGi22&%H?LKSN;oNN&RD)A zj7{+T9dF5syeno$->jSG&*;OMYO`?t3LV4QtJ8%g=XgyGN!I7?Roi$yd81>RNCW@e KDqbH325SH#15FnI literal 0 HcmV?d00001 diff --git a/docs/icons/generic.red.png b/docs/icons/generic.red.png new file mode 100644 index 0000000000000000000000000000000000000000..c518e9cb5ad18054314bb2b624a2356fc859a108 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DbWC*5ZC`eFmvYrw6rt-|EDo9 z7#kY{WsVtKSO}z8N`m}?f$|IvS}VT*`HV^4?k)@+tg;?Jj+3X0V+codaseZAdUA3y zo4Tq(fS{uR>s&z}K^9>Rp2SrnLP{co`0vky)&eSX80_q%!jq zN-|Ov3QCi5GLscj@^ce2^Yj$FQ_Fx79;N9Ssl_@9*&tqqLuzJ;UUGh}jzVy1K}l+E zQfiTcp{1oMgW^vXMg|5Z1|5+3Aln(3b0VTHIq;y*eT9 pbHuxO``>OATea-a%QUllYxjTS@>KR}wi0z>>0oj07UpEI1^}8@T=4(^ literal 0 HcmV?d00001 diff --git a/docs/icons/generic.sec.png b/docs/icons/generic.sec.png new file mode 100644 index 0000000000000000000000000000000000000000..e0cd444bc685302ae1a34f8f9cf9bfa4bdd776fd GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DbWC*5ZC`eU~GKm|NogYXQnYQ z7#kY{Wu&%mi~&;2B|(0{|Nk>wKgH_^IsTq5jv*Y;$sD|*A|<@M zK|w)D90>v z1P@2d%A8Z(d*Iop;+0_slQ(LVa73?qy!_*&UOA1|IbCl>b_(7P3tlzje1;bjgEav1 C5>Ye& literal 0 HcmV?d00001 diff --git a/docs/icons/hand.right.png b/docs/icons/hand.right.png new file mode 100644 index 0000000000000000000000000000000000000000..3c5bd12e295822b1511981112334c8d30a70b5ae GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DgFST5ZC`eaAxM2|Nm#E83V6$Gh9E#>j>mBCV9KNFm$lWdH^}8o-U3d95Z|SH}X0giZDe!d}7Y{ zi#y^QQ(fZ!nU^9mgH%Go=dhfZ|AODA=p*B;ZC_;+Jfj%R4u};btl7$Hx>7|~gKf*& zRpMu^Zi|@gc{7YLIp_ARn5$gjTWe-)zrmmU_4+1x{d)oaa=tRH-7|p}hLyNRlqBcp z=BDPAFoa}e7Aqtcl_&tI%shpXj8uh!(xjZsWQCOc+{Da0Jq7R7GN6PNWsw3(zNW``#C@x7(8A5T-G@yGywqGH*RqN literal 0 HcmV?d00001 diff --git a/docs/icons/hand.up.gif b/docs/icons/hand.up.gif new file mode 100644 index 0000000000000000000000000000000000000000..85a5d683177b439d3bd52a5fbe4f4b88e6b36a51 GIT binary patch literal 223 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 b@W92JKaW1W`t|JFyMGTqzWn*9LI40ePu4mb literal 0 HcmV?d00001 diff --git a/docs/icons/icon.sheet.png b/docs/icons/icon.sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2a2013f480eaea48e022834e72a618889cc744 GIT binary patch literal 9018 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 C?(#YS literal 0 HcmV?d00001 diff --git a/docs/icons/image1.gif b/docs/icons/image1.gif new file mode 100644 index 0000000000000000000000000000000000000000..01e442bfa92332ec1c6f6a3a1310a41da8be5cb4 GIT binary patch literal 274 zcmZ?wbhEHb6k!l!c+9}?9|+DE|4&Oh1EkNKnF$1G493RB3^;(|KfjQS%wmPaq7nrl zm6@kdl98%VP@0sJnXHhKpPQJOr>EeZS_YKxC{52uE!I)U2Jtc+QZq~RlJj$Q6oOL= zN>X!^Qi~J}EiFwM6o0ZXGB7YR=zwelxr%`$x8Q`Q<}TB46{|}Ro;FH4vD|TwVqCRu z(oHG-o-GnG^BH|*TNeaW6tnVAVoo@j5?96H;J7r$On>@QlgzzoTd%A$K6Qt0Rl^Fa tT+{HAkBVmGwl?ql^5gHGE#Ge!M>NIeRkegTICnX-n>O`N&=O>@1_0HcVjBPe literal 0 HcmV?d00001 diff --git a/docs/icons/image1.png b/docs/icons/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..eafff5e3ac47cd13dbd78274661ee57f613bde18 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{Dd_;85ZC`eaK`w5TG|;Pedf$e zAV^~{HZ}&zyZ3s01X3&|L4LtNRSXVVE588wj7i?^E({&4vK~NAnx~6n2uF17DQ&(6 z2cDLP6C-#cdk^(To>r8yU=nh6m==C1S$UVp@%8(B*uK0`iP`zK$^C=ZLEF9e@0cIF z6;W|jxYN}o#s9m*8HR-3K7C%tzZ}a~t=i1g(Eoq+%&DS<5l3%xM0N7BOfuA-SY((2 zv@xv2HKHUrKQ}iuuY@5aBePf`v8Y4=NM+_Jlw_nT6qF|AWF{-5vw+Q8uH>gTe~DWM4f D2wQfA literal 0 HcmV?d00001 diff --git a/docs/icons/image2.gif b/docs/icons/image2.gif new file mode 100644 index 0000000000000000000000000000000000000000..751faeea3644ec77fc2758b18522443c86e11e88 GIT binary patch literal 309 zcmZ?wbhEHb6k!l!c+9}?9|(+%&;0*?=FFLyGiRm&0Rw}vu`$EUGYm708H|BE6rlLe zFC-(gSRt{fL;*-;<|&k9q$(7YCgo%%E2QM-CT8a8DR`%r0VO<2(=$?wbriBeybOob z%o4ri{9GM{;M9VW)ZC=hA_YTBOH&5LpDc_F3``6AFlZ-6WvSM=7VP{@&>xS8Bwhc1-A7qQa*6llSbi$3t0`pjwvYB~D2%9p5teUK9 z!JHj-nw2N%{)ee19sAhWn7?J+(8*}hLs;X|rU4J$iGeWf`wdw5G*d!uZZa9_W^ ocG{GwRjPF}8>Y#Xb1hynfA)0M4)%aGYyBN0JvVI*5@fIj0DN?8ZvX%Q literal 0 HcmV?d00001 diff --git a/docs/icons/image2.png b/docs/icons/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe32092ccb076977477c181f04ed85bddc85e32 GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DU|@95ZC`eU~GKm|Nk>*&di)S zGYtqB7>tdL8D^egm}$&l4CFDK*&fLPq?k*B{DS}gXSjZf*Ad8NO!9VjVd!9$^#F2u zJY5_^IHFz8S#uq75NUnL94>Jri-RNcJ=d0xq05UI*B#V5lBBe`F+o(Idv|M2qS^Dg z?vwWavbfslU3#WRY?h(+#kD3AuiZN3@chW%bJh07Edd?A#r|uab|0Gfq~S!euad6o zym{eIb%mk@D{F;%Ppm(`WV=n9&zx9$VH2G_I!ipYvwdF9nltZ7z$5zykyhTTirzf| zx+|>2HKHUrKQ}iuuY@5aBePf`v8Y4=NM+_Jlw_nT6qF|AWF{-5vw+Q8uH>gTe~DWM4f DvjL04 literal 0 HcmV?d00001 diff --git a/docs/icons/image3.gif b/docs/icons/image3.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f30484ff64db93ee44ed0a9ad7ee2ddee74b3ff GIT binary patch literal 286 zcmZ?wbhEHb6k!l!c+9}?9|(+%&;0*CbLPx61_oneV}_Y$7-kwX7z24&fZ{*Dkc`Y? zg~Xx~1t67~r%;lSs!&jxl#`jPkdmL9n3<=i;GJ3ql<+7`&qyuSQOE}IG8|GfOZ1ZS zb9EGgQwvH`bCXhw6bvmbO&Jt_vM@3*Ffr(WYy-K9fu(Z83D4y_B18`CzVBL=8|T?3 z8Cj-fRpz22to2}(%Yyfw7ys+~3he!($l^D4LHYfmjv4i)2j@WJuw z(xQEj48%`M?cSeKc2$dA;a$a_s7`|)|JgXI)5;nenzd@X8XG%`OT79!SOcd{3$T;) Lm^~+0kii-Nb17t& literal 0 HcmV?d00001 diff --git a/docs/icons/image3.png b/docs/icons/image3.png new file mode 100644 index 0000000000000000000000000000000000000000..5de386b4ab855abe77ac411cdb4dee1f7412a399 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DY*cj5ZC`eU~GKm|NogYXQnYQ z7#kZi%sj&|)0n{+$Ya>|x7r0rF_#4S1^@rgaQzgoBaq9O_C({OQXctVlMBR`*x#Nwo~ zzde47{FAPJU~D(hGcncJu^4E1Scz*yNpgN}Zfaf$Lr6wuu|i@|i2{(y%u^`INL45( zP0GnkR!GUuP0Y;GQ}9kL14?+5re~xU>nLP{co`0b literal 0 HcmV?d00001 diff --git a/docs/icons/index.gif b/docs/icons/index.gif new file mode 100644 index 0000000000000000000000000000000000000000..162478fb3a7f690884b1527488a27a9d34ab497b GIT binary patch literal 268 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIWz6de`8}~1{hHM=NFQZS*(y)RH6W+GV>Hl zGEx-^N|SOjlND0(a}zW3^c1{P%YYIdrRf=|#X1VvAYO(;YG#REa(=FkLU3w9NosCV zYLSAWrKKr@;!hSv1_nk39gr0u+ZmYaJ$CK+XdvLQdala8OzZQ4*F%+d^j>G}%y8WC zp)<%eSG-8|P1Cu@LU&KQy{J}XRik+(=tTM=GYuMB5h}jym8(tr{ zTHty08q@pqX@{qpFA8HkpSQf;)z`l$D#)_MC9vJG&E2N2-g4rU9~bp9zafor;B3vw+Q8uH>gTe~DWM4fxV3%B literal 0 HcmV?d00001 diff --git a/docs/icons/layout.gif b/docs/icons/layout.gif new file mode 100644 index 0000000000000000000000000000000000000000..c96338a15228f70b4fa5753ff93db7d70f1123cc GIT binary patch literal 276 zcmZ?wbhEHb6k!l!c+9}?9|+DE|2H;1^Z)-$AV@P#I|JkyGvEM<|NKHSGK&=wi%JxL zRA!z+Nk*zdL1|J>X0k#`er{rBo}PktY8g<%qclAuwOB_X8^p_SNX;zKOU}>LQ3y^g zC`rvtN-a__w6rv3Q2fcl$iTqNpaZfI}mo*BX ubMM=^lVvk>^@~}aS-AV^f3&VBD9tXZudR+|59;m-w3jTH=pio1U=0AHb6^Gl literal 0 HcmV?d00001 diff --git a/docs/icons/layout.png b/docs/icons/layout.png new file mode 100644 index 0000000000000000000000000000000000000000..7c6b7638dbd622e70a6e8260d271338c692874a5 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{Dd_;85ZC`eaK`w*vGJMz|7QY0 znsM40AkP>mKRur9F_2;@3GxdDs$y`^TKNUYXH4>TcVXyYmGuB}QaoK8LpY+7HQ1Yz zl9Q9$nAj8&(%lUtyBvMKefq>y##Uw!Y@pjXmr;W!rE95bK}bkQ!;DOaGGVoWw_n8_p1aEvAMWrl*^l*Z2Hia?9acUYMk`b^$6FeNjT>*!B*)LpY0XkS=~ zYeY$Mer|4RUI{};MrN@>Vo`|#kjl(cD9K1wC@4+J$xK#A$X!^Qi~J}EiFyUzP+CVw1L6X)z4*}Q$iB}=2>jc literal 0 HcmV?d00001 diff --git a/docs/icons/left.gif b/docs/icons/left.gif new file mode 100644 index 0000000000000000000000000000000000000000..279e6710d4961d7644ea2e3e39e6afd300147aa8 GIT binary patch literal 172 zcmZ?wbhEHb6k!l!SjfQe|Ns9p|Nk?9f#N^Ekc`Y?g~Xx~1t67~r%;lSs!&jxl#`jP zkdmL9n3<=i;GJ3ql<+7`&qyuSQOE}IG8|GfOZ1ZSb9EGgQwvH`bCXhw6bvmbO&Jt_ zvM@3*Ff!-Xz@**Nzw-3iM{+%$5nXSNI_AHs_0#Z5ammWC>ec*qNb!1QNo>>3 NI{94w6cGjnYXFzvI#mDw literal 0 HcmV?d00001 diff --git a/docs/icons/left.png b/docs/icons/left.png new file mode 100644 index 0000000000000000000000000000000000000000..1087e702ed246afacf336d24a83e42b9159352a0 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQk(%kA+G=b|3CBpKaj^Gwe3BS zVk!yp3;xgWbi08UkjI$h?e4?)Gf$x;BUPcGG$|)DSs^7qH!(9$Pr*C23@G7Inx2tbtfP<(;$=9b pW|rsyjnGjDPAw=&%}q)zQZTf%G%fq~eh$zE22WQ%mvv4FO#oFcO)dZc literal 0 HcmV?d00001 diff --git a/docs/icons/link.gif b/docs/icons/link.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5b6889a76d72a1f052d2885a725e7065344ee9b GIT binary patch literal 249 zcmZ?wbhEHb6k!l!IK;s49|(+%&;0*CbLPx61_oneV+Jr#{O1>vky)&eSX80_q%!jq zN-|Ov3QCi5GLscj@^ce2^Yj$FQ_Fx79;N9Ssl_@9*&tqqLuzJ;UUGh}jzVy1K}l+E zQfiTcp{1oMgW^vXMg|5Z1|5+3Aln(3b0T)_`4k}HuzIfQzD(=$g4aWpcJy9n?OYMK z<3neVTdwpcAKpI=-d5i4k8cuSl8s+i>=HJ`A>=Y=gWs~oHDwKgH_^IZ2)_jv*Y;zUR(z9#G(E zd&nPE9ahk^M&V1&LS_+1_k#a|QuRqS{``$C3g3kUA2O%+2zh2sv60*3rFkgowMt(B zx1x=%LWy+l^T$!rYmLnI&H21bOnk3gceidDpK{%#S3PwKFQiXB|2z$78ADi!YeY$M zer|4RUI{};MrN@>Vo`|#kjl(cD9K1wC@4+J$xK#A$X!^Qi~J}EiFyUzP+CVvcl8V&t;ucLK6T#C2D8@ literal 0 HcmV?d00001 diff --git a/docs/icons/movie.gif b/docs/icons/movie.gif new file mode 100644 index 0000000000000000000000000000000000000000..003518377414735b97dd78c435daa795c9136526 GIT binary patch literal 243 zcmZ?wbhEHb6k!l!IK;s4|Ns9pKy>EJ%$YOO($b8LjTyi|@tVo`|#kjl(c zD9K1wC@4+J$xK#A$0Aq je4J*Rr#@1aJXdjR@wJsoZ!aBYW^HV0ZfO+YWUvMRZ1!36 literal 0 HcmV?d00001 diff --git a/docs/icons/movie.png b/docs/icons/movie.png new file mode 100644 index 0000000000000000000000000000000000000000..131e9dc70157e188d2e85dbd42e02d894fc15132 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DbWC*5ZC|z|DOS(GiPSboSBxE zW^8N>l-cgM?E{cvDhcun{?G7qyMY&w$C%{p?!wT)D(eB{SbDlRhHykDdo(w>IJT*n z8hC4p9w}jDG7~V?J$v)UjTySUI$UX53ynGh4lu9;uzuOfbWVh~mC2DIb*9P7`SN!{ zfrf;YxJHyD=jZ08=9MsnWMmdABo>t@0IAG8g_4X^g@V$goXli}l>FSp%sf2>@6XnDYZz!(9+Vh?A!Y}KpPl5UHx3vIVCg! E0I^_K9smFU literal 0 HcmV?d00001 diff --git a/docs/icons/odf6odb.png b/docs/icons/odf6odb.png new file mode 100644 index 0000000000000000000000000000000000000000..4c3bd2e911ba12cb82705e22c6252e536f4eddf0 GIT binary patch literal 1047 zcmXAmYe-XJ7{`y(m6sIFTpCn%bB?5>}j_yHOEIXp|9^QLHwr zp_W#ph*A;uVRoT3P^V6}wab}pXSXxwbndk2wC6qN_j~^T=Y8S8fphNW3ev+vSA=31 z7M_{GKLmRjgcBSHO-Zx2V;HL-H#Sw7Z$!37Pbk6ZAC@x zVzF2vkvwl`kV>UZjbKwt%j?$G*8YA?|A0n5sFTaJa=Cs;jt>pt!^8OS2(D0!!@I_m zMy1lIR;&N0{{R|BSb$ceMWfZ~0J`)#ogSgnS#Vgm9>-x@aok{lK+`c8#>e3}4xsvr zhW0ODG(wOJCKGIkiGd(YCW6*PFqq8*k}xw^2*PDCn=MFyDVNm(0(4nzHmlV}3rD!1 zvf1r6kbxxac9PakGB_M0=|CbTm`nf;R1;1o3>~L)a?*)}4Y<%CCtUztt|=rMV0s!t z3rD!1ns&RVX`$Ti88k@u41>orGvh%rP?U!P{?StZ7`!w-pV#a2`hZz9AYu+?Zq84~ z@1OJg{qtz%X%-gd7XZ(eFKYPr0hbO5@~~t=c?MldveNlj9eZU4Ttcccj$OpCuxOM3 zO!7Py9uQ>m_vOb9pDa#av?NznO)3q6ce_7U=sIrSh|7NBx12~@6;b&)yiC+JAZ5p# z-up@xz}lL{=@@u65*T$_|LxnFPv`G%AFEN3(cODi^fZz3_{$rgRz1rRl`c-L$2pY` z6u*~eRe7l1R4k*aHtEg?>wJWKUPPQLipRp*kMVkYdw8QN^-*CF7G2nR)sxg*9krug zaJVt34*z;Bk4t^%3ON!(w1jl>Q-Vr!CYE-%A5rPF Avj6}9 literal 0 HcmV?d00001 diff --git a/docs/icons/odf6odc.png b/docs/icons/odf6odc.png new file mode 100644 index 0000000000000000000000000000000000000000..fd3f60aec61e9ee04487ec38cb0eeabd1611b0e3 GIT binary patch literal 1000 zcmXAnYe-XJ7{|}1iEUO+(=4boN(@BIMHxtRnYq;*%giv{7->aC;U%hXk+fR352cV> zMXZY~uK7)CD;@+(WHr>EHnd2Q`mQEit<)Fl>o%jNRXQN!q%K|5~J zYK>a0c|wa%OyD{luKS5kPFmqde(7iR`q`P8ncp+N0Rts0z-Ta{F&a$(S!R>Tj4+uT zI4s=X`y z@H^~w2NIyl?{t6wSx%SB>2#685iY1)Znq1h@Oa#A52@QjF*oP&%pno;ROW#>RP$ah z3>mN2=kp?A1Aa6}pC2I0zkoyo1OgCJIKl;0AQ%jgLIr~%G{|6xA{-8d!bplpBpd<$ zl1BbgL`hShdMrlZg>#nUW!;1G|qzcNc#C*dTe2)}-6wtpPSxp1PO zrsR2JF2Ai&y^FOgw@Nh_IJ-mOlHM)4lyQbmTXMFp|5D@5d2!!8-JbYZW3Q7N)cT4V z5k2#CFro7a`x&pdT*gY--}0kcPK+pqMhrjm5^340K{~&`wXeNcG5ljee*?=ezP@@5 zJDq*Dyp$)dD&jZ9-VcZ;I}{5q`Zcc{?<6w3?as!F4~}mu?c2Wcq4LJwRFzoSp%}LI zYwDGH$@QycGRZw*`5tb*Aa7hP`ku5!zqRsY`;)ZI8Ts%n=GCue<*yqa;|pZ0g>_At zJ!>a!CucHWZ&Nc@Fliqc>zU^cCN@hSNx$7Jk$R*WY4B!cc1!00mTF*A!N;kgTc6J# zW~8dF<27_ L6>z!_NLu~_nAe$? literal 0 HcmV?d00001 diff --git a/docs/icons/odf6odf.png b/docs/icons/odf6odf.png new file mode 100644 index 0000000000000000000000000000000000000000..5e654677c0bf15df71461fcd649095ee098ae0e4 GIT binary patch literal 1047 zcmXAmYe-XJ7{|}bOl^jyr4&Xtr=%Z@E-?C%ww1$aYNDo2OtXtYjqV>Rq!79=urkYT zbMpexv|2=70@FeYr#Wr8&21hpJG(pQZqByZ^PcnjJ^%mnzHs2cIrnpOjz&goj=(T1 zl9S2GhaC&q6t)`LE9CCOuvNvm+yb^rrD8A`Nl8h`$;o>WO=V>gURei^*HK>H+0@kZ zMks7<79m90<;<}8m(3bkTs>#O(AqTBMu9n!g1Ip9G{+sK$DrCo|%E; z41j7D4e2Z}HwQsd==HE6dJ2Nj>j_dlL18cuNWws2BnXGmU@#&9svIUG2#{qmn@uJ& zDIDQ~%51TiK?WOwpt!L6N9{eK(PivwRJ1?i027q6cwy;o6{%{h6YM7%9V z_^h|(bt3CSk0fnpVtMWTiSLU3L0Q<2VtT=*gux%Prk}%SE1TCwhdf}{g&x+tec!Ss znk#rnU%Y<#YDkS@LY`X}CgqDT{^*{xo!Zeq2*>a zwHsMl5=9V|t3G5GYc9>rU5=M?cHdmPwY6!_d(Q9ofBw(=!ufDGr=HK-8N*!2#4s!- zGlQE0dp=A;bOf|dmX(TO;g$TXymXaH#b&ctLJ%B^RX_?tA`m<+6?B!Bb_s>u5{X3G zB5iGLmC4%LWU}`5_73141aTjDfOv>_)Zee^|DjR*)F~8Ng+f1|zy}6!r4m>E!UqS( z;2nMsPYe%FsMYEb^$4J$g#~CeS`@8T2T-Ng>GTMl&WOXp^*9dOgyW;5FwoSDj*gAN zaST8;jzT#OOiaKaX$S%~3_(MZ1VK^~B#ps9B1r>{ktCf)gTaUd=yIBjAV8JLY&Mz9 zlyHO#Dzn9625GETi^WQ5vC`OVR;vw(u+w7)Y^dxG2ZS1jV{+1ggbg@Rkdsb;D(4?0 z3gB|VP{I)|s9bKhixSH1_Mjl$9vZLLgOXH^q1pNMhKLGqg0TDq+ zFc_jH6bgnyp(&Ipis|X8X<+Z(T0i{zu;V$rTx=UTT!Ak8cJ1V1;z(8oTo~0EMaM8~ zRvelzOnN5~9@w49-JX}IEXTLaoXzj8v1?3ml1pBjuIEBIE30wbdMI1STlA7uGIWfy zXGT1+@qwHX&OVY~&1qgAx%5lT`P;dbhJ*w5_$!+#c+#JY1R`VRJLxqv>e(vonnDqPHh* z47%$FtT}Z=q-sH|yy+|1e|JdVx4KU#z1?&xdY&NlWZ=`gImupTeosSV^BOV!?Qz`6 zG^uL&<@Cb1@(|t z;bN@(&ad;I*X&t5_h8Acl=4$7@sg;;Oe~5OaV~9PSs8{^&8j%e@!Y!#-y6$J=W)At Hl!^WWG~m6c literal 0 HcmV?d00001 diff --git a/docs/icons/odf6odi.png b/docs/icons/odf6odi.png new file mode 100644 index 0000000000000000000000000000000000000000..02353b7ba8e5c2a51e47c52219af783f6a81430b GIT binary patch literal 1067 zcmXAnYe-XZ7{*U|$yw2AW@;?Uzz?lV$_ng)#Y9)zGLy)>O-&=p2ucVeNUOCj1l_Dj zH-d;DEtO)GD+fhUd6}1Ty35&gXZOwJF1a@Ceb4#*-sgG$e>fiwhjXPsoVPGOC7vLN zg@Sy3A?yT5Vq6q-@Ubw9Am-K;2#azx8V!%fTZ^m%HX`!U(wAkWtz~7c<>hU1xm=-8 zyi+JXAYEOUE~QfW5eGy*(dkB1s%}u#+pF#E)2jRRYPC+SHVmlAfdO)GkQ^K$hlfq@ z4!=hxMn)z^M@Pp-#{exOEI_B#;plXFfG&exZ$R{VD+!A(qxD+(~>wOK)cE}PwMv)O6k z2p257!(j&*oKAfl#h6#rw zbRv;(BodjynW34TotXtzG&JHLIp=htct4Rtjnv|$YEK@Yki~HG;letZUwn!n=5sJ} zh?WOQ@W5^Xe`itBV6`MSc0oaRgIjCk$S((6`u0opT;UzR^Qb6ev-l0SMV&hHB%Vqc6Yq&+9zX7iGoqJt+p z>dHSIYCIRps*fXB?t+^AhgS8aZ&g13AYUHW-Bhx9O-E<@50TS#yzSL_R$H<1%*|on zmF=#cdUK2>nXS6}gX(?s%b?L06}Q~G+Z?yJH0x~W^T!+1`>VH}UcYlcQ%3%L!8w~# z_2u1DVN+!zTV;!s)rks)rsOnXSU9tTt$O5c&KA_N(ks&&SJtmzCX?iKX3f8SP|D_1 zJV{;sDvJMFAkE#jbzR1W&xWrLFRPcN9gHbzPFS9tKpLsTtta9auicjyD`l%53|;(| xS&_QvNXed!)#tdfmAozS#5``)h3piGgdn7;wH(e~xePuvA;=Z;+jdEs{sRrR!Fm7y literal 0 HcmV?d00001 diff --git a/docs/icons/odf6odm.png b/docs/icons/odf6odm.png new file mode 100644 index 0000000000000000000000000000000000000000..d24aeb3bfe2aee996c8771cfffe1c1fb228c90ec GIT binary patch literal 1060 zcmXAmdq`7Z7>CcC=E{u1IV7o8i4mq{h7?`MnyEFH*GN(^%cxOQmPWTfS{E#%B7<~j z>XwU2BSj^%AW0Dm%(G=}(=(6Don3WKcX8^p_dDl#-rw*2J~(jToQG+mq~K+%mthzd zoRTcafX#*QIBaN7t#Aj1`JG4;W+iGgn&{~07+@O`?;q~}HH;7FaGb#L5hYG4m842Vs(zD$gL-)5 zU-g(;J*L%ahqOb$Fe5C07$(pVgbtu)$Y7!#p+P!b3~sl}tse;5M%hSHy(0Ahp`)-z=Ct9DB1PEWaX3~pd;zjpUt;bqo zs@b7Mdu82A{EC0_n){{7z*R*=Z;#^R^_nfcvW~`zo1dj!vc_h9$@`bhIl}DI0SBLv z@uK#&sF#PEk5<=lSp2Tksq@>*BQ)Kc+S~pVvsuS45#n>D@ud$Z+?4jmhDx%f;fk?R zXycuF+f=|4rAjz4`P*(=?ulY~xc=7q$UA4t$m+Ktox7#S1&^kRpZiz(@g)^=okLP_ zXnCtR{r~^~ literal 0 HcmV?d00001 diff --git a/docs/icons/odf6odp.png b/docs/icons/odf6odp.png new file mode 100644 index 0000000000000000000000000000000000000000..52ed9e54c3cc0177954a66d68cc940d79258eaea GIT binary patch literal 978 zcmXAmZAepL7>1AY1I^5dSr!QyDJ3DxmH8tiYofC$!;d27Y-A}SMP*PykS>a;DVbJo zTBe3&q!fiENwgmt<+SDpZEKrnYdibYIk!2t-0XSJxvuBFpZA5s`EgDow42#9$>1p-!PqqA) zRxa1b1_+YEXoL+hQV@jENRS!{3X_RI5+({W zK{(AOlNkw6<+PYVfGmsEYOz>J;RqL0R-4TVQrPV_o1N5Vr&wIH+ZU0DB`Qn6BB~{a z1BQ&lvApa+!UmjZkjqYhEawUm4d8M?NZ|+ExGT$P1zatL}scKtG_9V zd3@To3+~XtF6LAA`$AFN<{aVV88I;>nV3?~?F$RpEgh$E#@a_avm`$zR}>A{fvnqG zVwv&G>cU)h#iqyA%a|J~7d&+aw# qb$4X39<(Ke*WYPv$cc<$Ffgo!!5!Rl%24ewFP2 literal 0 HcmV?d00001 diff --git a/docs/icons/odf6ods.png b/docs/icons/odf6ods.png new file mode 100644 index 0000000000000000000000000000000000000000..039bad1fb1a58e894c0ac5d0f0c4318eca9b40a6 GIT binary patch literal 971 zcmXAmZAepL7>3XMNS#^}KQdvVM4}-=8lq&8b3;c{%+wHdj3kB1(hTaKxG-ksk5b94 zLXt3q6d{o;kp`*YS8dapy3OO<&OUXU+uU5+?0L_*uIIj=_l3jxaZYzdc}Xlig^poZ zEVqxP(RktFvjPPi^byARn_V*mF%}h zCR58~+j1E$m*WZru2{p@*R}AHze=4_soUJ#+}hj%RFtp)wMvaft=0f!ZEG~!2#v;w z!@{?59JUF^cXlAqWOjD6S~zL}RJ&+McLALaf~3&vVMFv31fkaxq>8nL zLYLduOW2qwoLLH&sMgZjb_|P-N1TOV%F4Qi zkfb}V(9yTK@3~*fL~$`i!lhaA`%-;?jY#6U)l)IC&~J zKDW7y!{yiH@LGM7v;6fD$-(f<@<-!@K!o>qGh2GA&vT|Tqh5XJyvmSjrbZ--+L>jY zS1IUtQX&%cFmfh3BlDsLl8BL?(cux^`~teTIBe-gmAN>qr%V2N_nfdx#cavy?V3yz zPG?-GP8E)_;-s@@vsr)UpMSf{qBEpV69#e^QakqWbV+o3~WSr_#Y9Wi{}6U literal 0 HcmV?d00001 diff --git a/docs/icons/odf6odt.png b/docs/icons/odf6odt.png new file mode 100644 index 0000000000000000000000000000000000000000..216cb19009e62589a537a6ef630a70c8e0090f88 GIT binary patch literal 983 zcmXAmYe-XJ7{|}NgqqgGOBM)@D2z(fmG~h-ZA*u9iK!(z8Cv?G6fZ%233E}*Oi?s) zE1gOxL5h$_l0^n)d8>J$soOl8+u2p;+~(YJv*$hM_j~^T=Y8RDKAh8(%gYQ4ITeCo zSQsaZl?OW#5*_3Z?UHgYVVGY+E;paOy1L3lh)YU7@JojH{Grm)VX;`eu%KA@t&sgu z$z)2IY-3S|FD~LsOZd_ZsI-sD01t=9tG)kokAZtUV+CZpO z1{@Z?f#a}^IIdPhpvkD!8VwvZ0IE$iq?>?N3qexobg&^h3WCt-2vQwEq1O{gLQi2J z2%AB#Hy{D3Y(@hJkYzNPj7AeF9N~h>WHy^X3X8>Twvd`F6kA&s%N7!`O=TO{LbYwR z!jQ3AcXq5u*nkZUa>oXcW!puf0qk}NDIDQ~%I-C}WksKcS4uQI;!2-n^+nl zuRxcw>`WFW3XIKyOK?qAQ9XtojX3`lnSC+6N6Mg$_fvnjT!rQi&E{9JH*U*lE!q-tzHGNYN8 z)9%X!4G%L#f@XU1NMle+Uy$Tl!0hZUvm>JHyI0v=buq`u5Kg7JAN2{^lCv3%Dv_Z2 zdR_kQ-ofTCug2SZo`_@Y#wVkLm>PQ`C^xw literal 0 HcmV?d00001 diff --git a/docs/icons/odf6otc.png b/docs/icons/odf6otc.png new file mode 100644 index 0000000000000000000000000000000000000000..171287518c580add838240312d798ab000de8e05 GIT binary patch literal 1040 zcmXAm3rG`j9LKMkxfIE;hdrzrMP!-Pv;r&4W==9EmYTWA%$^i!W@KQ{hJ_VW6cw`~ zsC-UWBt;fUgCHxJ&ROZ)=Bc~e+qv7zEvNndcc1U;|A&KvyIZ+AnNbldA}|b#%Hs3# zU>8G{vgbkjUt}j^*xUoT*+(*lhKAzftHIur`c zAkWau&d$sNDy_x`KYLD9Ud~}GjT}6MF2@gM^02zFI6hn!RPc)~VOV4g${eizSu8wI zkj2|~Bvw-CrzNS3$+_n57Nlig|cHJ7@TS3>W>a-fpDZz+`uV*(y!-Qy;WUJN1@TDdkbP}|&>mb5TDbyL|jQJwhi?(KcG?8a{gSi#Ou wyN*6xVLdCCr?F%obFmoyeaXJnQCqiS*my$Op2E|QmGIfItc)C4usK`E#uLgr<6vQeWSFt%EXtS!A9N_*O#-e~DXx)%2S&-wkH=XuXb`k`sR z-YeO)s_^wf48vB{*5LJUOQ5f^@?q1xyZIRQLhIh$`$Sf&wY0Rfyu7@kqJqoi@_0Nx zpDz#ycs#XKdaFq~+|)FD@ZgAAt^TREx35ow)M)xO8g0K87#tWF7zEH<2W~(RHxW9W zZfHn1WHj21Pwb|rPLs)DGPx#9#KZ()HWTJa;@LAde4l?U9*f0ev)QI?(}0~34&bmm zP#g{?K#$AmbRnEhKLLku5d_=-LCnlRVd>7yxZUvR2GGo+(9QxL4;0DZ^}>aE8A#IW zC274RgU?4INgsosBx8P`&yNI{i3R*1Ku>_80s)E^9^nNI6%0}!LnssshG>H!hHw~e z7!hF_0m5h^(I|v&G&(mIMZyJQOk=Q1@SHaNoMC|`lUZ2EEM$QHP(VZ$lFjDm=5pCwF1LuXNVBxGxCAs--_ydM zo%d4@#`FJ}MTU*~1(RYxU(xKgQTca3%#;-WikqcVNZdmA`?x6d^lI$in0 zOZeQj)#shk9;@6s@FhnT;G9@LrF_?LN!~+6PO%~+X}Q<+OQG-aYdxE+Z&9VH zX+hQG0d6PP7>X*2<-;mghqLd|xL(JX3->g3iseyXGCAe}bu{q~xzg+1)+n`(Vp=OO<-E;E& zM#UDq0k79;RrwrM?yIm^aAj~=*<<0M>aLAz^pRgP*S@*GVQq{4Dd){S>$+u%!{Xyz zSGV2Wp*;25U)rts&oAGs+?DWvc%Ht!2xv literal 0 HcmV?d00001 diff --git a/docs/icons/odf6otg.png b/docs/icons/odf6otg.png new file mode 100644 index 0000000000000000000000000000000000000000..60e2c778d15cbdcf54fa74a3264379ef03684233 GIT binary patch literal 1106 zcmXAmYfMvj7{-rUrNS^q1;J?sULdj=iER}PCQ2(pK%#&j(3W8}+XpndiAK<6p>7V{ z%@~xliUo_*B48+jXvnn0OEjif3R_#+a$4y*z0e!INu{v&f6njsJkNVh(hp60^D=X`32;v)xEdYzfVzb#C z4u{1O^ZA_uewRSdRax0B7K%eh~1qw^mVzFA`(F&mXh(h@hn4E+nX>2yQP#X2x@pl<){IXq+yW6Qr4%a=E4`T~jn} zH(WQuL)Qbi(RjRG2vx7w=kp@r0)D!Fz=vkqKaDaSKtWCi0BQokV1N=P7!08xgCUx5 zI1~zp!W5B6I0Ag4jC`V*p@>FjW}-7u;4=z{n1#&F#;C?(v$0rg4rPvFetvEq_)t+d z3V-&3n$nUoY!9LP4!sDA_VciY#p?>-W$BrMinAD&uo86vCb^RWANaPAx3@e+dmQI2 z$xnL$)Y{&?I=dNo{Ra$#3B>RX z@<#P#riX=V1dm?Hda4Ygm8t6d2E5z7YcO|E(wmeKInUWKx|gxz^pU=ibE=cI%bu#+ zol0Q?ex@rC zk~-lRyfdozn^)Gg={v3^=y)q+L+K)Id-&Y;-l9fQ{<|{&N|ejU4E1x0dXg?bRx;x* za2XeONgnE6ZY#6OhJLNc<)?|dLP^4tshfK=s``K4=Pg^Vie3|L-;h$JtY_X@eL}u5 y|ChMWwF5bZ3Ne?lbMYZ8v*3EYikX<5jbVQrtC98>ueuArKUTP}gx8%{CHfz3JJzEB literal 0 HcmV?d00001 diff --git a/docs/icons/odf6oth.png b/docs/icons/odf6oth.png new file mode 100644 index 0000000000000000000000000000000000000000..16ec9c67b77a74dab7b2deb6e99a03fa81fa903a GIT binary patch literal 1062 zcmXAmeM}Q)9LEnVSePUjHq#hg3ek{hplHhi`(t6)hLRy+YKT>;4NM8hoB<~we=K8* zD=%WELae&E8LKTKMi~PJTLdL$3U#H5eWB%Ade>JdrEj#h;P1KneBYiYx#W_&wzATq zl;o|+7>1=33;73NKZI;yZh#KmD&b*R{Nb{aLjs*nm!6)^<#KsEUT$tKmn*BN=o42w z5Q`riJJ#RWIM~$mS98-)bMw&o^TRDIBQlvxe&>!{F24)h10xg&rBd13tL#;&=2Wld z)c>2*YNJ{`KcmKHW^j!L*SyBxys^OB-)gN|tyQnr8}tTXjus4HoHHUDjV6Gqd6Q`# zVKUiq7OLUfiMN~^3 z515L_v%Ksbtgo-F19jPj`S7#j&K@W|h!v39 zlju_UWf32fCTthNCFzV%)PP|hq@l!N*Ke}mfg{EIFAlLZRg%KQUiK5pLZ!59@i`CDn{#d6Zw{@c**$F+CKL0e|8FLd-4WY{4<=)`!DVe zw!1rah@Qy=26k&3`@8!+kMt#J)mv)5X=R=!B;tX3)TVx8GTF zO3C4<{u8$S%v8xf9eFr9_{W7?mpECU>|$i(ov1vXDcoewF)32Nm*Upnf@Gxr^YU41 zQ~BxR9I2$bsA|7xPg%~c&ThlgqztXTOjLe#`sLPy*RP1Wjhp)(X1|;+X*0)#XVv;` z8Hc~R`fE?>_K%-TPZE-v+D)4o?UO|UM$1UPUUq}!+{YNWyfCqE?1#$Pf<59aDf(S#WgJ8AI}brC!$2muEeGY6#80m&r92thw+Vo2Cn zT=qfnf;Q0*YiR?7q%4*JgF0N8kxD6OTYEW_p40o4UZl3*`#4l+2M4u_N0 z;bd^R;JOfQrf$H6#_jPy=z2U}uLlVi@GeH z%0KuCe(bo;+Uh#&1f_044;L#><5=&u>~eTWyi)!{2Zkl@LXE>72{Paf7b@_Q`V7@2 z{z+CI8~#%>T`nz|+${Pt`@7NB_n~>mY=*r1Jm<0Rsy`z~ExqLUb$P&fgDHcn>|0P`3(OTv9 zw2O!L_9V1lm~OMZ)YN?w{;T-hgRd+l@#i^>yle0JHr((2i!8o;^K&m@+Sbu}Yc^BT z_mI4^%I?11QuBC8q!_A|%s^Uyf&({8Uu53Smu``^O;%iI<5$j1vkIhF#mA(b z4ZOR39DKCq?m6MW;iH8I@`~^~|EKI$@2J23K8<6sFsh@g>D5?s8GQ9vMOigIQp)fC47EqzBLDyZ literal 0 HcmV?d00001 diff --git a/docs/icons/odf6otp.png b/docs/icons/odf6otp.png new file mode 100644 index 0000000000000000000000000000000000000000..14ab2efc7b76f220c8f95244a05ff9539fa9b0dc GIT binary patch literal 1017 zcmXAmeMl2w9LFzpWfN;qh`k6~uVh8VHX;l(J9AoT*b9`KOsyy~TUlUaq04F(NCiO? zON+GTbcK;nptL`NpjzIRrE{C7ZMS#l-raKA@45SY-<}5!4(?ixloY13SF#zn++CXW1uLTjiP0v80>ZmiLx^|D9Z1!+Z{*%Q+}rd1kmMlxtvZHEjYpjmCNmR zffzgyMQ0geH1T*W7LUb&f5;%j9C&UnK_`)zOC%EW z$n!J{3-b$r&S;3h&t7!3tmG(`M~$9Em#Tw>IHq7_iQuwSCOTP%VQDK+7GZ7eneaev z5x(zOrlDGzzc|4C3|yTdhs-VIyEWy54bGR>`FAq4@+FZiSNgAf?W-87*Lu#&zl){X zL3S^f`@XT@^nLDo4436>R-4*vdQV;R$rNR54OdQZuN};I*LIk5no_@QO4Zn*E+l%L=|O<-5G+ zH0tbcKSd>tsk&#v%lW0{`z2>8YfqJlH{dd3v!(TSyr*B@-rM|?ldF(+G~C;pRG*)6 zV|?|6t!Z`o6;=jP_p)6+Q|PIh*7PEHPoBj)i&`Mfbcf2^rVCKiha z2L=WQ2Zw;?V8jcAR4N@FmJTZvTE(Xgd)86`e5gR4}y>KFd|_aeOOkJ_MC z8#EftU(H`Y%LoS0X?4gtogScTUay}===CNX2A{`qSTl|?EG#T8!f_Em^$(fW zKfqvsATbaGEQDYnNrE705hR1rNFtF&1`|oTOh%G@)Hh}=T%odB;Y@r25xS+CF ztrif2&1SXQXjyFxb~~&cvBYEvu%lXXIKXrq4yV(B1Pi#BxBw?A%0(elZe%3N4bbKG zc-*w0JRUDHlE=&7^Lf2KuaCy>_xXWkTK;8*08KC$2m}K`UhX5g+}FrpB>RzQ(21@km~d3a=QEo7ZXKqErm;bYiUCVhOJLRiNGX%sqnzT zGVbBJRMi0i}>eGwVbTsZRfUXdh~Z^gTv#(zR{kCtbCE6KX1RYC(ifn zz-)aoIhFCLB)IbRLqXJ|V|AK>C@XPieS1xkp(vE6OEYA#g%5USCZ-FEDQWz%CpW2W z8?M%WrrxvUX&WC%Sn~U7Q9=HRl-NtPMTahTZ4$AQQW6A_@%#5qJ&TBm!Kx+viI#~k Q8Sr7Tvf@gvtWY5Q59dy!Bme*a literal 0 HcmV?d00001 diff --git a/docs/icons/odf6ott.png b/docs/icons/odf6ott.png new file mode 100644 index 0000000000000000000000000000000000000000..fa91e7c0dac5990093a8d7d5b151b7f3966a37de GIT binary patch literal 1022 zcmXAmZAcSw9LF!6wPu20#43d?iZF`GbMzu9U1v=)6}70`WZ44=Qlmw=vZ%QK8B?nt0=85HW&;-p%BOM{QP{8NQC1`sZ=AAj>=@CwY6HMQaLy< zFgQ3k1Pp@_FAyq~O08C@bvl#on~D5xAxSey&dre2%nYU1Q~Dp&&z}qMuHUoP*;%X6 zX#8XR1DIIB0A`aJ*=)7|OwCy=a|nyYLBUXS6b0*~sQGyaG?V%Hg#|b+0H_v`87%@< zD+GzfW`l*;SZLa2qZ!#~7Q3BBqU|gWnhrSZb_Wu`R>0{10ZchvE~nGQ2##<;<#M}S zAQq3u?e;Kodsw_)STACU%@W{6wdC`GnfQEuzYhr(2(SqNepJCg5IGn^Mhb=irb6Lx zh!Ipc96?43M_8iKNF*AGGQ?uh81R=->@Q24A(4p36Y&J_4;h451}`rsnIx0T$z*Z` zd4*whb!8RM8TC>4*=t%V%c`(KdiFB9)SWm^V4Z0>61c2yl$>qGu=FgHHCT5KA08k| zh@xt~{(@Y*HYoTEwD_q>b63qlZOufRv%eL;%b!xLi{>`HY5Fo+J9%@;Q?K|cl}}CZ zGy=ico#Ko41Y;P{cxcy%soOT=Y3?}7QO36k6r|wBiOsLNPi9`EM_#sbwRXAe-OWi( z&9(AF`|$DuMC16LkssODPm>mUX!q5jf=(*9^KpZwp)O}{#wlCcdqd__T4=Z&cX_X9 zM|Mwtla$@z>YjXnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf22^PEdd^F&3SUp#HU#9hWLHC{`p^eh6ea~4tRaf(| z_%3JAe*U`SyKG~C!;gtpQxXFgX({TuJQm*75*apCqqytJp{nC4Q*X#X Y_^R}pPJ1}};XQE`%{%V$b23;10Di_)fB*mh literal 0 HcmV?d00001 diff --git a/docs/icons/p.png b/docs/icons/p.png new file mode 100644 index 0000000000000000000000000000000000000000..450d9c6eafab2658bbe253c0fd880b900b789771 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DgFST5ZC|z|DXB)f9A}Y#>U1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~s5($mE;gd=+Cxr4k16nK~&R&Q_! zbKnVJVgB&ppYc^qN1I=3;?=cP7VOVVYm@f!YR@=#Mst~K*Q%qQPYjQ#os>8bnq|W* z7JFd2UGU>ud0St^SKm0@WtZ7=gE>`G?2h?)Gf$x;BUPcGG$|)DSs^7qH!(9$Pr*C23@G7Inx2tbtfP<(;$=9bW|rsyjnGjD hPAw=&%}q)zQZTf%G%fq~eh$zE22WQ%mvv4FO#nt-X9NHM literal 0 HcmV?d00001 diff --git a/docs/icons/patch.gif b/docs/icons/patch.gif new file mode 100644 index 0000000000000000000000000000000000000000..39bc90e7953103a7fb4d6dbbd3efcfc1cc8de759 GIT binary patch literal 251 zcmZ?wbhEHb6k!l!IK;s49|+RY&iwyBbLPx61_oneV+Jr#{O1>vky)&eSX80_q%!jq zN-|Ov3QCi5GLscj@^ce2^Yj$FQ_Fx79;N9Ssl_@9*&tqqLuzJ;UUGh}jzVy1K}l+E zQfiTcp{1oMgW^vXMg|5Z1|5+3Aln(3^CEWb`4k}HuzIfQzD(=$g4aWpcJy9n?OYMK z<3neVTdwpcAKpI=-eOD+8f(7P$v8QjjESn*)KFqotJLnbYDxf$LnDLk)v8Bb)9>m( q*HL9Yo3!quRNC&zr)@sV$^5d;vQo}swQXy+(HAuD>9yx%um%8r)mtS1 literal 0 HcmV?d00001 diff --git a/docs/icons/patch.png b/docs/icons/patch.png new file mode 100644 index 0000000000000000000000000000000000000000..85c9ba086d4c794f9e48fc7f9b3f5f153e3d95d1 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DbWC*5ZC`ekd}7l|NogYXQnYQ z7#kadl<{rR22#u=L4Lvi|1(@a#p?*#t`Cr(O!9+q93nbsU} z`J#rB!*Ulk6FuwVxDcEFKK9jrXI)nI{`6zXEf0BLE$N*OHD>)lo5D(5BTACiGK&=wi%JxLRA!z+Nk*zdL1|J>X0k#`er{rBo}PktY8g<%qclAuwOB_X8^p_S qNX;zK0~(>D5S&_2lA4>8TBKlTX=z&a?fo2}4Gf;HelF{r5}E+(PibEO literal 0 HcmV?d00001 diff --git a/docs/icons/pdf.gif b/docs/icons/pdf.gif new file mode 100644 index 0000000000000000000000000000000000000000..c88fd777c4b2a85b930eb4a6b68440c88536289a GIT binary patch literal 249 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIn&tKm;nhW{__jT$ShV!EGkg|Qki)QB^jv- z1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf2ITpM2d^F&3SUp#HpXaXk2Sl>&JZ}wU>twhgl(8#J z&4;IaU+5wAJaJ`3 kwKt!oQbM;s-=_PA@BRCyb&avi?yYTZ7J^Yx{G1Hd067U;U;qFB literal 0 HcmV?d00001 diff --git a/docs/icons/pdf.png b/docs/icons/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..777fb18252e26e220766032902f05dcfbe29651c GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DgFST5ZC|z|DXB)f9A}Y#>U1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~s5-qXb~gd;ll+(pg<3OueC-AfzS zDDVYbWbE4WH$AIoq2|)>uO)gq@=OH}a_XuoZ*39tDQgUPRWb2Qa?jCIGrzvjf1q*o zdV_c(i`=m-lP-7OE!XX+`D=KsY44jalb!tY&R9!%xOyAq0Idouag8WR&d<$F%`0ID z$;d2LNGvK*08*KG3MCn-3I(M}Ihn}{DfzjHnR$8&-l=6k36IkBjMQQsg=`Qn!yz@Z oL=R|$jzVy1K}l+EQfiTcp{1p1*|+y|fHp9Ay85}Sb4q9e04yqPHUIzs literal 0 HcmV?d00001 diff --git a/docs/icons/pie0.gif b/docs/icons/pie0.gif new file mode 100644 index 0000000000000000000000000000000000000000..6f7a0ae7a703000c365896477c32f9f1434d14ca GIT binary patch literal 188 zcmZ?wbhEHb6k!l!SjfQe|Ns9p|Nk?9f#N^Ekc`Y?g~Xx~1t67~r%;lSs!&jxl#`jP zkdmL9n3<=i;GJ3ql<+7`&qyuSQOE}IG8|GfOZ1ZSb9EGgQwvH`bCXhw6bvmbO&Jt_ zvM@3*Ff!-Xz+~Oizw-23{>3JXu0=Fn+uq4rbVj_b$!S{Jq*b>ox4e@+uPSrG fY~A@idsi_sTAZ5D!6YVVJJJ1GWyGRRCI)K&$B{!c literal 0 HcmV?d00001 diff --git a/docs/icons/pie0.png b/docs/icons/pie0.png new file mode 100644 index 0000000000000000000000000000000000000000..f9b6adf9654dcada07478056ccec994acc464625 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQk(%kA+G=b|3CBpKaj^Gwe3BS zVk!yp3;xgWbi08UkjI$h?e4-Xz~tJ~zw-23{>3JXu0=3z*v`4OaPFr@>FpEKG8&zNm_A7^cehR7 q{3odT-{ZSYE(_O7ykRZyxV`aZjoH-0n$0tdUlfJ#w+AvXSOWl+b4fP< literal 0 HcmV?d00001 diff --git a/docs/icons/pie1.png b/docs/icons/pie1.png new file mode 100644 index 0000000000000000000000000000000000000000..633959c1eb3b4c4bbd65a6ebf1f3bec66204fbf4 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQk(%kA+G=b|3CBpKaj^Gwe3BS zVk!yp3;xgWbi08UkjI$h?e4jJ-V!lY$qfNH8-CpO9hmn=q5dd*L%? z1`R)%g`d_;djm8#ti&~AtWQSSRt{fL;*-;<|&k9q$(7YCgo%%E2QM- zCT8a8DR`%r0VO<2(=$?wbriBeybOob%o07I5jqONsRbpexk;%-3Wk=Jre)vW&jH%N N;OXk;vd$@?2>?wcSRnua literal 0 HcmV?d00001 diff --git a/docs/icons/pie2.gif b/docs/icons/pie2.gif new file mode 100644 index 0000000000000000000000000000000000000000..b04c5e090868dbcea50043700d52179ba99e89a4 GIT binary patch literal 198 zcmZ?wbhEHb6k!l!SjfQe|Ns9p|Nk?9f#N^Ekc`Y?g~Xx~1t67~r%;lSs!&jxl#`jP zkdmL9n3<=i;GJ3ql<+7`&qyuSQOE}IG8|GfOZ1ZSb9EGgQwvH`bCXhw6bvmbO&Jt_ zvM@3*Ff!-Xz~tJ~zw-23{>3JXu0=3z*v`4OaPFtZ*%}klI+l54ZqwVk=`G`N qqqzCzcVC|^a=f79z@jnzl=39bRIB-cn#w!p?CVf&?+9dIum%8pzDGL% literal 0 HcmV?d00001 diff --git a/docs/icons/pie2.png b/docs/icons/pie2.png new file mode 100644 index 0000000000000000000000000000000000000000..198f3e41bc5d9801e0ef4be4d6f43263981e4b3c GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQk(%kA+G=b|3CBpKaj^Gwe3BS zVk!yp3;xgWbi08UkjI$h?e4@3j0uoBmZlH~l{+|;}hhLDWRVui$_5(OZYnWs>ak*ZKonv|27tdNqQo0yrWr{JAh z29)q9P0vUz)=|g?@iH7zGfVVnwEWgKL=<7gQu&X%Q~lo FCIE9CRKWlM literal 0 HcmV?d00001 diff --git a/docs/icons/pie3.gif b/docs/icons/pie3.gif new file mode 100644 index 0000000000000000000000000000000000000000..4db9d023eda78f499c5e5efb7d6739d0d450652d GIT binary patch literal 191 zcmZ?wbhEHb6k!l!SjfQe|Ns9p|Nk?9f#N^Ekc`Y?g~Xx~1t67~r%;lSs!&jxl#`jP zkdmL9n3<=i;GJ3ql<+7`&qyuSQOE}IG8|GfOZ1ZSb9EGgQwvH`bCXhw6bvmbO&Jt_ zvM@3*Ff!-Xz+~6czw-23{>3JXu0=3z*v`4OaPFtZ*%}klI+l54ZqwVk=`G`N iqqzCzcW*N`uLwVHCM7ial+@(%Il4wxJnexD4AuaG3PW-L literal 0 HcmV?d00001 diff --git a/docs/icons/pie3.png b/docs/icons/pie3.png new file mode 100644 index 0000000000000000000000000000000000000000..3fab58cdc2ed3db730851ecaeef0d5b343df5c9a GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQk(%kA+G=b|3CBpKaj^Gwe3BS zVk!yp3;xgWbi08UkjI$h?e46C^(_|k9qozj2HIp2(wF2~+#ZSnv`AwL~!Kno$skuq1MGA(NmZoLj-p>Krz~JfX K=d#Wzp$PzM5Lc1_ literal 0 HcmV?d00001 diff --git a/docs/icons/pie4.gif b/docs/icons/pie4.gif new file mode 100644 index 0000000000000000000000000000000000000000..93471fdd885b4e54a6ebcfb68fa98626f3d43d75 GIT binary patch literal 193 zcmZ?wbhEHb6k!l!SjfQe|Ns9p|Nk?9f#N^Ekc`Y?g~Xx~1t67~r%;lSs!&jxl#`jP zkdmL9n3<=i;GJ3ql<+7`&qyuSQOE}IG8|GfOZ1ZSb9EGgQwvH`bCXhw6bvmbO&Jt_ zvM@3*Ff!-Xz~s==zw-23{>3JXu0=3z*v`4OaPFtZ*%}klI+l54ZqwVk=`G`N kqqzCzv6IghDLmwE@Ojtg`DD^c7sH|;f6tbO23!o*02@O^$p8QV literal 0 HcmV?d00001 diff --git a/docs/icons/pie4.png b/docs/icons/pie4.png new file mode 100644 index 0000000000000000000000000000000000000000..7fa6a037a538f1893f279256c0f777089f299197 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQk(%kA+G=b|3CBpKaj^Gwe3BS zVk!yp3;xgWbi08UkjI$h?e4Lk(1@@S*NBqj{M_8s zyb^|xjLc$%#G(=fAeEV?P?C|VP*9qblbNiLlAoKHnWv}VomvKz@F-2sNG;Y;$OiE; r98xn&^nga_C-Xz+}_Yzw-23{>3JXu0=3z*v`4OaPFtZ*%}klI+l54ZqwVk=`G`N gqqzCzdnff4?UOy9X2YesW54PQk(%kA+G=b|3CBpKaj^Gwe3BS zVk!yp3;xgWbi08UkjI$h?e4%e4t}e;HLh?`kI2l z8(5T=90=a0Tie>wy*h_|&X27b=W{BbcdzhJYO9&n{-%G+Y+38OKG93IDSU12-uq8I z(M9{R6nE--Xz+~Cezw-23{>3JXu0=3z*v`4OaPFtZ*%}klI+l54ZqwVk=`G`N dBfa+_^}iWi*Dq8}v{CBqS-80Up#c|zH2^QW54PQk(%kA+G=b|3CBpKaj^Gwe3BS zVk!yp3;xgWbi08UkjI$h?e4VFeYAw6f90!<7nag8WR&d<$F%`0ID$;d2LNGvK*08*KG3MCn-3I(M}Ihn}{DfzjHnR$8& z-l=6k36IkBjMQQsg=`Qn!yz@ZL=R|$jzVy1K}l+EQfiTcp{1p1*|+y|fHp9Ay85}S Ib4q9e0HmN_!~g&Q literal 0 HcmV?d00001 diff --git a/docs/icons/pie7.gif b/docs/icons/pie7.gif new file mode 100644 index 0000000000000000000000000000000000000000..8661337f067f9933eb0ef9bb4ccd77dd8bdb0b10 GIT binary patch literal 185 zcmZ?wbhEHb6k!l!SjfQe|Ns9p|Nk?9f#N^Ekc`Y?g~Xx~1t67~r%;lSs!&jxl#`jP zkdmL9n3<=i;GJ3ql<+7`&qyuSQOE}IG8|GfOZ1ZSb9EGgQwvH`bCXhw6bvmbO&Jt_ zvM@3*Ff!-Xz+}3JXu0=3z*v`4OaPFkWM->GJsune#*ygc&t5eqP cin@0;&wnp$nZ|PQtB_G$pA6d$4F(2l04BFX#Q*>R literal 0 HcmV?d00001 diff --git a/docs/icons/pie7.png b/docs/icons/pie7.png new file mode 100644 index 0000000000000000000000000000000000000000..8817d87918078cbc2888e03541e5aa1232a25194 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQk(%kA+G=b|3CBpKaj^Gwe3BS zVk!yp3;xgWbi08UkjI$h?e4XjNC+_(6pXq0; zv1`xTNs2%-!%AEuN|N()b5rw57(y~Kixm=!N)&)pW}ZSxMyf(VX;MyRvO-FJZenJh zo`QF38BoHbG(97=SVtin#LI9<%`DLa8lj^QoLW$lnwykbq+n=iX-Xz@*dDzw-23{>3JXu4R1A-L;ud>%okkhl!IyUaie(+qXfR+ave> Q)*p2%lMkH{VP&ue01>A?od5s; literal 0 HcmV?d00001 diff --git a/docs/icons/pie8.png b/docs/icons/pie8.png new file mode 100644 index 0000000000000000000000000000000000000000..b2c70e3fe720dfd8051c8439f8a5c84da138bac4 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQk(%kA+G=b|3CBpKaj^Gwe3BS zVk!yp3;xgWbi08UkjI$h?e4o{?ItqmT{a sWjLf}mgoVE&`}6ZEhtINO-e0NFtoHZE&KL<4$uY$Pgg&ebxsLQ0D6^DS^xk5 literal 0 HcmV?d00001 diff --git a/docs/icons/portal.gif b/docs/icons/portal.gif new file mode 100644 index 0000000000000000000000000000000000000000..0e6e506e004caddde40da13470f5b566c4ebd3e4 GIT binary patch literal 254 zcmZ?wbhEHb6k!l!IK;s49|+DEp8*m;Fw=PE%$df<#taM$ivRpVGBS%55{pU{fK+Cl zLP!lN`jBehsZAsfWYa7fK8(M!(H)lmpeEhtIN zO-e0NFtoHZWl;Rd!pOkD#GnH-odIM!19M@xy5abNeolJ^dKQ(i&E!y0oZhYAIz1P__bl`CXaRbu>JEQyKU^X{_%FW>4o vqif4-qpv>D{n{&Y@SNJoYRRp?C?q>{ z(=wSm`Cg}T-=EdE&em-+r>>TN-?sFgix%^Z*40I3sLprU_JJ{fy4kCT>5G$q_Jx(W zMwBGy=jNv7l`w>4WELwV7L_Ofsmwful8jV^g3_d%%w&a>{M^LMJUs>P)H0xiM`?OS zYO#(&Hi(zukeXSd2Q)%QAvm?5BsDiFwMfCx($ci-+xs~{8yGxY{an^LB{Ts5TK9Cy literal 0 HcmV?d00001 diff --git a/docs/icons/ps.gif b/docs/icons/ps.gif new file mode 100644 index 0000000000000000000000000000000000000000..0f565bc1db7ebc72bc372381239f378780df5487 GIT binary patch literal 244 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIn&tKm;nhW{__jT$ShV!EGkg|Qki)QB^jv- z1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf2=@z^8d^F&3SUp#HpXaXk2Sl>&JZ}wU>twhgl(8#J z&4;IaU+5wAJ;6lrj$UyQTKrXC=eAut`Q_@GqDYq{i?eZ? fuRb@A(YSxU1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~s5&eO#)gd=+Gxr@996gXTjPCv!8 z=7NDkFJHom+x5$oZk09OTd%C>vSrOGEj^c|Dw3jC`c=g{5_;4W zMl+wv%ak*djp8oJNgXxc_^b78%u)5J)_WOGafw|q+#fz2Xj52;YeY$Mer|4RUI{}; zMrN@>Vo`|#kjl(cD9K1wC@4+J$xK#A$X!^Qi~J}EiFyUzP+CVw1L6X)z4*}Q$iB}J*;X3 literal 0 HcmV?d00001 diff --git a/docs/icons/quill.gif b/docs/icons/quill.gif new file mode 100644 index 0000000000000000000000000000000000000000..818a5cdc7e0f1d073cea1f9771b6d94737d34183 GIT binary patch literal 267 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaN2}Co~($1tA&onkRW?*1Y{O1>vky)&eSX80_ zq%!jqN-|Ov3QCi5GLscj@^ce2^Yj$FQ_Fx79;N9Ssl_@9*&tqqLuzJ;UUGh}jzVy1 zK}l+EQfiTcp{1oMgW^vXMg|5(1|6X33?SPXnCmij?fGaR;jntH+P+NdaQBLW*w$93 zLXW4dLa(j`>C2pYt0=I?YR#HS>z@C9sN+1ND~Ts;Qmd-42b05628YQhH#GTgelWA? zX*ztBpW*3t11}(tG0EHAg`tC0)&t1N_jGX#;kfR4%9^i1 zL7?T~$_4kV*IZK*i(}|d$f#Ahp{4fjtEgDvD*bvk#e7AjGZpD){8=Wh_bL|S`duU- z=bCx*r=#TE5>4HHxl`tHr(~vPcb%G%wCtgXajv#TjCswT-KV&x9`_Gvi`y>jaq0!5 zkG9H(wp1ZYpw(d|t`Q~4`MJ5Nc_j=X8JWcjiA5y}Kq@m&p(G-Xz@**Nzw)%~qgf4szES6oR(^g_8+4;}QR+O8Rat3Y55;}UDY3n~ OBkprQ{}oXN25SJW54PQk(%kA+G=b|3CBpKaj^Gwe3BS zVk!yp3;xgWbi08UkjI$h?e4BSj>2g#vN~dazFSeLq1=Jo^;u=wsoS&PUnpeUQl95@gkXTfr z0HiYW6iPBu6$(m|ax#+@Qu1>XGxPKmyi?175+0@L8L7oO3fUlDhC^y*i5}1h9fjc3 gf|AtSq|_n>LrY83vTyI_0BvCKboFyt=akR{00N;+Hvj+t literal 0 HcmV?d00001 diff --git a/docs/icons/screw1.gif b/docs/icons/screw1.gif new file mode 100644 index 0000000000000000000000000000000000000000..af6ba2b097bda90209dd1d3d392fccdb7bcfa629 GIT binary patch literal 258 zcmZ?wbhEHb6k!l!IK;s4|Ns9pKy>EJ%$YNdjg1*#K=GenNJeI{LSj*g0+7ngQz*$u zRVXM;%E?StNXgGl%*@kM@J=lQN_do}XQUSEC}e|p84jtLC3?yExjG8LsRbpexk;%- z3Wk=JrVNTdSr{1@7#VaxR)B10U@n!|b?2W!n^SiVYewRG7AFm!*eRWl9lSzTtP=4S z(YLfe5`E@s3_lC22QY^)wHVVk!yp3;xgWbi08UkjI$h?e4iFO}IdAx@Eh|N#N zNOQUBmtPNoTo_j38c~v*pPQSSSHcjIky)&eSX80_q%!jqN-|Ov3QCi5GLscj@^ce2 z^Yj$FQ_Fx79;N9Ssl_@9*&tqqLuzJ;9?%FKh2YeJlGNO!)FK5#OH0$TZ|~;-ZD8

    bP0l+XkKD*k(j literal 0 HcmV?d00001 diff --git a/docs/icons/screw2.gif b/docs/icons/screw2.gif new file mode 100644 index 0000000000000000000000000000000000000000..06dccb3e44c66d18be8e7c0a3da2413d3644b3c8 GIT binary patch literal 263 zcmZ?wbhEHb6k!l!IK;s4|Ns9pKy>EJ%$YNdjg1*#K=GenNJeI{LSj*g0+7ngQz*$u zRVXM;%E?StNXgGl%*@kM@J=lQN_do}XQUSEC}e|p84jtLC3?yExjG8LsRbpexk;%- z3Wk=JrVNTdSr{1@7#VaxR)B10V6O7mwdbROfWzv!D*H06&kJ4;Roc;eowd{9p;(CH zi7%4jOn=^)>HKMOOmxr@^Rrv9(Zj|os#X5-Q4yu|;5S>$t1~+pUK<~i5YtS$=vU@u yeU(L%F~&2zjqBi^) literal 0 HcmV?d00001 diff --git a/docs/icons/screw2.png b/docs/icons/screw2.png new file mode 100644 index 0000000000000000000000000000000000000000..6912f9ef47ace226197288452d46b6dd265f298a GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DWL$L5ZC|z|DOS(GiPSboM~)q z3>2QY^)wHVVk!yp3;xgWbi08UkjI$h?e4zopr0J4mEW&i*H literal 0 HcmV?d00001 diff --git a/docs/icons/script.gif b/docs/icons/script.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8a853bc5828cf534c4c46a0efbf4b1d7d3c52fc GIT binary patch literal 242 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIn&tKm;nhW{__jT$ShV!EGkg|Qki)QB^jv- z1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf2sTRBTd^F&3SUp#HU#9hW!Rw()J3?6|OcFmLXwbvQ z;yXWN*R#T&@77%j8VV0WP6%GqkhE;|xp+C~4`X#h&eoZ4tM=c%ZhDQk{(Ri#ES<}4 d7Yj^x^9CF~_};qCSmD=yXLEt#WPVNtYXEP%SK9yp literal 0 HcmV?d00001 diff --git a/docs/icons/script.png b/docs/icons/script.png new file mode 100644 index 0000000000000000000000000000000000000000..d2a00ca6bda965bafc1f07243ab4909c6eebc816 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DgFST5ZC|z|DXB)f9A}Y#>U1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~s5(9^{+gd=)w-$70WLk^bdGuUzz zV;DI%GRS|6zg!t8@NRBpFEe+NyqIzFAw{jDT1ywNS~t&dx8$yll&_aJE$UU*7LfY$ zW%i7F>z7uu{8NcOq<{CFn2qhFbv8i5!%AEuN|N()b5rw57(y~Kixm=!N)&)pW}ZSx zMyf(VX;MyRvO-FJZenJho`QF38BoHbG(97=SVtin#LI9<%`DLa8lj^QoLW$lnwykb Zq+n=iXl+r>Ez@fddR+p!k!8k%57gK?lSGsbyex zi`aFC_kd@D&y?=4?(Pes3MEI<1Y!g8G%~jxUU1@6RIiH;$6BEo^BN2cqBwk-7hXtI c(vnrUxMBN-xh<~83yn{BaU>KdGcs5M0L&38p8x;= literal 0 HcmV?d00001 diff --git a/docs/icons/small/back.png b/docs/icons/small/back.png new file mode 100644 index 0000000000000000000000000000000000000000..e339315a9e8fe07293e14f20fb615cddd13c89b6 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*B6H{m$P3;w5>zyD%`U z>Qy!Z@)A5<977~7_ntq adiFKl^)qAtbj}0X#o+1c=d#Wzp$Pz9wLIwn literal 0 HcmV?d00001 diff --git a/docs/icons/small/binary.gif b/docs/icons/small/binary.gif new file mode 100644 index 0000000000000000000000000000000000000000..995f79b9b10d5a49fd6e6d9f641d3bb65cfffa02 GIT binary patch literal 134 zcmV;10D1pMNk%w1VGsZi0HXf@|Ns9vIXP=4 o#kZK`47H){6`LuGH;j-%Jne!zs_mH6LPMOYA{Q)|S&IY!JF>VnX#fBK literal 0 HcmV?d00001 diff --git a/docs/icons/small/binary.png b/docs/icons/small/binary.png new file mode 100644 index 0000000000000000000000000000000000000000..b836c7c04e7e18480e6a18f99602587e8b8d6b24 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*B6H{m$P3;w5>zyD%`U z>Qy!Z^1?k`977~7_nte*d%%E$`M{d1Gxu;g8!~1av~_b#&|3dXxP(j0d;J=@B?o61 zPUns=O4znt>W2%LNM46~AcMHT5`F>B9D#~I{~StXUhw^UKO-l=QC+{5aZ2?ezucYc Rdx2Ikc)I$ztaD0e0szpRHdp`v literal 0 HcmV?d00001 diff --git a/docs/icons/small/binhex.gif b/docs/icons/small/binhex.gif new file mode 100644 index 0000000000000000000000000000000000000000..3d54a5458e6edfde1f60b8a35d549e3af1552ffd GIT binary patch literal 131 zcmV-}0DS*PNk%w1VGsZi0HXf@|Ns9vIXP=NV?p<;}t+_F|n1vIhdG61y)fInX+{xz%o-MD*`-pgKX5xCVZ_5 lPsPf~hJ=DqCWLWTOyuOYZ1$d>Ba9hs3zyD%`U z>Qy!Z@?t$*977~7m-ZdxJ)pqD9I0)bD#|~Va}Qhc4qgGriLcn5j^A8#bZVHm$O5+; zfd`BhiFqErq>#Rv=V@i0hoBwfJ$03r+%vk(WbR8_FlMDlZ}E4H=&gTzi=!g-&lg7F XnL8tk7PWE%En@I=^>bP0l+XkK%~m)) literal 0 HcmV?d00001 diff --git a/docs/icons/small/blank.gif b/docs/icons/small/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..606787a8399e939a2691a76e3edb3897037b2daa GIT binary patch literal 55 zcmZ?wbhEHb6krfwX!y@?;J^U}1_s5SEQ~;kK?g*DWEhzETKZR>e#^gj&X!xzyD%`U t>Qy!Z^7uVn977~7CtEbINw{reU|{Duz^KT3KLRMl;OXk;vd$@?2>{}078w8l literal 0 HcmV?d00001 diff --git a/docs/icons/small/broken.gif b/docs/icons/small/broken.gif new file mode 100644 index 0000000000000000000000000000000000000000..1bcc57f25c59044e6af6f09d0fc46dbd0bdafd66 GIT binary patch literal 139 zcmV;60CfLHNk%w1VGsZi0HXf@|Ns9vIXP=ZAVnu4@CeN-d>06V1HFU9}> literal 0 HcmV?d00001 diff --git a/docs/icons/small/broken.png b/docs/icons/small/broken.png new file mode 100644 index 0000000000000000000000000000000000000000..7a6b2db8c6389f9dc1cd3232df39db91bf2db032 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*B6H{m$P3;w5>zyD%`U z>Qy!Z@{&DW977~7$DU*4Wl-c`4alDOGW_R44+q|)f{udOM&=KE4=(jzqiK;4n0StT z(Np%#pR*KH9ybLX<$cI55*NFmQG`9_z`TW;4FWUI^PZh_GyUDdeFtya-;UnncVzcA e$IecvUyN4n`zQA&mnQ1H|FoGC5AOfV8f!UQ~ z*PVX`hZb>6bP*BCs6S}H;Vd99C5S^ubKfnY9r=Gl6W4NkFT36}`PFx$95FVrz#Gvo Z(|nHUXljWp;?_Q1GLa!b)18UI8UVh_DDeOQ literal 0 HcmV?d00001 diff --git a/docs/icons/small/burst.png b/docs/icons/small/burst.png new file mode 100644 index 0000000000000000000000000000000000000000..1155c67651bf00792c0148b9161085609738a6f1 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUJ#gTFrlLTUm&E_)mUHGT z_3{GA0Kxgaf$M-2V@Z%-FoVOh8)+a;lDE4HTVmRdS|BId)5S4_<9c$!0rm*V7zLi? z0)fXE1e|Z22w*wE5fo%*X2xXH($jcA;6wq7VUK8om*bX+9L&xJ9TQ(2I52@FB%4Ph xp@7w>#es)yp~~X`1LZ4$7Z{URy)`;m7;G2uzA^OWxDB+1!PC{xWt~$(69CLzJ~{vZ literal 0 HcmV?d00001 diff --git a/docs/icons/small/comp1.gif b/docs/icons/small/comp1.gif new file mode 100644 index 0000000000000000000000000000000000000000..712f36afdb27370918ce1eb008be6073aba769e6 GIT binary patch literal 130 zcmV-|0Db>QNk%w1VGsZi0HXf@|NsA#l$5~0z$qaZT4Q55rOtD`-T(jqA^8LW00062 zEC2ui01yBW0009=D7xJKFt$LdB@lxJ4RqIg#Z8m literal 0 HcmV?d00001 diff --git a/docs/icons/small/comp1.png b/docs/icons/small/comp1.png new file mode 100644 index 0000000000000000000000000000000000000000..bbc3d0ec062b13b6afab59d34bb5ac2befae7c37 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU{r~^}lqpjV95|qB|3Aa^Q@oBqE@P6ny9>KmV#jMBC*IS=F@)oKazGOk zn+}hlxVX5%Vb6eo6C6hh1WO9FSd6b+YEtOgV6xC@g%qQJv*?PGM@3I~`111d`j!SI zd2q8bDmaG*uxh9;IikR16fda}#1Zr+V#SdMc|0u7{Ja>ZGDw~@`fXhdw2Hyg)z4*} HQ$iB}>>xrj literal 0 HcmV?d00001 diff --git a/docs/icons/small/comp2.gif b/docs/icons/small/comp2.gif new file mode 100644 index 0000000000000000000000000000000000000000..7759eb11f95a4bb3803ca55eae6c3ff8fd100b96 GIT binary patch literal 131 zcmV-}0DS*PNk%w1VGsZi0HXf@|Ns9O7#M_vgsrWuz`(##T3U0)=KufzA^8LW000C4 zEC2ui01yBW0009>NV?qqFg8)DEpK4KIl+xqbkqNgD~s^aKww; lWe8G`jyjbQNm3FtI?)idj0B1>qD63^77l^1cw9^X06XYXE$jdQ literal 0 HcmV?d00001 diff --git a/docs/icons/small/comp2.png b/docs/icons/small/comp2.png new file mode 100644 index 0000000000000000000000000000000000000000..8243345e4b86c73b0e7c376cc969b48b62981ff7 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU{r~^JgoH#(OUv4|YY!Ya z5EK0ArH3y9>KmV#jMBC&tsoF@)oKazP^# zn-0&_3l{Q9noG{?xWz9|wU}C&1 zpy4cf!XVU))oUe#tHU#ECf63ntmdv5i9@W83P)HO^mfRve6(x|$WjJRS3j3^P6^H7 literal 0 HcmV?d00001 diff --git a/docs/icons/small/compressed.gif b/docs/icons/small/compressed.gif new file mode 100644 index 0000000000000000000000000000000000000000..d3b156072ac0b62c0248694d2d05791379e34927 GIT binary patch literal 128 zcmZ?wbhEHb6krfwSoELa|NsBl+1YdE%sFu2!277EYykl;1`tsE$->CMz|5cn;(*jL zFuPjpx+AC8q?t7P$~sH6D{%rMQ(HBiPS!|-)_OUXyj2ijRTh5h@?e)dzw#N~vZiai c6)G%M%rgTM8yr{}o0lx>>ev_S%EVv|0H!@EhyVZp literal 0 HcmV?d00001 diff --git a/docs/icons/small/compressed.png b/docs/icons/small/compressed.png new file mode 100644 index 0000000000000000000000000000000000000000..c7856f736268627016b0f0bb84dec16577e94f8c GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU{r~@ec6RohIdcviIPg9y zDqBFn3n<0FVCC3!3`nt*1o;I6)i5|{t^5MyGbVYvyReHTcDx31qC8z3LpZJ{8?-U8 zB_}&;9By!wJeJU8G()mQk;m|;7%PM|whF~X2*V%{U5E|8iMaEOD$ U0n_;{NXL`HRB1Y&&_@CQJD2_|n*aa+ literal 0 HcmV?d00001 diff --git a/docs/icons/small/continued.png b/docs/icons/small/continued.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a7c09cf86aeb11efe4c1b72e44f19ad11a1e60 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*B6H{m$P3;w5>zyD%`U z>Qy!Z^87qq977~7ukCXbJmA2?w6Rrfje-_e(&LmZA9C(bXV00zDSRfsKz+gElp{F@ ze3hbaPG|lt$>%?#IwvB`A|#R5(oleNTZrz|s8!kX>z=c!N3T}P49{2#G?~HE)z4*} HQ$iB}3R*Iz literal 0 HcmV?d00001 diff --git a/docs/icons/small/doc.gif b/docs/icons/small/doc.gif new file mode 100644 index 0000000000000000000000000000000000000000..0fcf18db2a89a540716c06e734cc564cdf08375a GIT binary patch literal 191 zcmZ?wbhEHb6krfw_{0DLmX?;;+1WikJ?GAyd;a|S|NsAif{H&`7#SGY85IA?BvmT- zCKi=s=IMDCC8p-47CHDPXXpj{dFr{OGU$Lz0GV|Nmr2Y%6}#@Zv(3<4F35AuIl!xvcWvVE3&b1Cxh RG|&8^tTFrSX;&r&YXB6~L|Om< literal 0 HcmV?d00001 diff --git a/docs/icons/small/doc.png b/docs/icons/small/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..994726817c6dd07b7d6caa9636a4feb0a988c144 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6n3BBRT^Rni_n+Ahj7wM%5HxH}lt zq~v(6pNN|CKedf{&z2}#g_AaE>)SZqNKVt^<2+GSy5rn|P1Yw8|IBo}9u+*tw=DJ) z=MwQo0Y0FWDkZKFCCT}@xv6<23`vy=zKKO8nR$BNMTx1osYMRH$r*aVex7&GNR2Uen0VOOkQ~&?~ literal 0 HcmV?d00001 diff --git a/docs/icons/small/folder.png b/docs/icons/small/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..057b52d575a405698f39294a1f9829058a605f95 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU{eN%m|2yjr95}FJL2bCV zwYI7(PzDI8Lpq=bp&!5lf2zs*b>ur)B-u)o-U3d9M^M?ZRBlm z;9w1yBz=%qW8Jk4ot%3E6aEYSDVXwomAg#L3Ds9$RvZzP44U}(?31t!e6@2EZ{N5% nGop24VqZd1opMBby2gK#6+ literal 0 HcmV?d00001 diff --git a/docs/icons/small/folder2.gif b/docs/icons/small/folder2.gif new file mode 100644 index 0000000000000000000000000000000000000000..425d6e4b77ceb7ba16ded08c4915c809acf69c12 GIT binary patch literal 122 zcmZ?wbhEHb6krfwSoELaz<~qrvy+Q06{i$?9a~$xbV@b@7%2W^VFWRBKmt>yewCRwrrVbz0%P@q&p!pQbR!HK;_&hjwjs0n_k|_ba-tRk+_!@hljQC0!j_n}qZY`q^>lFz;kcfhpul7xEiJvl zfi^0>?&t;ucLK6TDnKTOk literal 0 HcmV?d00001 diff --git a/docs/icons/small/forward.gif b/docs/icons/small/forward.gif new file mode 100644 index 0000000000000000000000000000000000000000..2997466eb4de77500cbe27060b1a590f251102ab GIT binary patch literal 125 zcmZ?wbhEHb6krfwSoEL4($X?JJG-Z+=fHsj=gysDfC0syEQ|~c%nUjp0gze-W+#hX zTmETtFwSL&2y5Nl=5irbM5W{Lcb21_)0{VRxK0$bkc%jd_Yl5)#{CVW($PnOg`QH9 VToX4n&1RWCdxjo&kqQHYH2_QzyD%`U z>Qy!Z@*+K5977~7$My&EIv8>=Zw&R_8Wb4Zu#7$WM)Dp0lY$yIZvD`DBjV-D!7!Ua z?xBoRutA7L=#-N>zvgXl5!z{FQs{8(lj*c_Ucu9yW}E7Z?=JoNv^UoN_XhquQH{FB TXI6d!TEgJz>gTe~DWM4fT+})= literal 0 HcmV?d00001 diff --git a/docs/icons/small/generic.gif b/docs/icons/small/generic.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8da6ff92c3103d440aa34c842efce51ddd2d55c GIT binary patch literal 116 zcmV-)0E_=eNk%w1VGsZi0HXf@|Ns9vIXP=zyD%`U z>Qy!Z@*F%}977~7CtEbINhI{h%{Z|0e?q~#O8!{~>Q`{YJh)@op*Q0|y|;pc;E(zT t4rZ$k{D1y}>Hka3f(7c*YzOpM85ZbWUQl7!y&7m1gQu&X%Q~loCII;;F&zK^ literal 0 HcmV?d00001 diff --git a/docs/icons/small/generic2.gif b/docs/icons/small/generic2.gif new file mode 100644 index 0000000000000000000000000000000000000000..992f13331bba69df688a1c52eee270449974f51d GIT binary patch literal 127 zcmZ?wbhEHb6krfwSoELa|NsBl+1YdE%sFu2!277EYykl;1`tsE$->CMz|5cn;(*jL zFuPc2E&As#5ERnD*ARJtfp=NqymCk7r`R;qn=&`p03mVwz!V%Hr- z1E&XvCVaS5R(RiAy>mgUql=e;(y~pho8&ujXu&V@o)YW0l^; H!e9*mJvSwK literal 0 HcmV?d00001 diff --git a/docs/icons/small/generic3.png b/docs/icons/small/generic3.png new file mode 100644 index 0000000000000000000000000000000000000000..3874aa3eddee0ee3ae1dfae10c1d6541828e1904 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU&Cbp~aNxlEsHkiK0WY8+ z3{1bE*bihgl?3?(|7Uo*-2f!XnB?v5!ulis<#8a#*we)^gyVX$KnoL_szL&bVb7E) zQ$!PZCJ3}FWJuK5xx+zH%b;x%SI)78&qol`;+ E05sk&P5=M^ literal 0 HcmV?d00001 diff --git a/docs/icons/small/image.gif b/docs/icons/small/image.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc3d95ced763c4a905d8ceee4b2550e2131fd42f GIT binary patch literal 126 zcmZ?wbhEHb6krfwSoELa|NsBl+1WikJqHdPcpnwjl5F_?nk54RgW^vXMg|6E1|1+9 zs8RsPcDC4c=iE~pb*_oUQ#(Fu98;_~oS3sjVNNUao_t9rW#;4UEG%bvrx?u3by&?> e&3OOfw2*gItqmas!g_N~w>q49yG@Lf!5RRR*e}ok literal 0 HcmV?d00001 diff --git a/docs/icons/small/image.png b/docs/icons/small/image.png new file mode 100644 index 0000000000000000000000000000000000000000..50fbb847cb5727548fb50d41db39eb7850c205ba GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU{r~@ec6N48PtSn^2i`|T zwImz9zh()P?DW*T45U~}g8YJkY8V`}R(=8U8I!!-UD(AEJ6;1h-kvUwAsp9}4ceI4 z1QMfoQdjJ9mR$HWz%4?sC2^h77X z?dh2k6ch!N6x~&(4y2e$g8YL2Gd$gH;05F{CV9KNu!|*jyasZDJzX3_IIbrPv@o#= z2y!HG7#J9I9g^T_G-#9PSh(a|z%;&8gH4T+FIVy;xXpB^Vwj3D(p|kciQwwv=*SD=E*UavEfBiRQ*3l=rYRr9(D-;_T7S<>HSZIIXy9bWcQd>9NLBk23BTCV4IS`26S=t)(iTdBwL$+N}S-D%%k z#wa;mSK3`9k(pCGM`QUUra7VZmHVu_rmbdA-1QFo2l NCU4lW(}RJ*8UX)gL+=0p literal 0 HcmV?d00001 diff --git a/docs/icons/small/key.png b/docs/icons/small/key.png new file mode 100644 index 0000000000000000000000000000000000000000..44760746b98c7aba84b5ce03ba86ff6890fcc84a GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6n3BBRT^Rni_n+Ah|?^VD-m%}_r25~!ZR)78&qol`;+ E0Eodxg8%>k literal 0 HcmV?d00001 diff --git a/docs/icons/small/movie.gif b/docs/icons/small/movie.gif new file mode 100644 index 0000000000000000000000000000000000000000..7b4a42e7a0eec8e4508903e9bd49cd966e966e21 GIT binary patch literal 134 zcmZ?wbhEHb6krfwSoEL4($X?JJG-Z+=fHsj=gysb{`@%u7%2W^VPs%nX3zogKx!G7 zy*+mMeAYkV+1#MabHG}Fse$nzdz^H8ru>rzC6{fBxi)IB^anlsy)r`O#>SQkwF`?k i-+B_~9;vx~3vcGG7n{Cov&^1%&M%y6veyh225SHs|1u2# literal 0 HcmV?d00001 diff --git a/docs/icons/small/movie.png b/docs/icons/small/movie.png new file mode 100644 index 0000000000000000000000000000000000000000..87adc23cf6724585a4ce30a8140d377103ac2b0b GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*B6H{m$P3;w5>zyD%`U z>Qy!Z^1M7<977~7CtI{Lusbv;N;6g|FtO_>E?9nCNGD+?Z^}0Y)y5@qM?_dLQ2fn#$nm>gTe~DWM4f DT~{!$ literal 0 HcmV?d00001 diff --git a/docs/icons/small/patch.gif b/docs/icons/small/patch.gif new file mode 100644 index 0000000000000000000000000000000000000000..100484e59822e79e22ab469fecd4a39052a66875 GIT binary patch literal 182 zcmZ?wbhEHb6krfw_{6|qX=$0Ao!!&ZbMD-^=g*)2|Nox>3>1H|FfuT(F)03%Nvc%v zO)M(O%+vEON=(g7EpqTp&d>|?^VD-mWzYes2AOpTmr2ad8N2S7sdgD9bMoA>*d;jA zG*oa~#%+fN-d&UbmoOzWDQ=H%vd&w!B)VFLkdaBw?!43!up=C9V-A z$@#gtsd*&~NtFt|iA5!ud3xSOiK)4%MGn5n8G6Bfo_a2+8Oldr0@X8ky85}Sb4q9e E0Blc7X#fBK literal 0 HcmV?d00001 diff --git a/docs/icons/small/ps.gif b/docs/icons/small/ps.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa4bcfce30f5fb3f62e65f0c989ac15be60a49b9 GIT binary patch literal 184 zcmZ?wbhEHb6krfw_{0DLmX?;;+1WikJ?GAyd;a|S|NsAif{H&`7#SGY85IA?BvmT- zCKi=s=IMDCC8p-47CHDPXXpj{dFr{OGU$Lz0GV|Nmr2a76}#@ZALB7tB+7HkIql96D6GMaovr)0~p+w&0R?vcik1 Ky{BB67_0$$w?x1I literal 0 HcmV?d00001 diff --git a/docs/icons/small/ps.png b/docs/icons/small/ps.png new file mode 100644 index 0000000000000000000000000000000000000000..23e42ad426d063d98c8a16613d843af5b46c14ef GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6n3BBRT^Rni_n+AhwvbYl(FVdQ&MBb@03M-EWdHyG literal 0 HcmV?d00001 diff --git a/docs/icons/small/rainbow.gif b/docs/icons/small/rainbow.gif new file mode 100644 index 0000000000000000000000000000000000000000..8216b89bade87b795a7345329da487735f3e07eb GIT binary patch literal 3811 zcmX9*2|QHo+ddH{AxoAlA=?Pq8Eb=SjP)JMn6Xa`Ml#0M*kcR^Nimp;vQxd3HA&gG zP{>{hMJ1K2r{2-6a=6k2nDoQqb?SX0=ifo1OVxD)*A%?C=kWsLqNg*gMnlaOlHxTOc20< zz!KXE2Y^c~F~0BUQJ^eB8vwL{tO*bUf-x+@CIAvQ*$SYR z&94POIgkkeEO$8&lw%=q08CD13E=<$2jOfb2w@M|2>=kr4#Qe70Dyr29t80$Py)OL z0M|f30t6+1A-3%hJN6ulhyTQ80pJ`vHvpD`bO4}(pdgD20D>TzRnZ`bW~%{~3v0mA zv*01tc8+DhIt0`L*dMDFWL=iM0o&SGAekKnAcHZio~?}mHvhk4U6}o-vkUuQ06YiD zR#Yp|w6yc|^G?~>CRdM`9LWn~Fzkx#EN)tel!*A>@%LA#thBFDynC1OFGZ_fOG~0j z!l%^-{rItQM+c;n+}(}pL!B8ob4Fl9fcS!_Ix*ok<#u}J^l9KV5Wg6ou)OkKXLS|x z2_w5MD;x4XL}g3Gb$3?|l#Bco8OimRiv;QDuEJaJL-d*ML~g28hWV*q<5t)GlCuv5 z5{tvD{H>44nNO^u4gt^CCpdzEn$wBT6^}*AbKTURC+jExgqY2c8ibWBh!_jr1VNSj+5_ zp*2yT57lD%aNQo+A+u1w3bd6cf9h*Kj}N4Y9(vfjaO$8D{5SmSd!yTmm$xdjBR`%f zA7q+8y&C;Rsj-OI^E8wG{nQXm#R^G{-G)!9xpyw+#2fN1siC_n%#W#pRSEN*f2n_u zY63767tK{LJ%x@aLn-7U^17ssd2DejTM&9ORZ8hPJnES9HQ?n&)E_NT zN6w(Z@?Om@K9^DLVOZ&?&PzDwnBKHkK0mM!^(x0OAzAmu^#taDf|c<`^D6<uj6|Y%%DOL(v@tY|+Aw)l?I3cCNKRBTjtCrVn_-h%?cGew=uk2$MXjYD} zA3OPIgpviV6oEt6a^d9`rd*sHS^x~zJFP&_BYGEu^UuMEc?4JW7kZMHf27t%y-gGM ziT~QtEq4DPzzR`Fp8*~W2Vc}^aIxPaB;Ts6 z`zI;F6U`CLu$0LnUGkrDmBthppe{Hka(XR2_Y-qGQLjhc0^Y)Dg!V4X1RdUn7b%LU$dF-mY_O zcAYZ~_vSHKH5T8VR66w0BG>F|gHOWR0p`Kiw?}=&0pDb9SGjFfD4sK(rYJD;%pONS zUqYA7u(voXcy}cUR1?wwAC-%>K#~s~p9gZB;DMF)){{hc{f84>Ji?iQ`YysRqFQxh ze)AFcC2kfVW13UQ7Qrg^^jCd-mS*U$X}Im7nO5$+`q-}_r;U2%KA;UuClLQ67<0aU z!woIx<5jgS^AyVa#89$a&-7S+{qET*F$ey7@@-3LF;SJGcG!zE0q|*VSN+G>oQa4c z7e4=!oHx818nC7B?WI>?))U2NqVM~Ae<4()&yA5hrrW*02|RqV7(U|JE#>p$YLV$T zIzINZhxn5>N>A;5j>YdS`|SVXJb0G4J0e(ZD%&mBU<;|swG{KfsY|t%3D|5DiYZ)I z*DEZ)`lnG`D{DgQXiOvLJ@u549VgwABV$Bot)Qs{=a=>K-KX7cXzp9pNBV~aA^(!? z0~#SSdcwW>W1A)6yix+*<-JXB5uwIEUfo%8>r+t9Ql*5rF5YB{+U|yyF@?QEU;4rN zvoaY{}F4+jl5k8=GIY!8}5^F~Xc5H8a(s8r+vNK0~+Q zM`rR`aCVQwC3@7aZ{FfLFUfR+v_#zAPLpz~;h8fMmRvwPZbjLYTpF^HT|?Y46Y@LD zbq;E!%GGjM|C2?@oJYO-lv>KIm1+pKt;L>EUeQPt-)?m3q=jo0at5C`7pL~(2XB?? zDj)yKoO97axc>7C{Ly#xrEV>9UrU(^ro_idBb0S&CxZzxqeq7~pkYsK>J;Oc#!uHD z2jv$}-G2IP=_z^<3xBV0N0qa6x*kbSWX33^9QAT@DaIfaBGNJ?M;i`)hV|&2;?7ym zTISQt?|rkmX_$3*Me*QIfsNwYJpQv#bG%@VEd5VLVH>TdTBEPQFAqhiD|9@O-d94N z+z1>|&NtZ=yc2J^<%oR!a`FX#CZ$&jQ){_;+S4{mnp`XT0Or(2d+eI~rS5~V@xW4G z{TRtSIHEvJeRBHe;~`sz+qYKLgQkx^xqN%(Qpzju@1&9OF?Yq-yW2y;#j_L0lFIhE z>3T}{m$TjmS z59mqmj}7HC70Y~kV=~BSf7nnj+ayI?+F*=7Gue40Y&M0gcw@32@O>Nlb*g64E`Db< zx2BgeZKX)^+`cj<}BrgL>P30~YbyOSQty`|}~>ic&$^6r{#F<>`7E8jvmyWfPj|A;@fc2;vGk+V63TQP~E z&+k46?>5l&-pAT;;7r~NNFs21T9;oR4>jEM3mL@CA{`el`G*%dhV(dwItv?Ax?3O( z0$m9493B=s29?utfIa+)?-n`R9Vm9egEgQgn+HU}Nn zW-}tb7>NW|QFBn~!jTB`;UaS%uBb6Xyo9A&(+7DJR=c4(9Xjcz&VlVx)X{aehw3J& zZHL4#GkU9&2GcJ}OzEm9Uk;k}+pEz7Yv}*+2raaR=JyL7f+iovB^yn-?>8s&wUH{$ zAtFT3$0fqJccK4sopWlAaj6XZFVM4;BM=ZL6VhXEV9E0OUJCux4yN-+zgIUb^b9@O%n(O@t^2cZhht_OD)T$9?VpQ0JBWbp~kgVMg>QEva_~YrS<4tsr)3M(+~T zfUb54hl`+J5cmJ}h)$ZNlf@}UVwqp3l$W^)u~<_4AZ2|m8Ga}xTsI|42Ytma#({>; z$_TjI7SJr}B+Nzq%bhK8j_P|Hse%G-1tAp*vIj-uI!^^f889g6);a}o#zd*hG#9Da zEA87?(!_k|$efm-_*}7*xEloyt2sqtzB&|Hd}bQJae?qSZE(={aK+V{bS=@9gqI(+ z0@I=*9^)lb6aR>ue><2Pf0xftC+S%s_Txu5SMW8%3SEb-B!3m9fc=XCs-an;*R$xM z$LBATDf&i**O%Nfe-M(j&XbOS?ujaS$L2^8kb-I09ObgNQ(+<$OAI YQf)BD<7dvMP-NGBf&PAQ3ILe=54mLULI3~& literal 0 HcmV?d00001 diff --git a/docs/icons/small/rainbow.png b/docs/icons/small/rainbow.png new file mode 100644 index 0000000000000000000000000000000000000000..16e63fa6fb985a6921b8a2f8f7c6785c993283a5 GIT binary patch literal 2427 zcmX9<2~<;88om(rMFANS5QR$7Xe}>V=m15^YJyk_NGq+9L@G8eWdM~VB25BBqaXp7 z3F1-&(P&###2VR>QgC8}G$0m4U<3t&EMZZ&5b`?rb>2JYzW;vz_x;oVW9wJNv$eAP*Ku+-G0D8g_08n&K2t5%J0-#WcgdqTg zzz{+Stq3R40f7EQGwAgPz#jrOglq&-U=aXC5Kthb05uU-O|;#Ocx)ZP0e_nV`|sLj%{1-l6Cxu z)k53C$$cCS!}oos6DbKEoaKjH&IVoBx|&snoBN3_3#&h`em3^0e1BI}AALpHkr06> zFjU+Yb|uZ#Z^MSEHT#x!)^_#u1lp96elD*PP9#0pep~@)`_-BYe)*bjU!_>^&tJTw zI5cD}E6CM6^&QAj1(~x;i)DK(WixA=QZ&C-F5v}4Fbmz;g%pZ6sda_LwO3%K+k8*1 z(Dk6mbvHZKto0+)%_oHCz1hA#V5>84o^m)XfK)%W3foraA}e%%S-m^m^%l(swAzC` z=6rrldAbSv_xr^%{;NtZb0$YoAI@CaxJ*GwcA$8hUXu#rY(T|Te!9d_MRjGb{yVEX zse+$Ao)Tg5BurJ*;JIPG-eUEW$l09ct4~}gyD%HF*=q4B_SrfPJ8Zn=MU%?Y$Ewv7 z9LyKSDLiR zxvkR~&06-q1G|~Rk}Z*>gL{KonQrHlXRRs!VQQ1?Xe&`V)6Hm52j;%}A%*RXnqCHG z@gqt}prLqpE8vm4A&{bWkp?n`Udl$vjTSw6@)CfxgxBF#O;zpx|5 zJ=>F6x>kDax;@RAzQdh+w+|yWL;uboGRAy@q4tuqAxcT`Ahu^ zyIE?cME3DuHJS zK9(EeNaeNT$1J08YwPLEKfWt}JE$z$G~EdRnoq7C?IyLYm&KaAp+ zy6REPnO>_ZQbK;s@SlAymXubnB<@UV-}tN{U+p!4t&;xI^d?oyGUZ1YBZuPF)=b(6 z=0o3!7bAy@r^uLet6*xHy6(+{kYqPpe6ubfj(dC&Up38Xc_*v3EU2oxMn3%To^v0uB36Dj&#&opRC~R_)=3rm zlXz3MY`9om;UI|OFr5;(h6C>Ai{8uoS#o{3(%Ba?f5!THE~4*Jh5u9AgI z%f-#PHwLkcnCta;HI)}&H%0zL&UN<5jI}g+*C=&CPR5~<&`kvjMQ-V$*kJoE=^2W5 zGT@ZOwicE`>FXvqFU#tI(M2-7D71l~^~}j8@s5KII_#-s@l#>^~vINDQJT?a6c5*YOsQ4=R5!b7!S;2W zmUVNyVkqwkH=u~AH4a@h=rTfKzV+4iFR$wt3=(0nvE^;wFOO8gZ!+f`=kw3dKYzxG zuT~zIH&)(MHs4TM3D%x(-0?hk-4Wbr03Te)ukVT^8N~~!h6J{UeSkq?Y#DC1AH{~M z?@G`9s>U-GgSYVT(^m=2^n$J4YXr;mmjou-$lpBwUL$)?99upZW;p-RzZEtnT) zqm%xqqGzuCt~R?FUp4Fa*lPfLPcOW9P!NYFi_&ejzG(bFf4D)E)i*_CdtC7s-{UKR zqd_8aM0NQ5z|A%2mOrleadv2p)PdBSM$^aNIHlyq?$vLjRy z;xx6@jbY)@h01~_=>Ad18b|w)Wd2cb#zNIy>FIkDUV6OAATdQNk%w1VGsZi0HXf@|NsAUb92DJz}B3c_ZS$h0022kN&o-=A^8LW00062 zEC2ui01yBW0009=D7xJKa0M|0iNY9L?>oRm4WtwVAYcqvtDHa_pF~g>Zy?Whj|;FJ k&6i_@dN;{osSB_y&_-ah8I>H<4WSc3QKFczSdah!J59YUXaE2J literal 0 HcmV?d00001 diff --git a/docs/icons/small/sound.png b/docs/icons/small/sound.png new file mode 100644 index 0000000000000000000000000000000000000000..1bbc5825f5918b349c96317e10e074a28f52afc9 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU{r~@eadGj10|&0nne$yj zVl4xMrI!~_GVHi@FOXs`3Gxg6|DWOdDPBh)modrP-GyB&vEwz6#8+N4>m~ ovJ&1pG$*oYbsk>huvL~}9FVdQ&MBb@0QToVY5)KL literal 0 HcmV?d00001 diff --git a/docs/icons/small/sound2.gif b/docs/icons/small/sound2.gif new file mode 100644 index 0000000000000000000000000000000000000000..07706e07b86d25525e8e7fcb8cd2d8b10c235d49 GIT binary patch literal 119 zcmZ?wbhEHb6krfwSoEL4($X?JJG-Z+=fHsj=gysDfC0syEQ|~c%nUjp0gze-W*duL zK7aHX7^e#>G_TrlZjM+_!c@ literal 0 HcmV?d00001 diff --git a/docs/icons/small/sound2.png b/docs/icons/small/sound2.png new file mode 100644 index 0000000000000000000000000000000000000000..06a6c879c16becdd5fe03c62a7bcee6b0ba324e1 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*B6H{m$P3;w5>zyD%`U z>Qy!Z^1?h_977~7r}iHdWKiT_&h4IciOV(6F-u6)@m+<*rqc@~ryZ^Bd!rcDu*n!t;CEs%Gpc5 Q18rdNboFyt=akR{0MrmSl>h($ literal 0 HcmV?d00001 diff --git a/docs/icons/small/tar.gif b/docs/icons/small/tar.gif new file mode 100644 index 0000000000000000000000000000000000000000..59c3ffb9a5f0dcbcc0052a6dc8b428f4b033d316 GIT binary patch literal 132 zcmV-~0DJ#ONk%w1VGsZi0HXf@|Ns9vIXP=H^|M=26Efy0jDoCS8nDw3MpHX8$hcs!0R5&$~~!7=6l literal 0 HcmV?d00001 diff --git a/docs/icons/small/tar.png b/docs/icons/small/tar.png new file mode 100644 index 0000000000000000000000000000000000000000..66ee8a2b095e9fb00ed73e69f9cb814259d1f1ba GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*B6H{m$P3;w5>zyD%`U z>Qy!Z@*+H4977~7xAt8WJz&7%x;9m9wZtiw{NA30T308{-^XA0ZYSeS!BuYD2aF@E z9BlYI``$6!*ng^^&qR5{%sp(HuCYeEL7D<;z<5S%P>S%fZDrUCEXNey i3D;T)3BKR#h$zyD%`U z>Qy!Z^87qq977~7FYOEDWl-Q?U7M=5N}!A7io&trfH|LD*BX>ro6Qo5(wpNXxS~+- z#xstqrKYasNqLEU3Qqov5_en8{T~KuzFBUeqv+#VW5sZD-?lAWduDY5O=j?P^>bP0 Hl+XkKe_=6y literal 0 HcmV?d00001 diff --git a/docs/icons/small/transfer.gif b/docs/icons/small/transfer.gif new file mode 100644 index 0000000000000000000000000000000000000000..d460d3fffe6c7cf99f9928a6304bd6067fa6f03d GIT binary patch literal 124 zcmZ?wbhEHb6krfwSoELa|NsBl+1YdE%sFu2!26b#_fb*V0s;&S42nNl7#SFt8FYYb zph}<+v!lhXJ92tWnn|;-tg}?R5+@)rwN=wel2yVXs`a9jYseiJzdNRf|2w!nNYjwY cpMNxNV?p<;}t+_F|o}`C)Qk76hx+MVW0-gHlm8q0>wI1hP+I5AqX7Z lsY3_=D?$QFWeCnFftzz@X-zyD%`U z>Qy!Z^1?k`977~7x1PHwctC-JIpBJcT3Din+6k#1$6)TNPnT;7`43yJNxiawwL^4= zS;rLK1J|`WPKp$G8%|~^ST17EFmb!;?xfFba$ne_%nv+%?yBavbW`0g2Ct6eYYars R+y`30;OXk;vd$@?2>>PoIFtYY literal 0 HcmV?d00001 diff --git a/docs/icons/small/uu.gif b/docs/icons/small/uu.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c793f8a7f98188fd983b21a7c89ecd79f0ef0fa GIT binary patch literal 125 zcmV-@0D}KVNk%w1VGsZi0HXf@|Ns9vIXP=@K f4p@7|h&zyD%`U z>Qy!Z@&Y|w977~7x1Kx5d%%E$*t3D$8qVP9 L>gTe~DWM4f`=2&l literal 0 HcmV?d00001 diff --git a/docs/icons/sound1.gif b/docs/icons/sound1.gif new file mode 100644 index 0000000000000000000000000000000000000000..8efb49f55d6a370df44ad6e3269f6f966ffe25f6 GIT binary patch literal 248 zcmZ?wbhEHb6k!l!IK;s49|(+%&;0*?=FFLyGiRnTFc=#fGcYhH{__jT$ShV!EGkg| zQki)QB^jv-1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz!(9+VBLGdRGBLf2ygAUMi29WIx%-I^d?))<_JM1*!l}uu2Kl{c)an9BQ z8Fjp~isqGPnlRppzAozM@n_rZ?DB^@TMqI1Z!lq-XpvS})uOfhlGZ1!vqC)g^DkYQ rbCHkPIiy`w;vU-;D{*7rCt7AIb`rH-)ly|T)gs(25}jS#oD9|g^MhHm literal 0 HcmV?d00001 diff --git a/docs/icons/sound1.png b/docs/icons/sound1.png new file mode 100644 index 0000000000000000000000000000000000000000..16bb332cec4c84778f0a9d3bb26e6334aecce283 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC`eU~GKm|Nk>*&di)S zGmU}4*w`2-xmW+*5g^4}666>B|3Aa^Q@oBqE@P6ny9+}HtE>l*Q{d_17{YPAxBnpL z0Rz#+3skNo}yIc&w4#yC28SaljZIT|MxSjZ8V?P5_WO3;^G?;y0;qb z3?z@TDC6OT9rv^%WCHKHUrKQ}iuuY@5aBePf`v8Y4=NM+_Jlw_nT6qF|AWF{-5 zvw P+Q8uH>gTe~DWM4fDPwt= literal 0 HcmV?d00001 diff --git a/docs/icons/sound2.gif b/docs/icons/sound2.gif new file mode 100644 index 0000000000000000000000000000000000000000..48e6a7fb2faeb6ba254a87945246f5ca5980583b GIT binary patch literal 221 zcmZ?wbhEHb6k!l!IK;s4|Ns9pKy>EJ%$YOO($b8LjTyi|@tVo`|#kjl(c zD9K1wC@4+J$xK#A$~K Lz}Ywz1_o;YcDqp^ literal 0 HcmV?d00001 diff --git a/docs/icons/sound2.png b/docs/icons/sound2.png new file mode 100644 index 0000000000000000000000000000000000000000..8cbbe02a5e22bb6d38330d79960c3b3c0820aeae GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DbWC*5ZC|z|DOS(GiPSboSBxE zW^8N>l-cgM?E{cvDhcun{?G7qyMY&w$C%{p?!wT)D(eB{qsA>DVOdZJoj=!{eR^nOSDQqD#{;qiact4Pr+c$fwwGr%U^yu5Om>-3&X6C z#N}M9t#xO35A9WbJW$eSH`J!y75d*~*tEp!;0n$I>YDq*%?S*(y)RH6W+GV>HlGEx-^N|SOjlND0(a}zW3^c1{P%YYIdrRf=| y#X1VvAYO(;YG#QZ&HlGEx-^N|SOjlND0(a}zW3^c1{P%YYIdrRf=|#X1VvAYO(;YG#REa(=Fk zLU3w9NosCVYLSAWrKKr@;!hSv1_ovZ9gvM6S23_u6rAu}z1QM(uhlIPp`JtRT@DHy zZ8JL^S8aON%CRcz&DRnUR>3@1XNE@hlZ*^I1j}_C#yT z68XztxyIW*eK)gq&Gg$oObhE&HaxGaZep#g4-2m9Y;B7#>??2R@5{BXndV`dHEXt- HAcHjk`1fN- literal 0 HcmV?d00001 diff --git a/docs/icons/sphere1.png b/docs/icons/sphere1.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3b3a3aa982200583c0639cbdd5c9bce8b82e4d GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{Dd_;85ZC`eFmvXAW8*Xb|DQQ? zX6DS9X$%a;#>PN-&m%3ZK#HX#$S)YEioro^!Kno$ eskuq1MGA(NmZoLj-p>Krz~JfX=d#Wzp$P!%NPr{& literal 0 HcmV?d00001 diff --git a/docs/icons/sphere2.gif b/docs/icons/sphere2.gif new file mode 100644 index 0000000000000000000000000000000000000000..a9e462a377c8d451bd0c0d07a47035bd44caf57e GIT binary patch literal 264 zcmZ?wbhEHb6k!l!IK;s49|&g7{BLZ021L(HV_+~gHfCU8Q2gf?l95@gkXTfr0HiYW z6iPBu6$(m|ax#+@Qu1>XGxPKmyi?175+0@L8L7oO3fUlDhC^y*iC%Jku8u-*YC%bA zZc=KIf}y3QDTCrq7DfgJW(FOg=?oy-8JMdxcJ29GAmOljuG+p#>+^!wLzQ;)UT5um zk+|bSXOMfYd{L=zjsF9o(~1rvGBq{}GB`LmSXvkRdn%jF4af{C6R?=uy5ZaLzjm9G zwH8$Kxi4iXD)_78aNoVF=4GE7r)afPMP*}_m05#Wld*D7Z?_kl#}r$ALGzij95@-Q E0diYklmGw# literal 0 HcmV?d00001 diff --git a/docs/icons/sphere2.png b/docs/icons/sphere2.png new file mode 100644 index 0000000000000000000000000000000000000000..1fb64debccb4706429972b6070ea08fb4da4bba6 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC`eFmvXAW8*U*dS)5} zgR!wOP?B>o&mthjQWE4B3{=A4ptbS~kk6Rp?e4mjXzbutT^+DtbHK^3y}nC-EO&2HDcEMDbck`1VeNUe#tdCQ!$R+E~VH8X2E%UsTk z1iU3Sr#Q1n{iJJsV6zWp^8(_91O$$vaT5dW|DN;vJh>N&}A9`487F%0ua zh-aq2=?y*Nwinjco)n2;d(Lo@(pU@zpGKpFg@w`S^ziU-27>_~@cDc}TbocQ6p2Lb zB2h<2M<>vQ=p1!au;u3KU7AR>KKZlV~(*wT4iwA<=3zNR5_cbycffMFMDa zNPrlfUa!;X3E>J4GD)otA=usB*#$c4`!2)(!-bcUoQg$jW{c1xKQWGp)$KbT z503-);<;rQcF+se1$!?z3LkJ1m@#QbrwVdeu2jzWSeaJ(!*5!WB`v>VNO~7yXuQ)l zJ;)v9Z92I9&6S;9{h3jc>@WE;m3`{;@WZduSDDs$y8o#!E^HpJ7c)s^`%IP9dAEzEy!oV@D_@!gHfo|eY9}zy!zMfd720Jr9-uDZ(G&3Ke>Ic-M*spj2HKV?=$*P!zyN&0wl3eA-JSTpaKPk#N8}%qNH97duIiI@R zDhk7o8bJ${U7WG~8yuhh5Zb<@7 z`xV^^pIq^?J6sl`b?E$;oi=gneQc#~{w%G2Eo$=bQcK8x IUrq*V0QdG)RsaA1 literal 0 HcmV?d00001 diff --git a/docs/icons/tar.png b/docs/icons/tar.png new file mode 100644 index 0000000000000000000000000000000000000000..4287713984739e487bd59cbd99a2bfe9531be5be GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DgFST5ZC|z|L@ z=H~J@7dil?B0XIkLpY*ydk*p*P~bV@*T}lbu{EMW^wJyq;PomTE3fDm8#&JA2|dcH zl&bBvV#k6#uUrmTUVU?pq2|~vg|+DnK2PhlzIE-o6~OY9W7@OU{Di#ct?{A$Ul<>* z7t6}o-MJNLiBE}ZL`iafZfXnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf2c^13&d^F&3SUp#HU#6xa!*tin>9Z0|^A1!l(>hWb zZ!PfsEZ4Gxo$}LGGYd#m9-20(LPaIeg)1oN=Z{6M>Y}HwOe>foy~6k})9y8|ETZxl nuQycuR$g`V{oCDj`rkkOugz?zPGxp)?{Kpc$nTBfWUvMReehfo literal 0 HcmV?d00001 diff --git a/docs/icons/tex.png b/docs/icons/tex.png new file mode 100644 index 0000000000000000000000000000000000000000..a3d08eb7e7c4c4dccfd241c7bca61f18b28d30eb GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DgFST5ZC|z|DXB)f9A}Y#>U1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~s5)zif>gd;k)?;!611)d{*yxb|x ztCAQ5cn&E4K7WPVM7RG}sw`Wh*~(R2OiDsoO|Pe!R7q(>$5_}6arzZm~3@dSsC`r!G z%}vcKVF<~{ELKP?Dp3GZnRyB&8L0{drAaxN$qFg?xrv#1dJ5jDWk3m!()5hfVjYES u5HG_aHM2wyXoQYJaB4wGYHm_$k%FP6rD@r>_j7XnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf25f;1ld^F&3SUp#HU#9hW!Rw()J9@9P7P`C+IwEjh zoojbq@AhdAxLane{lx8+w_BW5Lq@1~%@UylHdfUEOTOIP6XtsB<@c_)dDA0}cD??? QSNCCuzu3fEy_^iz0A2r7i2wiq literal 0 HcmV?d00001 diff --git a/docs/icons/text.png b/docs/icons/text.png new file mode 100644 index 0000000000000000000000000000000000000000..c43fb622fba6ccd1d69e660c43d1a4845617aab8 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DgFST5ZC|z|DXB)f9A}Y#>U1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~t`-_yl0gd=+DiH*Dm6nI!K1}8AC zZ;)U};dl7>eZHov%+6=4E+4*ow|2H9_kyiaWx1?vOkx60t@0IAG8g_4X^ zg@V$goXli}l>FSp%sf2>@6XnDYZz! Y(9+Vh?A!Y}KpPl5UHx3vIVCg!0Nl4^8~^|S literal 0 HcmV?d00001 diff --git a/docs/icons/transfer.gif b/docs/icons/transfer.gif new file mode 100644 index 0000000000000000000000000000000000000000..33697dbb667a8c898bc501cedd8039a3e9e04272 GIT binary patch literal 242 zcmZ?wbhEHb6k!l!IK;s49|(+%&;0*CbLPx61_oneV+Jr#{O1>vky)&eSX80_q%!jq zN-|Ov3QCi5GLscj@^ce2^Yj$FQ_Fx79;N9Ssl_@9*&tqqLuzJ;UUGh}jzVy1K}l+E zQfiTcp{1oMgW^vXMg|5Z1|5+3Aln(3Q#G`%?loA)#Gq@m*=ucI?DJZ$h{7jq60EN$ z%~d?lR>S0McO~B8j-}Ir=et8&oIMkM8Y@liURvT6>$dvF%11Mo3W@nQRp?BsQ#|oZ hcdptv6Cq9pYXE?dSF`{C literal 0 HcmV?d00001 diff --git a/docs/icons/transfer.png b/docs/icons/transfer.png new file mode 100644 index 0000000000000000000000000000000000000000..b969e4349108879ae7dde892cde7b6239160d132 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DbWC*5ZC`eU~GKm|NogYXQnYQ z7#kY{Wu&%mi~&;2B|(0{|Nk>wKgH_^Ic1(Mjv*Y;zUK~dHam#8 zUgSRb#=VX??oEQiZ~b5gfh{dB_qXWC80MFjyEFVdQ&MBb@01)eX9smFU literal 0 HcmV?d00001 diff --git a/docs/icons/unknown.gif b/docs/icons/unknown.gif new file mode 100644 index 0000000000000000000000000000000000000000..32b1ea23fb6f6195f1bb17adf9c3cb2cc29dfefa GIT binary patch literal 245 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIn&tKm;nhW{__jT$ShV!EGkg|Qki)QB^jv- z1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf285XU1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~s5$!F=Nr+DiNoyEKNn0HxnxU3mlzsLOAZ_iYZkS)|x&%mZ$!h(dg;N z=IATcJZYQmPchPS(@DDYDf9o&D(lG09X&i&7u@1PXG-dc|J9xdv@NW}HKHUrKQ}iu zuY@5aBePf`v8Y4=NM+_Jlw_nT6qF|AWF{-5vw+Q8uH>gTe~DWM4fG=^-C literal 0 HcmV?d00001 diff --git a/docs/icons/up.gif b/docs/icons/up.gif new file mode 100644 index 0000000000000000000000000000000000000000..6d6d6d1ebf89aef21c40a88f5a181b8155e4d79f GIT binary patch literal 164 zcmZ?wbhEHb6k!l!SjfQe|Ns9p|Nk?9f#N^Ekc`Y?g~Xx~1t67~r%;lSs!&jxl#`jP zkdmL9n3<=i;GJ3ql<+7`&qyuSQOE}IG8|GfOZ1ZSb9EGgQwvH`bCXhw6bvmbO&Jt_ zvM@3*Ff!-Xz@*&Mzw-23{>5{AIi%LijXHkMRw1HyNzyFOS#mnvM?d*oFAHE` Gum%9J?KeFD literal 0 HcmV?d00001 diff --git a/docs/icons/up.png b/docs/icons/up.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa8faf5512b4fe91293013daf81e309e0f19ba5 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQk(%kA+G=b|3CBpKaj^Gwe3BS zVk!yp3;xgWbi08UkjI$h?e4XnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf2@fN%Gd^F&3SUp#HpJvB@7K6@PEKNyM9n&%bmCrCe zcjss6%XbLBY-{hkn53brAS;k_~V>SO;rqEX_zty4nJbR|}ofI+Ll^r*| X^U1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~s5+|$J|gd=+CxkgR~MIPn@A4(h7 zDablp6x{XSCq8*T-v`Er91A;+`h*^JaA`3q7eC{y-fF|_QhR&b_j9@3)5SlOoEB4< z+w!!v|7w(=>5sEl^B+xqC0WaOTu1Cq!PR*`fL4T+xJHyD=jZ08=9MsnWMmdABo>t@ z0IAG8g_4X^g@V$goXli}l>FSp%sf2>@6XnDYZz!(9+Vh?A!Y}KpPl5UHx3vIVCg!0G%gjxc~qF literal 0 HcmV?d00001 diff --git a/docs/icons/uuencoded.gif b/docs/icons/uuencoded.gif new file mode 100644 index 0000000000000000000000000000000000000000..4387d529f69f77810347be63429d13ff38bcb2c1 GIT binary patch literal 236 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIn&tKm;nhW{__jT$ShV!EGkg|Qki)QB^jv- z1*J(jnaK(%`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^FF8L~MXnDYZz! z(9+VBLGdRGBLf2?gAT|RknIf2@fN%Gd^F&3SUp#HpJvB@7K6@PEKNyM9n&%bmCrCe zcjss6%XbLBY-{hkn53brAS;k_~V>SO;rqEX_zty4nJbR|}ofI+Ll^r*| X^U1# zvCxgiQ-KsyNswRge}<>q4ZMIn#w2fd7lsa2Sq~s5+|$J|gd=+CxkgR~MIPn@A4(h7 zDablp6x{XSCq8*T-v`Er91A;+`h*^JaA`3q7eC{y-fF|_QhR&b_j9@3)5SlOoEB4< z+w!!v|7w(=>5sEl^B+xqC0WaOTu1Cq!PR*`fL4T+xJHyD=jZ08=9MsnWMmdABo>t@ z0IAG8g_4X^g@V$goXli}l>FSp%sf2>@6XnDYZz!(9+Vh?A!Y}KpPl5UHx3vIVCg!0G%gjxc~qF literal 0 HcmV?d00001 diff --git a/docs/icons/world1.gif b/docs/icons/world1.gif new file mode 100644 index 0000000000000000000000000000000000000000..05b4ec205884f16202e290b83db7c36ec660a73e GIT binary patch literal 228 zcmZ?wbhEHb6k!l!SjfQe|Ns9p|Nk@0G-hC6Q2gf?l95@gkXTfr0HiYW6iPBu6$(m| zax#+@Qu1>XGxPKmyi?175+0@L8L7oO3fUlDhC^y*iC%Jku8u-*YC%bAZc=KIf}y3Q zDTCrq7DfgJMg|?A=?own8JLoL`d3=Lojq&DmV<08H)chf_{g}X9%4v)7BSC#N7g2- z#f}=s?(`k{vcq_8jpbY)WyV!4N-Aq^MwZQ4x?oEC?F~i2;bkXPZnEj*mSpYLJUDmD atT54C`TIV6aAK=hU_0K-zaxNw!5RQ*npTkj literal 0 HcmV?d00001 diff --git a/docs/icons/world1.png b/docs/icons/world1.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe0167e9a82ba1408b3f24c49fc45a9955e0216 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQak}ZA+G=b|3CBpKf_F8pny)- znwLO|sU*lR_&>wb?FL>z9%GWXy9+}HtE>l*Q|Ia87{YNqnS+(F?ZSuu;f*PGSM6QM z^HAMl$9kh9rfZ|NOjTUgoqaT{t;^NRYZp(buPoPI9)2qmkuYPMhy@onN_d#94N9xH za`ec;GatG*UG^nJ9bI@f;ON1vS-Q>#x%l{E+a!4T_=4LcmWswiOCFNXSiA3(K-A&{ z?(Kps4EBAxw(EP1+kq|#D{+k|NzTvBP0cG|2+7DSR!A%=Q2EJ%$YM8W*Rf388d)^;y=HTjLc$%#G(=fAeEV? zP?C|VP*9qblbNiLlAoKHnWv}VomvKz@F-2sNG;Y;$OiE;98xn&^pf*)brgbA3rbRR zlTwQm3@t5985DoAFfuSOGU$NJ2ieZRTp_XR&O5bJ*Ohi!T+-@^=jL?!gy~R6SmeCA7ufyx{6*ATcJslr}JMh5dXZ@R8@u~6~|L2GQ-ZWP>JG?NF z4Jg0vmRC^7KJ%f~v8q#itRY$c?E)7prCuI-Z91*{OohZsp9hx@HtH+J7=~x_JdWz; zc-G~7Eof)bEs>?uc5OJEC${y-iplXum7?~qdLK5e?*E1Sdp8nwdUlyi%mKPDti&~< zBso7fH#M(>AtWQSSRt{fL;*-;<|&k9q$(7YCgo%%E2QM-CT8a8DR`%r0VO<2(=$?w xbriBeybOob%o07I5jqONsRbpexk;%-3Wk=Jre)vW&jH%N;OXk;vd$@?2>^CtjJN;* literal 0 HcmV?d00001 diff --git a/docs/icons/xml.png b/docs/icons/xml.png new file mode 100644 index 0000000000000000000000000000000000000000..cea0683559292eaafb685de5d2911f0cb6dac91e GIT binary patch literal 1053 zcmXAnYe2(YmZgTNn504(g~gVusZo@ywW%u`W|l4@rlP-6GEE|(!<4Y3$OGXd zom#nNbdb(bl2BRZfeP|C&)amHo9>v?Z}vRzcU|{=zwZm*ud$mcl0^S?o7Pbjry7iP?T3{N^+Wr$5U`PoL!tNdRXGL!1Jpr=ci=RtqOo%b?R~wK}3!$Dr5iP@SG(W=5}{ zK>?gu6d*HeFwD*xh;W4mj=^X&fD9&+(P$zXO$>8$Ces{>n3u92oD)){^ zg2&qPNzy`!@(seWsJi>1@Iks*cqlFOPxd%}wO`8T0{cu8T~eH{d37bWGqpCVv-0p# zv1Q;x0d2?$x8({%`_`K^@AH1%a6H-Ar>~7~3ybV(E7AYG9d_z@M%>kq&az(T>K9R+ zy_~TAr)S$PjdqLghs%5dM?PlKtvMAsiP5MnqwbEoU-O^7R5=~7druaySQ!E8i=J+A z(Eih#TDz>7@`{Z;b^FAMPYO{>O!UDWtjKpVbB*}OIqSvW?5f8%3yueLD5~ATQtgu? zwr#bdYyrJR9&|Za%FmMSXzmtx&IWYEdxyO5lAB(Y4MedL;?v7zh1KkeG)cmRWcB8) z&tGzcFWOs^Zb=Vp*;%8k?Elpp7?~lhQf~jo4*b&heM**{@3n#5EfJT8ua;1ls*%Y$3EugDB3Ll(N=lLlh5B>*jRgSzwmCUulKdmJJ+uV`E$7xWnIbd TSmSrF9e#I8ERqPH31ssB=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "AB" 1 "2018-10-10" "Apache HTTP Server" "ab" + +.SH NAME +ab \- Apache HTTP server benchmarking tool + +.SH "SYNOPSIS" + +.PP +\fB\fBab\fR [ -\fBA\fR \fIauth-username\fR:\fIpassword\fR ] [ -\fBb\fR \fIwindowsize\fR ] [ -\fBB\fR \fIlocal-address\fR ] [ -\fBc\fR \fIconcurrency\fR ] [ -\fBC\fR \fIcookie-name\fR=\fIvalue\fR ] [ -\fBd\fR ] [ -\fBe\fR \fIcsv-file\fR ] [ -\fBE\fR \fIclient-certificate file\fR ] [ -\fBf\fR \fIprotocol\fR ] [ -\fBg\fR \fIgnuplot-file\fR ] [ -\fBh\fR ] [ -\fBH\fR \fIcustom-header\fR ] [ -\fBi\fR ] [ -\fBk\fR ] [ -\fBl\fR ] [ -\fBm\fR \fIHTTP-method\fR ] [ -\fBn\fR \fIrequests\fR ] [ -\fBp\fR \fIPOST-file\fR ] [ -\fBP\fR \fIproxy-auth-username\fR:\fIpassword\fR ] [ -\fBq\fR ] [ -\fBr\fR ] [ -\fBs\fR \fItimeout\fR ] [ -\fBS\fR ] [ -\fBt\fR \fItimelimit\fR ] [ -\fBT\fR \fIcontent-type\fR ] [ -\fBu\fR \fIPUT-file\fR ] [ -\fBv\fR \fIverbosity\fR] [ -\fBV\fR ] [ -\fBw\fR ] [ -\fBx\fR \fI-attributes\fR ] [ -\fBX\fR \fIproxy\fR[:\fIport\fR] ] [ -\fBy\fR \fI-attributes\fR ] [ -\fBz\fR \fI
    -attributes\fR ] [ -\fBZ\fR \fIciphersuite\fR ] [http[s]://]\fIhostname\fR[:\fIport\fR]/\fIpath\fR\fR + + +.SH "SUMMARY" + +.PP +\fBab\fR is a tool for benchmarking your Apache Hypertext Transfer Protocol (HTTP) server\&. It is designed to give you an impression of how your current Apache installation performs\&. This especially shows you how many requests per second your Apache installation is capable of serving\&. + + +.SH "OPTIONS" + + +.TP +\fB-A \fIauth-username\fR:\fIpassword\fR\fR +Supply BASIC Authentication credentials to the server\&. The username and password are separated by a single \fB:\fR and sent on the wire base64 encoded\&. The string is sent regardless of whether the server needs it (\fIi\&.e\&.\fR, has sent an 401 authentication needed)\&. +.TP +\fB-b \fIwindowsize\fR\fR +Size of TCP send/receive buffer, in bytes\&. +.TP +\fB-B \fIlocal-address\fR\fR +Address to bind to when making outgoing connections\&. +.TP +\fB-c \fIconcurrency\fR\fR +Number of multiple requests to perform at a time\&. Default is one request at a time\&. +.TP +\fB-C \fIcookie-name\fR=\fIvalue\fR\fR +Add a \fBCookie:\fR line to the request\&. The argument is typically in the form of a \fB\fIname\fR=\fIvalue\fR\fR pair\&. This field is repeatable\&. +.TP +\fB-d\fR +Do not display the "percentage served within XX [ms] table"\&. (legacy support)\&. +.TP +\fB-e \fIcsv-file\fR\fR +Write a Comma separated value (CSV) file which contains for each percentage (from 1% to 100%) the time (in milliseconds) it took to serve that percentage of the requests\&. This is usually more useful than the 'gnuplot' file; as the results are already 'binned'\&. +.TP +\fB-E \fIclient-certificate-file\fR\fR +When connecting to an SSL website, use the provided client certificate in PEM format to authenticate with the server\&. The file is expected to contain the client certificate, followed by intermediate certificates, followed by the private key\&. Available in 2\&.4\&.36 and later\&. +.TP +\fB-f \fIprotocol\fR\fR +Specify SSL/TLS protocol (SSL2, SSL3, TLS1, TLS1\&.1, TLS1\&.2, or ALL)\&. TLS1\&.1 and TLS1\&.2 support available in 2\&.4\&.4 and later\&. +.TP +\fB-g \fIgnuplot-file\fR\fR +Write all measured values out as a 'gnuplot' or TSV (Tab separate values) file\&. This file can easily be imported into packages like Gnuplot, IDL, Mathematica, Igor or even Excel\&. The labels are on the first line of the file\&. +.TP +\fB-h\fR +Display usage information\&. +.TP +\fB-H \fIcustom-header\fR\fR +Append extra headers to the request\&. The argument is typically in the form of a valid header line, containing a colon-separated field-value pair (\fIi\&.e\&.\fR, \fB"Accept-Encoding: zip/zop;8bit"\fR)\&. +.TP +\fB-i\fR +Do \fBHEAD\fR requests instead of \fBGET\fR\&. +.TP +\fB-k\fR +Enable the HTTP KeepAlive feature, \fIi\&.e\&.\fR, perform multiple requests within one HTTP session\&. Default is no KeepAlive\&. +.TP +\fB-l\fR +Do not report errors if the length of the responses is not constant\&. This can be useful for dynamic pages\&. Available in 2\&.4\&.7 and later\&. +.TP +\fB-m \fIHTTP-method\fR\fR +Custom HTTP method for the requests\&. Available in 2\&.4\&.10 and later\&. +.TP +\fB-n \fIrequests\fR\fR +Number of requests to perform for the benchmarking session\&. The default is to just perform a single request which usually leads to non-representative benchmarking results\&. +.TP +\fB-p \fIPOST-file\fR\fR +File containing data to POST\&. Remember to also set \fB-T\fR\&. +.TP +\fB-P \fIproxy-auth-username\fR:\fIpassword\fR\fR +Supply BASIC Authentication credentials to a proxy en-route\&. The username and password are separated by a single \fB:\fR and sent on the wire base64 encoded\&. The string is sent regardless of whether the proxy needs it (\fIi\&.e\&.\fR, has sent an 407 proxy authentication needed)\&. +.TP +\fB-q\fR +When processing more than 150 requests, \fBab\fR outputs a progress count on \fBstderr\fR every 10% or 100 requests or so\&. The \fB-q\fR flag will suppress these messages\&. +.TP +\fB-r\fR +Don't exit on socket receive errors\&. +.TP +\fB-s \fItimeout\fR\fR +Maximum number of seconds to wait before the socket times out\&. Default is 30 seconds\&. Available in 2\&.4\&.4 and later\&. +.TP +\fB-S\fR +Do not display the median and standard deviation values, nor display the warning/error messages when the average and median are more than one or two times the standard deviation apart\&. And default to the min/avg/max values\&. (legacy support)\&. +.TP +\fB-t \fItimelimit\fR\fR +Maximum number of seconds to spend for benchmarking\&. This implies a \fB-n 50000\fR internally\&. Use this to benchmark the server within a fixed total amount of time\&. Per default there is no timelimit\&. +.TP +\fB-T \fIcontent-type\fR\fR +Content-type header to use for POST/PUT data, eg\&. \fBapplication/x-www-form-urlencoded\fR\&. Default is \fBtext/plain\fR\&. +.TP +\fB-u \fIPUT-file\fR\fR +File containing data to PUT\&. Remember to also set \fB-T\fR\&. +.TP +\fB-v \fIverbosity\fR\fR +Set verbosity level - \fB4\fR and above prints information on headers, \fB3\fR and above prints response codes (404, 200, etc\&.), \fB2\fR and above prints warnings and info\&. +.TP +\fB-V\fR +Display version number and exit\&. +.TP +\fB-w\fR +Print out results in HTML tables\&. Default table is two columns wide, with a white background\&. +.TP +\fB-x \fI-attributes\fR\fR +String to use as attributes for \fB
    \fR\&. Attributes are inserted \fB
    \fR\&. +.TP +\fB-X \fIproxy\fR[:\fIport\fR]\fR +Use a proxy server for the requests\&. +.TP +\fB-y \fI-attributes\fR\fR +String to use as attributes for \fB\fR\&. +.TP +\fB-z \fI
    -attributes\fR\fR +String to use as attributes for \fB\fR\&. +.TP +\fB-Z \fIciphersuite\fR\fR +Specify SSL/TLS cipher suite (See openssl ciphers) + +.SH "OUTPUT" + +.PP +The following list describes the values returned by \fBab\fR: + + +.TP +Server Software +The value, if any, returned in the \fIserver\fR HTTP header of the first successful response\&. This includes all characters in the header from beginning to the point a character with decimal value of 32 (most notably: a space or CR/LF) is detected\&. +.TP +Server Hostname +The DNS or IP address given on the command line +.TP +Server Port +The port to which ab is connecting\&. If no port is given on the command line, this will default to 80 for http and 443 for https\&. +.TP +SSL/TLS Protocol +The protocol parameters negotiated between the client and server\&. This will only be printed if SSL is used\&. +.TP +Document Path +The request URI parsed from the command line string\&. +.TP +Document Length +This is the size in bytes of the first successfully returned document\&. If the document length changes during testing, the response is considered an error\&. +.TP +Concurrency Level +The number of concurrent clients used during the test +.TP +Time taken for tests +This is the time taken from the moment the first socket connection is created to the moment the last response is received +.TP +Complete requests +The number of successful responses received +.TP +Failed requests +The number of requests that were considered a failure\&. If the number is greater than zero, another line will be printed showing the number of requests that failed due to connecting, reading, incorrect content length, or exceptions\&. +.TP +Write errors +The number of errors that failed during write (broken pipe)\&. +.TP +Non-2xx responses +The number of responses that were not in the 200 series of response codes\&. If all responses were 200, this field is not printed\&. +.TP +Keep-Alive requests +The number of connections that resulted in Keep-Alive requests +.TP +Total body sent +If configured to send data as part of the test, this is the total number of bytes sent during the tests\&. This field is omitted if the test did not include a body to send\&. +.TP +Total transferred +The total number of bytes received from the server\&. This number is essentially the number of bytes sent over the wire\&. +.TP +HTML transferred +The total number of document bytes received from the server\&. This number excludes bytes received in HTTP headers +.TP +Requests per second +This is the number of requests per second\&. This value is the result of dividing the number of requests by the total time taken +.TP +Time per request +The average time spent per request\&. The first value is calculated with the formula \fBconcurrency * timetaken * 1000 / done\fR while the second value is calculated with the formula \fBtimetaken * 1000 / done\fR +.TP +Transfer rate +The rate of transfer as calculated by the formula \fBtotalread / 1024 / timetaken\fR + +.SH "BUGS" + +.PP +There are various statically declared buffers of fixed length\&. Combined with the lazy parsing of the command line arguments, the response headers from the server and other external inputs, this might bite you\&. + +.PP +It does not implement HTTP/1\&.x fully; only accepts some 'expected' forms of responses\&. The rather heavy use of \fBstrstr(3)\fR shows up top in profile, which might indicate a performance problem; \fIi\&.e\&.\fR, you would measure the \fBab\fR performance rather than the server's\&. + diff --git a/docs/man/apachectl.8 b/docs/man/apachectl.8 new file mode 100644 index 0000000..870a048 --- /dev/null +++ b/docs/man/apachectl.8 @@ -0,0 +1,95 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "APACHECTL" 8 "2018-07-06" "Apache HTTP Server" "apachectl" + +.SH NAME +apachectl \- Apache HTTP Server Control Interface + +.SH "SYNOPSIS" + +.PP +When acting in pass-through mode, \fBapachectl\fR can take all the arguments available for the httpd binary\&. + +.PP +\fB\fBapachectl\fR [ \fIhttpd-argument\fR ]\fR + +.PP +When acting in SysV init mode, \fBapachectl\fR takes simple, one-word commands, defined below\&. + +.PP +\fB\fBapachectl\fR \fIcommand\fR\fR + + +.SH "SUMMARY" + +.PP +\fBapachectl\fR is a front end to the Apache HyperText Transfer Protocol (HTTP) server\&. It is designed to help the administrator control the functioning of the Apache httpd daemon\&. + +.PP +The \fBapachectl\fR script can operate in two modes\&. First, it can act as a simple front-end to the httpd command that simply sets any necessary environment variables and then invokes httpd, passing through any command line arguments\&. Second, \fBapachectl\fR can act as a SysV init script, taking simple one-word arguments like \fBstart\fR, \fBrestart\fR, and \fBstop\fR, and translating them into appropriate signals to httpd\&. + +.PP +If your Apache installation uses non-standard paths, you will need to edit the \fBapachectl\fR script to set the appropriate paths to the httpd binary\&. You can also specify any necessary httpd command line arguments\&. See the comments in the script for details\&. + +.PP +The \fBapachectl\fR script returns a 0 exit value on success, and >0 if an error occurs\&. For more details, view the comments in the script\&. + + +.SH "OPTIONS" + +.PP +Only the SysV init-style options are defined here\&. Other arguments are defined on the httpd manual page\&. + + +.TP +\fBstart\fR +Start the Apache httpd daemon\&. Gives an error if it is already running\&. This is equivalent to \fBapachectl -k start\fR\&. +.TP +\fBstop\fR +Stops the Apache httpd daemon\&. This is equivalent to \fBapachectl -k stop\fR\&. +.TP +\fBrestart\fR +Restarts the Apache httpd daemon\&. If the daemon is not running, it is started\&. This command automatically checks the configuration files as in \fBconfigtest\fR before initiating the restart to make sure the daemon doesn't die\&. This is equivalent to \fBapachectl -k restart\fR\&. +.TP +\fBfullstatus\fR +Displays a full status report from mod_status\&. For this to work, you need to have mod_status enabled on your server and a text-based browser such as \fBlynx\fR available on your system\&. The URL used to access the status report can be set by editing the \fBSTATUSURL\fR variable in the script\&. +.TP +\fBstatus\fR +Displays a brief status report\&. Similar to the \fBfullstatus\fR option, except that the list of requests currently being served is omitted\&. +.TP +\fBgraceful\fR +Gracefully restarts the Apache httpd daemon\&. If the daemon is not running, it is started\&. This differs from a normal restart in that currently open connections are not aborted\&. A side effect is that old log files will not be closed immediately\&. This means that if used in a log rotation script, a substantial delay may be necessary to ensure that the old log files are closed before processing them\&. This command automatically checks the configuration files as in \fBconfigtest\fR before initiating the restart to make sure Apache doesn't die\&. This is equivalent to \fBapachectl -k graceful\fR\&. +.TP +\fBgraceful-stop\fR +Gracefully stops the Apache httpd daemon\&. This differs from a normal stop in that currently open connections are not aborted\&. A side effect is that old log files will not be closed immediately\&. This is equivalent to \fBapachectl -k graceful-stop\fR\&. +.TP +\fBconfigtest\fR +Run a configuration file syntax test\&. It parses the configuration files and either reports \fBSyntax Ok\fR or detailed information about the particular syntax error\&. This is equivalent to \fBapachectl -t\fR\&. + +.PP +The following option was available in earlier versions but has been removed\&. + + +.TP +\fBstartssl\fR +To start httpd with SSL support, you should edit your configuration file to include the relevant directives and then use the normal \fBapachectl start\fR\&. + diff --git a/docs/man/apxs.1 b/docs/man/apxs.1 new file mode 100644 index 0000000..9e8373e --- /dev/null +++ b/docs/man/apxs.1 @@ -0,0 +1,247 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "APXS" 1 "2018-07-06" "Apache HTTP Server" "apxs" + +.SH NAME +apxs \- APache eXtenSion tool + +.SH "SYNOPSIS" + +.PP +\fB\fBapxs\fR -\fBg\fR [ -\fBS\fR \fIname\fR=\fIvalue\fR ] -\fBn\fR \fImodname\fR\fR + +.PP +\fB\fBapxs\fR -\fBq\fR [ -\fBv\fR ] [ -\fBS\fR \fIname\fR=\fIvalue\fR ] \fIquery\fR \&.\&.\&.\fR + +.PP +\fB\fBapxs\fR -\fBc\fR [ -\fBS\fR \fIname\fR=\fIvalue\fR ] [ -\fBo\fR \fIdsofile\fR ] [ -\fBI\fR \fIincdir\fR ] [ -\fBD\fR \fIname\fR=\fIvalue\fR ] [ -\fBL\fR \fIlibdir\fR ] [ -\fBl\fR \fIlibname\fR ] [ -\fBWc,\fR\fIcompiler-flags\fR ] [ -\fBWl,\fR\fIlinker-flags\fR ] \fIfiles\fR \&.\&.\&.\fR + +.PP +\fB\fBapxs\fR -\fBi\fR [ -\fBS\fR \fIname\fR=\fIvalue\fR ] [ -\fBn\fR \fImodname\fR ] [ -\fBa\fR ] [ -\fBA\fR ] \fIdso-file\fR \&.\&.\&.\fR + +.PP +\fB\fBapxs\fR -\fBe\fR [ -\fBS\fR \fIname\fR=\fIvalue\fR ] [ -\fBn\fR \fImodname\fR ] [ -\fBa\fR ] [ -\fBA\fR ] \fIdso-file\fR \&.\&.\&.\fR + + +.SH "SUMMARY" + +.PP +\fBapxs\fR is a tool for building and installing extension modules for the Apache HyperText Transfer Protocol (HTTP) server\&. This is achieved by building a dynamic shared object (DSO) from one or more source or object \fIfiles\fR which then can be loaded into the Apache server under runtime via the LoadModule directive from mod_so\&. + +.PP +So to use this extension mechanism your platform has to support the DSO feature and your Apache httpd binary has to be built with the mod_so module\&. The \fBapxs\fR tool automatically complains if this is not the case\&. You can check this yourself by manually running the command + +.nf + + $ httpd -l + +.fi + +.PP +The module mod_so should be part of the displayed list\&. If these requirements are fulfilled you can easily extend your Apache server's functionality by installing your own modules with the DSO mechanism by the help of this \fBapxs\fR tool: + +.nf + + $ apxs -i -a -c mod_foo\&.c + gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo\&.c + ld -Bshareable -o mod_foo\&.so mod_foo\&.o + cp mod_foo\&.so /path/to/apache/modules/mod_foo\&.so + chmod 755 /path/to/apache/modules/mod_foo\&.so + [activating module `foo' in /path/to/apache/etc/httpd\&.conf] + $ apachectl restart + /path/to/apache/sbin/apachectl restart: httpd not running, trying to start + [Tue Mar 31 11:27:55 1998] [debug] mod_so\&.c(303): loaded module foo_module + /path/to/apache/sbin/apachectl restart: httpd started + $ _ + +.fi + +.PP +The arguments \fIfiles\fR can be any C source file (\&.c), a object file (\&.o) or even a library archive (\&.a)\&. The \fBapxs\fR tool automatically recognizes these extensions and automatically used the C source files for compilation while just using the object and archive files for the linking phase\&. But when using such pre-compiled objects make sure they are compiled for position independent code (PIC) to be able to use them for a dynamically loaded shared object\&. For instance with GCC you always just have to use \fB-fpic\fR\&. For other C compilers consult its manual page or at watch for the flags \fBapxs\fR uses to compile the object files\&. + +.PP +For more details about DSO support in Apache read the documentation of mod_so or perhaps even read the \fBsrc/modules/standard/mod_so\&.c\fR source file\&. + + +.SH "OPTIONS" + +.SS "Common Options" + + +.TP +\fB-n \fImodname\fR\fR +This explicitly sets the module name for the \fB-i\fR (install) and \fB-g\fR (template generation) option\&. Use this to explicitly specify the module name\&. For option \fB-g\fR this is required, for option \fB-i\fR the \fBapxs\fR tool tries to determine the name from the source or (as a fallback) at least by guessing it from the filename\&. + +.SS "Query Options" + + +.TP +\fB-q\fR +Performs a query for variables and environment settings used to build \fBhttpd\fR\&. When invoked without \fIquery\fR parameters, it prints all known variables and their values\&. The optional \fB-v\fR parameter formats the list output\&. .PP Use this to manually determine settings used to build the \fBhttpd\fR that will load your module\&. For instance use INC=-I`apxs -q INCLUDEDIR` .PP inside your own Makefiles if you need manual access to Apache's C header files\&. + +.SS "Configuration Options" + + +.TP +\fB-S \fIname\fR=\fIvalue\fR\fR +This option changes the apxs settings described above\&. + +.SS "Template Generation Options" + + +.TP +\fB-g\fR +This generates a subdirectory \fIname\fR (see option \fB-n\fR) and there two files: A sample module source file named \fBmod_\fIname\fR\&.c\fR which can be used as a template for creating your own modules or as a quick start for playing with the apxs mechanism\&. And a corresponding \fBMakefile\fR for even easier build and installing of this module\&. + +.SS "DSO Compilation Options" + + +.TP +\fB-c\fR +This indicates the compilation operation\&. It first compiles the C source files (\&.c) of \fIfiles\fR into corresponding object files (\&.o) and then builds a dynamically shared object in \fIdsofile\fR by linking these object files plus the remaining object files (\&.o and \&.a) of \fIfiles\fR\&. If no \fB-o\fR option is specified the output file is guessed from the first filename in \fIfiles\fR and thus usually defaults to \fBmod_\fIname\fR\&.so\fR\&. +.TP +\fB-o \fIdsofile\fR\fR +Explicitly specifies the filename of the created dynamically shared object\&. If not specified and the name cannot be guessed from the \fIfiles\fR list, the fallback name \fBmod_unknown\&.so\fR is used\&. +.TP +\fB-D \fIname\fR=\fIvalue\fR\fR +This option is directly passed through to the compilation command(s)\&. Use this to add your own defines to the build process\&. +.TP +\fB-I \fIincdir\fR\fR +This option is directly passed through to the compilation command(s)\&. Use this to add your own include directories to search to the build process\&. +.TP +\fB-L \fIlibdir\fR\fR +This option is directly passed through to the linker command\&. Use this to add your own library directories to search to the build process\&. +.TP +\fB-l \fIlibname\fR\fR +This option is directly passed through to the linker command\&. Use this to add your own libraries to search to the build process\&. +.TP +\fB-Wc,\fIcompiler-flags\fR\fR +This option passes \fIcompiler-flags\fR as additional flags to the \fBlibtool --mode=compile\fR command\&. Use this to add local compiler-specific options\&. +.TP +\fB-Wl,\fIlinker-flags\fR\fR +This option passes \fIlinker-flags\fR as additional flags to the \fBlibtool --mode=link\fR command\&. Use this to add local linker-specific options\&. +.TP +\fB-p\fR +This option causes apxs to link against the apr/apr-util libraries\&. This is useful when compiling helper programs that use the apr/apr-util libraries\&. + +.SS "DSO Installation and Configuration Options" + + +.TP +\fB-i\fR +This indicates the installation operation and installs one or more dynamically shared objects into the server's \fImodules\fR directory\&. +.TP +\fB-a\fR +This activates the module by automatically adding a corresponding LoadModule line to Apache's \fBhttpd\&.conf\fR configuration file, or by enabling it if it already exists\&. +.TP +\fB-A\fR +Same as option \fB-a\fR but the created LoadModule directive is prefixed with a hash sign (\fB#\fR), \fIi\&.e\&.\fR, the module is just prepared for later activation but initially disabled\&. +.TP +\fB-e\fR +This indicates the editing operation, which can be used with the \fB-a\fR and \fB-A\fR options similarly to the \fB-i\fR operation to edit Apache's \fBhttpd\&.conf\fR configuration file without attempting to install the module\&. + +.SH "EXAMPLES" + +.PP +Assume you have an Apache module named \fBmod_foo\&.c\fR available which should extend Apache's server functionality\&. To accomplish this you first have to compile the C source into a shared object suitable for loading into the Apache server under runtime via the following command: + +.nf + + $ apxs -c mod_foo\&.c + /path/to/libtool --mode=compile gcc \&.\&.\&. -c mod_foo\&.c + /path/to/libtool --mode=link gcc \&.\&.\&. -o mod_foo\&.la mod_foo\&.slo + $ _ + +.fi + +.PP +Then you have to update the Apache configuration by making sure a LoadModule directive is present to load this shared object\&. To simplify this step \fBapxs\fR provides an automatic way to install the shared object in its "modules" directory and updating the \fBhttpd\&.conf\fR file accordingly\&. This can be achieved by running: + +.nf + + $ apxs -i -a mod_foo\&.la + /path/to/instdso\&.sh mod_foo\&.la /path/to/apache/modules + /path/to/libtool --mode=install cp mod_foo\&.la /path/to/apache/modules + \&.\&.\&. + chmod 755 /path/to/apache/modules/mod_foo\&.so + [activating module `foo' in /path/to/apache/conf/httpd\&.conf] + $ _ + +.fi + +.PP +This way a line named + +.nf + + LoadModule foo_module modules/mod_foo\&.so + +.fi + +.PP +is added to the configuration file if still not present\&. If you want to have this disabled per default use the \fB-A\fR option, \fIi\&.e\&.\fR + +.nf + + $ apxs -i -A mod_foo\&.c + +.fi + +.PP +For a quick test of the apxs mechanism you can create a sample Apache module template plus a corresponding Makefile via: + +.nf + + $ apxs -g -n foo + Creating [DIR] foo + Creating [FILE] foo/Makefile + Creating [FILE] foo/modules\&.mk + Creating [FILE] foo/mod_foo\&.c + Creating [FILE] foo/\&.deps + $ _ + +.fi + +.PP +Then you can immediately compile this sample module into a shared object and load it into the Apache server: + +.nf + + $ cd foo + $ make all reload + apxs -c mod_foo\&.c + /path/to/libtool --mode=compile gcc \&.\&.\&. -c mod_foo\&.c + /path/to/libtool --mode=link gcc \&.\&.\&. -o mod_foo\&.la mod_foo\&.slo + apxs -i -a -n "foo" mod_foo\&.la + /path/to/instdso\&.sh mod_foo\&.la /path/to/apache/modules + /path/to/libtool --mode=install cp mod_foo\&.la /path/to/apache/modules + \&.\&.\&. + chmod 755 /path/to/apache/modules/mod_foo\&.so + [activating module `foo' in /path/to/apache/conf/httpd\&.conf] + apachectl restart + /path/to/apache/sbin/apachectl restart: httpd not running, trying to start + [Tue Mar 31 11:27:55 1998] [debug] mod_so\&.c(303): loaded module foo_module + /path/to/apache/sbin/apachectl restart: httpd started + $ _ + +.fi + diff --git a/docs/man/dbmmanage.1 b/docs/man/dbmmanage.1 new file mode 100644 index 0000000..43c342c --- /dev/null +++ b/docs/man/dbmmanage.1 @@ -0,0 +1,121 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "DBMMANAGE" 1 "2018-07-06" "Apache HTTP Server" "dbmmanage" + +.SH NAME +dbmmanage \- Manage user authentication files in DBM format + +.SH "SYNOPSIS" + +.PP +\fB\fBdbmmanage\fR [ \fIencoding\fR ] \fIfilename\fR add|adduser|check|delete|update \fIusername\fR [ \fIencpasswd\fR [ \fIgroup\fR[,\fIgroup\fR\&.\&.\&.] [ \fIcomment\fR ] ] ]\fR + +.PP +\fB\fBdbmmanage\fR \fIfilename\fR view [ \fIusername\fR ]\fR + +.PP +\fB\fBdbmmanage\fR \fIfilename\fR import\fR + + +.SH "SUMMARY" + +.PP +\fBdbmmanage\fR is used to create and update the DBM format files used to store usernames and password for basic authentication of HTTP users via mod_authn_dbm\&. Resources available from the Apache HTTP server can be restricted to just the users listed in the files created by \fBdbmmanage\fR\&. This program can only be used when the usernames are stored in a DBM file\&. To use a flat-file database see htpasswd\&. + +.PP +Another tool to maintain a DBM password database is htdbm\&. + +.PP +This manual page only lists the command line arguments\&. For details of the directives necessary to configure user authentication in httpd see the httpd manual, which is part of the Apache distribution or can be found at http://httpd\&.apache\&.org/\&. + + +.SH "OPTIONS" + + +.TP +\fB\fIfilename\fR\fR +The filename of the DBM format file\&. Usually without the extension \fB\&.db\fR, \fB\&.pag\fR, or \fB\&.dir\fR\&. +.TP +\fB\fIusername\fR\fR +The user for which the operations are performed\&. The \fIusername\fR may not contain a colon (\fB:\fR)\&. +.TP +\fB\fIencpasswd\fR\fR +This is the already hashed password to use for the \fBupdate\fR and \fBadd\fR commands\&. You may use a hyphen (\fB-\fR) if you want to get prompted for the password, but fill in the fields afterwards\&. Additionally when using the \fBupdate\fR command, a period (\fB\&.\fR) keeps the original password untouched\&. +.TP +\fB\fIgroup\fR\fR +A group, which the user is member of\&. A groupname may not contain a colon (\fB:\fR)\&. You may use a hyphen (\fB-\fR) if you don't want to assign the user to a group, but fill in the comment field\&. Additionally when using the \fBupdate\fR command, a period (\fB\&.\fR) keeps the original groups untouched\&. +.TP +\fB\fIcomment\fR\fR +This is the place for your opaque comments about the user, like realname, mailaddress or such things\&. The server will ignore this field\&. + +.SS "Encodings" + + +.TP +\fB-d\fR +crypt hashing (default, except on Win32, Netware) +.TP +\fB-m\fR +MD5 hashing (default on Win32, Netware) +.TP +\fB-s\fR +SHA1 hashing +.TP +\fB-p\fR +plaintext (\fInot recommended\fR) + +.SS "Commands" + + +.TP +\fBadd\fR +Adds an entry for \fIusername\fR to \fIfilename\fR using the hashed password \fIencpasswd\fR\&. dbmmanage passwords\&.dat add rbowen foKntnEF3KSXA +.TP +\fBadduser\fR +Asks for a password and then adds an entry for \fIusername\fR to \fIfilename\fR\&. dbmmanage passwords\&.dat adduser krietz +.TP +\fBcheck\fR +Asks for a password and then checks if \fIusername\fR is in \fIfilename\fR and if it's password matches the specified one\&. dbmmanage passwords\&.dat check rbowen +.TP +\fBdelete\fR +Deletes the \fIusername\fR entry from \fIfilename\fR\&. dbmmanage passwords\&.dat delete rbowen +.TP +\fBimport\fR +Reads \fB\fIusername\fR:\fIpassword\fR\fR entries (one per line) from \fBSTDIN\fR and adds them to \fIfilename\fR\&. The passwords already have to be crypted\&. +.TP +\fBupdate\fR +Same as the \fBadduser\fR command, except that it makes sure \fIusername\fR already exists in \fIfilename\fR\&. dbmmanage passwords\&.dat update rbowen +.TP +\fBview\fR +Just displays the contents of the DBM file\&. If you specify a \fIusername\fR, it displays the particular record only\&. dbmmanage passwords\&.dat view + +.SH "BUGS" + +.PP +One should be aware that there are a number of different DBM file formats in existence, and with all likelihood, libraries for more than one format may exist on your system\&. The three primary examples are SDBM, NDBM, the GNU project's GDBM, and Berkeley DB 2\&. Unfortunately, all these libraries use different file formats, and you must make sure that the file format used by \fIfilename\fR is the same format that \fBdbmmanage\fR expects to see\&. \fBdbmmanage\fR currently has no way of determining what type of DBM file it is looking at\&. If used against the wrong format, will simply return nothing, or may create a different DBM file with a different name, or at worst, it may corrupt the DBM file if you were attempting to write to it\&. + +.PP +\fBdbmmanage\fR has a list of DBM format preferences, defined by the \fB@AnyDBM::ISA\fR array near the beginning of the program\&. Since we prefer the Berkeley DB 2 file format, the order in which \fBdbmmanage\fR will look for system libraries is Berkeley DB 2, then NDBM, then GDBM and then SDBM\&. The first library found will be the library \fBdbmmanage\fR will attempt to use for all DBM file transactions\&. This ordering is slightly different than the standard \fB@AnyDBM::ISA\fR ordering in Perl, as well as the ordering used by the simple \fBdbmopen()\fR call in Perl, so if you use any other utilities to manage your DBM files, they must also follow this preference ordering\&. Similar care must be taken if using programs in other languages, like C, to access these files\&. + +.PP +One can usually use the \fBfile\fR program supplied with most Unix systems to see what format a DBM file is in\&. + diff --git a/docs/man/fcgistarter.8 b/docs/man/fcgistarter.8 new file mode 100644 index 0000000..7440fd7 --- /dev/null +++ b/docs/man/fcgistarter.8 @@ -0,0 +1,59 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "FCGISTARTER" 8 "2020-02-08" "Apache HTTP Server" "fcgistarter" + +.SH NAME +fcgistarter \- Start a FastCGI program + +.SH "SYNOPSIS" + +.PP +\fB\fBfcgistarter\fR -\fBc\fR \fIcommand\fR -\fBp\fR \fIport\fR [ -\fBi\fR \fIinterface\fR ] -\fBN\fR \fInum\fR \fR + + +.SH "SUMMARY" + +.PP + + + +.SH "NOTE" + +.PP +Currently only works on Unix systems\&. + +.SH "OPTIONS" + + +.TP +\fB-c \fIcommand\fR\fR +Absolute path of the FastCGI program +.TP +\fB-p \fIport\fR\fR +Port which the program will listen on +.TP +\fB-i \fIinterface\fR\fR +Interface which the program will listen on +.TP +\fB-N \fInum\fR\fR +Number of instances of the program + diff --git a/docs/man/htcacheclean.8 b/docs/man/htcacheclean.8 new file mode 100644 index 0000000..d8c8469 --- /dev/null +++ b/docs/man/htcacheclean.8 @@ -0,0 +1,146 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "HTCACHECLEAN" 8 "2019-08-09" "Apache HTTP Server" "htcacheclean" + +.SH NAME +htcacheclean \- Clean up the disk cache + +.SH "SYNOPSIS" + +.PP +\fB\fBhtcacheclean\fR [ -\fBD\fR ] [ -\fBv\fR ] [ -\fBt\fR ] [ -\fBr\fR ] [ -\fBn\fR ] [ -\fBR\fR\fIround\fR ] -\fBp\fR\fIpath\fR [ -\fBl\fR\fIlimit\fR ] [ -\fBL\fR\fIlimit\fR ]\fR + +.PP +\fB\fBhtcacheclean\fR [ -\fBn\fR ] [ -\fBt\fR ] [ -\fBi\fR ] [ -\fBP\fR\fIpidfile\fR ] [ -\fBR\fR\fIround\fR ] -\fBd\fR\fIinterval\fR -\fBp\fR\fIpath\fR [ -\fBl\fR\fIlimit\fR ] [ -\fBL\fR\fIlimit\fR ]\fR + +.PP +\fB\fBhtcacheclean\fR [ -\fBv\fR ] [ -\fBR\fR\fIround\fR ] -\fBp\fR\fIpath\fR [ -\fBa\fR ] [ -\fBA\fR ]\fR + +.PP +\fB\fBhtcacheclean\fR [ -\fBD\fR ] [ -\fBv\fR ] [ -\fBt\fR ] [ -\fBR\fR\fIround\fR ] -\fBp\fR\fIpath\fR \fIurl\fR\fR + + +.SH "SUMMARY" + +.PP +\fBhtcacheclean\fR is used to keep the size of mod_cache_disk's storage within a given size limit, or limit on inodes in use\&. This tool can run either manually or in daemon mode\&. When running in daemon mode, it sleeps in the background and checks the cache directory at regular intervals for cached content to be removed\&. You can stop the daemon cleanly by sending it a TERM or INT signal\&. When run manually, a once off check of the cache directory is made for cached content to be removed\&. If one or more URLs are specified, each URL will be deleted from the cache, if present\&. + + +.SH "OPTIONS" + + +.TP +\fB-d\fIinterval\fR\fR +Daemonize and repeat cache cleaning every \fIinterval\fR minutes\&. This option is mutually exclusive with the \fB-D\fR, \fB-v\fR and \fB-r\fR options\&. To shutdown the daemon cleanly, just send it a \fBSIGTERM\fR or \fBSIGINT\fR\&. +.TP +\fB-D\fR +Do a dry run and don't delete anything\&. This option is mutually exclusive with the \fB-d\fR option\&. When doing a dry run and deleting directories with \fB-t\fR, the inodes reported deleted in the stats cannot take into account the directories deleted, and will be marked as an estimate\&. +.TP +\fB-v\fR +Be verbose and print statistics\&. This option is mutually exclusive with the \fB-d\fR option\&. +.TP +\fB-r\fR +Clean thoroughly\&. This assumes that the Apache web server is not running (otherwise you may get garbage in the cache)\&. This option is mutually exclusive with the \fB-d\fR option and implies the \fB-t\fR option\&. +.TP +\fB-n\fR +Be nice\&. This causes slower processing in favour of other processes\&. \fBhtcacheclean\fR will sleep from time to time so that (a) the disk IO will be delayed and (b) the kernel can schedule other processes in the meantime\&. +.TP +\fB-t\fR +Delete all empty directories\&. By default only cache files are removed, however with some configurations the large number of directories created may require attention\&. If your configuration requires a very large number of directories, to the point that inode or file allocation table exhaustion may become an issue, use of this option is advised\&. +.TP +\fB-p\fIpath\fR\fR +Specify \fIpath\fR as the root directory of the disk cache\&. This should be the same value as specified with the CacheRoot directive\&. +.TP +\fB-P\fIpidfile\fR\fR +Specify \fIpidfile\fR as the name of the file to write the process ID to when daemonized\&. +.TP +\fB-R\fIround\fR\fR +Specify \fIround\fR as the amount to round sizes up to, to compensate for disk block sizes\&. Set to the block size of the cache partition\&. +.TP +\fB-l\fIlimit\fR\fR +Specify \fIlimit\fR as the total disk cache size limit\&. The value is expressed in bytes by default (or attaching \fBB\fR to the number)\&. Attach \fBK\fR for Kbytes, \fBM\fR for MBytes or \fBG\fR for Gbytes\&. +.TP +\fB-L\fIlimit\fR\fR +Specify \fIlimit\fR as the total disk cache inode limit\&. \fBK\fR, \fBM\fR or \fBG\fR suffix can also be used\&. +.TP +\fB-i\fR +Be intelligent and run only when there was a modification of the disk cache\&. This option is only possible together with the \fB-d\fR option\&. +.TP +\fB-a\fR +List the URLs currently stored in the cache\&. Variants of the same URL will be listed once for each variant\&. +.TP +\fB-A\fR +List the URLs currently stored in the cache, along with their attributes in the following order: url, header size, body size, status, entity version, date, expiry, request time, response time, body present, head request\&. + +.SH "DELETING A SPECIFIC URL" + +.PP +If \fBhtcacheclean\fR is passed one or more URLs, each URL will be deleted from the cache\&. If multiple variants of an URL exists, all variants would be deleted\&. + +.PP +When a reverse proxied URL is to be deleted, the effective URL is constructed from the \fBHost\fR header, the \fBport\fR, the \fBpath\fR and the \fBquery\fR\&. Note the '?' in the URL must always be specified explicitly, whether a query string is present or not\&. For example, an attempt to delete the path \fB/\fR from the server \fBlocalhost\fR, the URL to delete would be \fBhttp://localhost:80/?\fR\&. + +.SH "LISTING URLS IN THE CACHE" + +.PP +By passing the \fB-a\fR or \fB-A\fR options to \fBhtcacheclean\fR, the URLs within the cache will be listed as they are found, one URL per line\&. The \fB-A\fR option dumps the full cache entry after the URL, with fields in the following order: + + +.TP +url +The URL of the entry\&. +.TP +header size +The size of the header in bytes\&. +.TP +body size +The size of the body in bytes\&. +.TP +status +Status of the cached response\&. +.TP +entity version +The number of times this entry has been revalidated without being deleted\&. +.TP +date +Date of the response\&. +.TP +expiry +Expiry date of the response\&. +.TP +request time +Time of the start of the request\&. +.TP +response time +Time of the end of the request\&. +.TP +body present +If 0, no body is stored with this request, 1 otherwise\&. +.TP +head request +If 1, the entry contains a cached HEAD request with no body, 0 otherwise\&. + +.SH "EXIT STATUS" + +.PP +\fBhtcacheclean\fR returns a zero status ("true") if all operations were successful, \fB1\fR otherwise\&. If an URL is specified, and the URL was cached and successfully removed, \fB0\fR is returned, \fB2\fR otherwise\&. If an error occurred during URL removal, \fB1\fR is returned\&. + diff --git a/docs/man/htdbm.1 b/docs/man/htdbm.1 new file mode 100644 index 0000000..ac02f9a --- /dev/null +++ b/docs/man/htdbm.1 @@ -0,0 +1,187 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "HTDBM" 1 "2024-04-02" "Apache HTTP Server" "htdbm" + +.SH NAME +htdbm \- Manipulate DBM password databases + +.SH "SYNOPSIS" + +.PP +\fB\fBhtdbm\fR [ -\fBT\fR\fIDBTYPE\fR ] [ -\fBi\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIcost\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIfilename\fR \fIusername\fR\fR + +.PP +\fB\fBhtdbm\fR -\fBb\fR [ -\fBT\fR\fIDBTYPE\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIcost\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIfilename\fR \fIusername\fR \fIpassword\fR\fR + +.PP +\fB\fBhtdbm\fR -\fBn\fR [ -\fBi\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIcost\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIusername\fR\fR + +.PP +\fB\fBhtdbm\fR -\fBnb\fR [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIcost\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIusername\fR \fIpassword\fR\fR + +.PP +\fB\fBhtdbm\fR -\fBv\fR [ -\fBT\fR\fIDBTYPE\fR ] [ -\fBi\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIcost\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIfilename\fR \fIusername\fR\fR + +.PP +\fB\fBhtdbm\fR -\fBvb\fR [ -\fBT\fR\fIDBTYPE\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIcost\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIfilename\fR \fIusername\fR \fIpassword\fR\fR + +.PP +\fB\fBhtdbm\fR -\fBx\fR [ -\fBT\fR\fIDBTYPE\fR ] \fIfilename\fR \fIusername\fR\fR + +.PP +\fB\fBhtdbm\fR -\fBl\fR [ -\fBT\fR\fIDBTYPE\fR ] \fR + + +.SH "SUMMARY" + +.PP +\fBhtdbm\fR is used to manipulate the DBM format files used to store usernames and password for basic authentication of HTTP users via mod_authn_dbm\&. See the dbmmanage documentation for more information about these DBM files\&. + + +.SH "OPTIONS" + + +.TP +\fB-b\fR +Use batch mode; \fIi\&.e\&.\fR, get the password from the command line rather than prompting for it\&. This option should be used with extreme care, since \fBthe password is clearly visible\fR on the command line\&. For script use see the \fB-i\fR option\&. +.TP +\fB-i\fR +Read the password from stdin without verification (for script usage)\&. +.TP +\fB-c\fR +Create the \fIpasswdfile\fR\&. If \fIpasswdfile\fR already exists, it is rewritten and truncated\&. This option cannot be combined with the \fB-n\fR option\&. +.TP +\fB-n\fR +Display the results on standard output rather than updating a database\&. This option changes the syntax of the command line, since the \fIpasswdfile\fR argument (usually the first one) is omitted\&. It cannot be combined with the \fB-c\fR option\&. +.TP +\fB-m\fR +Use MD5 hashing for passwords\&. On Windows and Netware, this is the default\&. +.TP +\fB-B\fR +Use bcrypt hashing for passwords\&. This is currently considered to be very secure\&. +.TP +\fB-C\fR +This flag is only allowed in combination with \fB-B\fR (bcrypt hashing)\&. It sets the computing time used for the bcrypt algorithm (higher is more secure but slower, default: 5, valid: 4 to 31)\&. +.TP +\fB-d\fR +Use \fBcrypt()\fR hashing for passwords\&. The default on all platforms but Windows and Netware\&. Though possibly supported by \fBhtdbm\fR on all platforms, it is not supported by the httpd server on Windows and Netware\&. This algorithm is \fBinsecure\fR by today's standards\&. +.TP +\fB-s\fR +Use SHA hashing for passwords\&. Facilitates migration from/to Netscape servers using the LDAP Directory Interchange Format (ldif)\&. This algorithm is \fBinsecure\fR by today's standards\&. +.TP +\fB-p\fR +Use plaintext passwords\&. Though \fBhtdbm\fR will support creation on all platforms, the httpd daemon will only accept plain text passwords on Windows and Netware\&. +.TP +\fB-l\fR +Print each of the usernames and comments from the database on stdout\&. +.TP +\fB-v\fR +Verify the username and password\&. The program will print a message indicating whether the supplied password is valid\&. If the password is invalid, the program exits with error code 3\&. +.TP +\fB-x\fR +Delete user\&. If the username exists in the specified DBM file, it will be deleted\&. +.TP +\fB-t\fR +Interpret the final parameter as a comment\&. When this option is specified, an additional string can be appended to the command line; this string will be stored in the "Comment" field of the database, associated with the specified username\&. +.TP +\fB\fIfilename\fR\fR +The filename of the DBM format file\&. Usually without the extension \fB\&.db\fR, \fB\&.pag\fR, or \fB\&.dir\fR\&. If \fB-c\fR is given, the DBM file is created if it does not already exist, or updated if it does exist\&. +.TP +\fB\fIusername\fR\fR +The username to create or update in \fIpasswdfile\fR\&. If \fIusername\fR does not exist in this file, an entry is added\&. If it does exist, the password is changed\&. +.TP +\fB\fIpassword\fR\fR +The plaintext password to be hashed and stored in the DBM file\&. Used only with the \fB-b\fR flag\&. +.TP +\fB-T\fIDBTYPE\fR\fR +Type of DBM file (SDBM, GDBM, DB, or "default")\&. + +.SH "BUGS" + +.PP +One should be aware that there are a number of different DBM file formats in existence, and with all likelihood, libraries for more than one format may exist on your system\&. The three primary examples are SDBM, NDBM, GNU GDBM, and Berkeley/Sleepycat DB 2/3/4\&. Unfortunately, all these libraries use different file formats, and you must make sure that the file format used by \fIfilename\fR is the same format that \fBhtdbm\fR expects to see\&. \fBhtdbm\fR currently has no way of determining what type of DBM file it is looking at\&. If used against the wrong format, will simply return nothing, or may create a different DBM file with a different name, or at worst, it may corrupt the DBM file if you were attempting to write to it\&. + +.PP +One can usually use the \fBfile\fR program supplied with most Unix systems to see what format a DBM file is in\&. + +.SH "EXIT STATUS" + +.PP +\fBhtdbm\fR returns a zero status ("true") if the username and password have been successfully added or updated in the DBM File\&. \fBhtdbm\fR returns \fB1\fR if it encounters some problem accessing files, \fB2\fR if there was a syntax problem with the command line, \fB3\fR if the password was entered interactively and the verification entry didn't match, \fB4\fR if its operation was interrupted, \fB5\fR if a value is too long (username, filename, password, or final computed record), \fB6\fR if the username contains illegal characters (see the Restrictions section), and \fB7\fR if the file is not a valid DBM password file\&. + +.SH "EXAMPLES" + +.nf + + htdbm /usr/local/etc/apache/\&.htdbm-users jsmith + +.fi + +.PP +Adds or modifies the password for user \fBjsmith\fR\&. The user is prompted for the password\&. If executed on a Windows system, the password will be hashed using the modified Apache MD5 algorithm; otherwise, the system's \fBcrypt()\fR routine will be used\&. If the file does not exist, \fBhtdbm\fR will do nothing except return an error\&. + +.nf + + htdbm -c /home/doe/public_html/\&.htdbm jane + +.fi + +.PP +Creates a new file and stores a record in it for user \fBjane\fR\&. The user is prompted for the password\&. If the file exists and cannot be read, or cannot be written, it is not altered and \fBhtdbm\fR will display a message and return an error status\&. + +.nf + + htdbm -mb /usr/web/\&.htdbm-all jones Pwd4Steve + +.fi + +.PP +Encrypts the password from the command line (\fBPwd4Steve\fR) using the MD5 algorithm, and stores it in the specified file\&. + +.SH "SECURITY CONSIDERATIONS" + +.PP +Web password files such as those managed by \fBhtdbm\fR should \fInot\fR be within the Web server's URI space -- that is, they should not be fetchable with a browser\&. + +.PP +The use of the \fB-b\fR option is discouraged, since when it is used the plaintext password appears on the command line\&. + +.PP +When using the \fBcrypt()\fR algorithm, note that only the first 8 characters of the password are used to form the password\&. If the supplied password is longer, the extra characters will be silently discarded\&. + +.PP +The SHA hashing option does not use salting: for a given password, there is only one hashed representation\&. The \fBcrypt()\fR and MD5 formats permute the representation by prepending a random salt string, to make dictionary attacks against the passwords more difficult\&. + +.PP +The SHA and \fBcrypt()\fR formats are insecure by today's standards\&. + +.SH "RESTRICTIONS" + +.PP +On the Windows platform, passwords hashed with \fBhtdbm\fR are limited to no more than \fB255\fR characters in length\&. Longer passwords will be truncated to 255 characters\&. + +.PP +The MD5 algorithm used by \fBhtdbm\fR is specific to the Apache software; passwords hashed using it will not be usable with other Web servers\&. + +.PP +Usernames are limited to \fB255\fR bytes and may not include the character \fB:\fR\&. + diff --git a/docs/man/htdigest.1 b/docs/man/htdigest.1 new file mode 100644 index 0000000..9f83228 --- /dev/null +++ b/docs/man/htdigest.1 @@ -0,0 +1,62 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "HTDIGEST" 1 "2018-07-06" "Apache HTTP Server" "htdigest" + +.SH NAME +htdigest \- manage user files for digest authentication + +.SH "SYNOPSIS" + +.PP +\fB\fBhtdigest\fR [ -\fBc\fR ] \fIpasswdfile\fR \fIrealm\fR \fIusername\fR\fR + + +.SH "SUMMARY" + +.PP +\fBhtdigest\fR is used to create and update the flat-files used to store usernames, realm and password for digest authentication of HTTP users\&. Resources available from the Apache HTTP server can be restricted to just the users listed in the files created by \fBhtdigest\fR\&. + +.PP +This manual page only lists the command line arguments\&. For details of the directives necessary to configure digest authentication in httpd see the Apache manual, which is part of the Apache distribution or can be found at http://httpd\&.apache\&.org/\&. + + +.SH "OPTIONS" + + +.TP +\fB-c\fR +Create the \fIpasswdfile\fR\&. If \fIpasswdfile\fR already exists, it is deleted first\&. +.TP +\fB\fIpasswdfile\fR\fR +Name of the file to contain the username, realm and password\&. If \fB-c\fR is given, this file is created if it does not already exist, or deleted and recreated if it does exist\&. +.TP +\fB\fIrealm\fR\fR +The realm name to which the user name belongs\&. See http://tools\&.ietf\&.org/html/rfc2617#section-3\&.2\&.1 for more details\&. +.TP +\fB\fIusername\fR\fR +The user name to create or update in \fIpasswdfile\fR\&. If \fIusername\fR does not exist is this file, an entry is added\&. If it does exist, the password is changed\&. + +.SH "SECURITY CONSIDERATIONS" + +.PP +This program is not safe as a setuid executable\&. Do \fInot\fR make it setuid\&. + diff --git a/docs/man/htpasswd.1 b/docs/man/htpasswd.1 new file mode 100644 index 0000000..776c051 --- /dev/null +++ b/docs/man/htpasswd.1 @@ -0,0 +1,185 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "HTPASSWD" 1 "2024-04-02" "Apache HTTP Server" "htpasswd" + +.SH NAME +htpasswd \- Manage user files for basic authentication + +.SH "SYNOPSIS" + +.PP +\fB\fBhtpasswd\fR [ -\fBc\fR ] [ -\fBi\fR ] [ -\fBm\fR | -\fBB\fR | -\fB2\fR | -\fB5\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBr\fR \fIrounds\fR ] [ -\fBC\fR \fIcost\fR ] [ -\fBD\fR ] [ -\fBv\fR ] \fIpasswdfile\fR \fIusername\fR\fR + +.PP +\fB\fBhtpasswd\fR -\fBb\fR [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fB2\fR | -\fB5\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBr\fR \fIrounds\fR ] [ -\fBC\fR \fIcost\fR ] [ -\fBD\fR ] [ -\fBv\fR ] \fIpasswdfile\fR \fIusername\fR \fIpassword\fR\fR + +.PP +\fB\fBhtpasswd\fR -\fBn\fR [ -\fBi\fR ] [ -\fBm\fR | -\fBB\fR | -\fB2\fR | -\fB5\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBr\fR \fIrounds\fR ] [ -\fBC\fR \fIcost\fR ] \fIusername\fR\fR + +.PP +\fB\fBhtpasswd\fR -\fBnb\fR [ -\fBm\fR | -\fBB\fR | -\fB2\fR | -\fB5\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBr\fR \fIrounds\fR ] [ -\fBC\fR \fIcost\fR ] \fIusername\fR \fIpassword\fR\fR + + +.SH "SUMMARY" + +.PP +\fBhtpasswd\fR is used to create and update the flat-files used to store usernames and password for basic authentication of HTTP users\&. If \fBhtpasswd\fR cannot access a file, such as not being able to write to the output file or not being able to read the file in order to update it, it returns an error status and makes no changes\&. + +.PP +Resources available from the Apache HTTP server can be restricted to just the users listed in the files created by \fBhtpasswd\fR\&. This program can only manage usernames and passwords stored in a flat-file\&. It can hash and display password information for use in other types of data stores, though\&. To use a DBM database see dbmmanage or htdbm\&. + +.PP +\fBhtpasswd\fR hashes passwords using either bcrypt, a version of MD5 modified for Apache, SHA-1, or the system's \fBcrypt()\fR routine\&. SHA-2-based hashes (SHA-256 and SHA-512) are supported for \fBcrypt()\fR\&. Files managed by \fBhtpasswd\fR may contain a mixture of different encoding types of passwords; some user records may have bcrypt or MD5-hashed passwords while others in the same file may have passwords hashed with \fBcrypt()\fR\&. + +.PP +This manual page only lists the command line arguments\&. For details of the directives necessary to configure user authentication in httpd see the Apache manual, which is part of the Apache distribution or can be found at http://httpd\&.apache\&.org/\&. + + +.SH "OPTIONS" + + +.TP +\fB-b\fR +Use batch mode; \fIi\&.e\&.\fR, get the password from the command line rather than prompting for it\&. This option should be used with extreme care, since \fBthe password is clearly visible\fR on the command line\&. For script use see the \fB-i\fR option\&. Available in 2\&.4\&.4 and later\&. +.TP +\fB-i\fR +Read the password from stdin without verification (for script usage)\&. +.TP +\fB-c\fR +Create the \fIpasswdfile\fR\&. If \fIpasswdfile\fR already exists, it is rewritten and truncated\&. This option cannot be combined with the \fB-n\fR option\&. +.TP +\fB-n\fR +Display the results on standard output rather than updating a file\&. This is useful for generating password records acceptable to Apache for inclusion in non-text data stores\&. This option changes the syntax of the command line, since the \fIpasswdfile\fR argument (usually the first one) is omitted\&. It cannot be combined with the \fB-c\fR option\&. +.TP +\fB-m\fR +Use MD5 hashing for passwords\&. This is the default (since version 2\&.2\&.18)\&. +.TP +\fB-2\fR +Use SHA-256 \fBcrypt()\fR based hashes for passwords\&. This is supported on most Unix platforms\&. +.TP +\fB-5\fR +Use SHA-512 \fBcrypt()\fR based hashes for passwords\&. This is supported on most Unix platforms\&. +.TP +\fB-B\fR +Use bcrypt hashing for passwords\&. This is currently considered to be very secure\&. +.TP +\fB-C\fR +This flag is only allowed in combination with \fB-B\fR (bcrypt hashing)\&. It sets the computing time used for the bcrypt algorithm (higher is more secure but slower, default: 5, valid: 4 to 17)\&. +.TP +\fB-r\fR +This flag is only allowed in combination with \fB-2\fR or \fB-5\fR\&. It sets the number of hash rounds used for the SHA-2 algorithms (higher is more secure but slower; the default is 5,000)\&. +.TP +\fB-d\fR +Use \fBcrypt()\fR hashing for passwords\&. This is not supported by the httpd server on Windows and Netware\&. This algorithm limits the password length to 8 characters\&. This algorithm is \fBinsecure\fR by today's standards\&. It used to be the default algorithm until version 2\&.2\&.17\&. +.TP +\fB-s\fR +Use SHA-1 (160-bit) hashing for passwords\&. Facilitates migration from/to Netscape servers using the LDAP Directory Interchange Format (ldif)\&. This algorithm is \fBinsecure\fR by today's standards\&. +.TP +\fB-p\fR +Use plaintext passwords\&. Though \fBhtpasswd\fR will support creation on all platforms, the httpd daemon will only accept plain text passwords on Windows and Netware\&. +.TP +\fB-D\fR +Delete user\&. If the username exists in the specified htpasswd file, it will be deleted\&. +.TP +\fB-v\fR +Verify password\&. Verify that the given password matches the password of the user stored in the specified htpasswd file\&. Available in 2\&.4\&.5 and later\&. +.TP +\fB\fIpasswdfile\fR\fR +Name of the file to contain the user name and password\&. If \fB-c\fR is given, this file is created if it does not already exist, or rewritten and truncated if it does exist\&. +.TP +\fB\fIusername\fR\fR +The username to create or update in \fIpasswdfile\fR\&. If \fIusername\fR does not exist in this file, an entry is added\&. If it does exist, the password is changed\&. +.TP +\fB\fIpassword\fR\fR +The plaintext password to be hashed and stored in the file\&. Only used with the \fB-b\fR flag\&. + +.SH "EXIT STATUS" + +.PP +\fBhtpasswd\fR returns a zero status ("true") if the username and password have been successfully added or updated in the \fIpasswdfile\fR\&. \fBhtpasswd\fR returns \fB1\fR if it encounters some problem accessing files, \fB2\fR if there was a syntax problem with the command line, \fB3\fR if the password was entered interactively and the verification entry didn't match, \fB4\fR if its operation was interrupted, \fB5\fR if a value is too long (username, filename, password, or final computed record), \fB6\fR if the username contains illegal characters (see the Restrictions section), and \fB7\fR if the file is not a valid password file\&. + +.SH "EXAMPLES" + +.nf + + htpasswd /usr/local/etc/apache/\&.htpasswd-users jsmith + +.fi + +.PP +Adds or modifies the password for user \fBjsmith\fR\&. The user is prompted for the password\&. The password will be hashed using the modified Apache MD5 algorithm\&. If the file does not exist, \fBhtpasswd\fR will do nothing except return an error\&. + +.nf + + htpasswd -c /home/doe/public_html/\&.htpasswd jane + +.fi + +.PP +Creates a new file and stores a record in it for user \fBjane\fR\&. The user is prompted for the password\&. If the file exists and cannot be read, or cannot be written, it is not altered and \fBhtpasswd\fR will display a message and return an error status\&. + +.nf + + htpasswd -db /usr/web/\&.htpasswd-all jones Pwd4Steve + +.fi + +.PP +Encrypts the password from the command line (\fBPwd4Steve\fR) using the \fBcrypt()\fR algorithm, and stores it in the specified file\&. + +.SH "SECURITY CONSIDERATIONS" + +.PP +Web password files such as those managed by \fBhtpasswd\fR should \fInot\fR be within the Web server's URI space -- that is, they should not be fetchable with a browser\&. + +.PP +This program is not safe as a setuid executable\&. Do \fInot\fR make it setuid\&. + +.PP +The use of the \fB-b\fR option is discouraged, since when it is used the plaintext password appears on the command line\&. + +.PP +When using the \fBcrypt()\fR algorithm, note that only the first 8 characters of the password are used to form the password\&. If the supplied password is longer, the extra characters will be silently discarded\&. + +.PP +The SHA-1 hashing format does not use salting: for a given password, there is only one hashed representation\&. The \fBcrypt()\fR and MD5 formats permute the representation by prepending a random salt string, to make dictionary attacks against the passwords more difficult\&. + +.PP +The SHA-1 and \fBcrypt()\fR formats are insecure by today's standards\&. + +.PP +The SHA-2-based \fBcrypt()\fR formats (SHA-256 and SHA-512) are supported on most modern Unix systems, and follow the specification at https://www\&.akkadia\&.org/drepper/SHA-crypt\&.txt\&. + +.SH "RESTRICTIONS" + +.PP +On the Windows platform, passwords hashed with \fBhtpasswd\fR are limited to no more than \fB255\fR characters in length\&. Longer passwords will be truncated to 255 characters\&. + +.PP +The MD5 algorithm used by \fBhtpasswd\fR is specific to the Apache software; passwords hashed using it will not be usable with other Web servers\&. + +.PP +Usernames are limited to \fB255\fR bytes and may not include the character \fB:\fR\&. + +.PP +The cost of computing a bcrypt password hash value increases with the number of rounds specified by the \fB-C\fR option\&. The \fBapr-util\fR library enforces a maximum number of rounds of 17 in version \fB1\&.6\&.0\fR and later\&. + diff --git a/docs/man/httpd.8 b/docs/man/httpd.8 new file mode 100644 index 0000000..75223f6 --- /dev/null +++ b/docs/man/httpd.8 @@ -0,0 +1,119 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "HTTPD" 8 "2018-07-06" "Apache HTTP Server" "httpd" + +.SH NAME +httpd \- Apache Hypertext Transfer Protocol Server + +.SH "SYNOPSIS" + +.PP +\fB\fBhttpd\fR [ -\fBd\fR \fIserverroot\fR ] [ -\fBf\fR \fIconfig\fR ] [ -\fBC\fR \fIdirective\fR ] [ -\fBc\fR \fIdirective\fR ] [ -\fBD\fR \fIparameter\fR ] [ -\fBe\fR \fIlevel\fR ] [ -\fBE\fR \fIfile\fR ] [ \fB-k\fR start|restart|graceful|stop|graceful-stop ] [ -\fBh\fR ] [ -\fBl\fR ] [ -\fBL\fR ] [ -\fBS\fR ] [ -\fBt\fR ] [ -\fBv\fR ] [ -\fBV\fR ] [ -\fBX\fR ] [ -\fBM\fR ] [ -\fBT\fR ] \fR + +.PP +On Windows systems, the following additional arguments are available: + +.PP +\fB\fBhttpd\fR [ -\fBk\fR install|config|uninstall ] [ -\fBn\fR \fIname\fR ] [ -\fBw\fR ]\fR + + +.SH "SUMMARY" + +.PP +\fBhttpd\fR is the Apache HyperText Transfer Protocol (HTTP) server program\&. It is designed to be run as a standalone daemon process\&. When used like this it will create a pool of child processes or threads to handle requests\&. + +.PP +In general, \fBhttpd\fR should not be invoked directly, but rather should be invoked via apachectl on Unix-based systems or as a service on Windows NT, 2000 and XP and as a console application on Windows 9x and ME\&. + + +.SH "OPTIONS" + + +.TP +\fB-d \fIserverroot\fR\fR +Set the initial value for the ServerRoot directive to \fIserverroot\fR\&. This can be overridden by the ServerRoot directive in the configuration file\&. The default is \fB/usr/local/apache2\fR\&. +.TP +\fB-f \fIconfig\fR\fR +Uses the directives in the file \fIconfig\fR on startup\&. If \fIconfig\fR does not begin with a /, then it is taken to be a path relative to the ServerRoot\&. The default is \fBconf/httpd\&.conf\fR\&. +.TP +\fB-k \fBstart|restart|graceful|stop|graceful-stop\fR\fR +Signals \fBhttpd\fR to start, restart, or stop\&. See Stopping Apache httpd for more information\&. +.TP +\fB-C \fIdirective\fR\fR +Process the configuration \fIdirective\fR before reading config files\&. +.TP +\fB-c \fIdirective\fR\fR +Process the configuration \fIdirective\fR after reading config files\&. +.TP +\fB-D \fIparameter\fR\fR +Sets a configuration \fIparameter \fRwhich can be used with sections in the configuration files to conditionally skip or process commands at server startup and restart\&. Also can be used to set certain less-common startup parameters including \fB-DNO_DETACH\fR (prevent the parent from forking) and \fB-DFOREGROUND\fR (prevent the parent from calling \fBsetsid()\fR et al)\&. +.TP +\fB-e \fIlevel\fR\fR +Sets the LogLevel to \fIlevel\fR during server startup\&. This is useful for temporarily increasing the verbosity of the error messages to find problems during startup\&. +.TP +\fB-E \fIfile\fR\fR +Send error messages during server startup to \fIfile\fR\&. +.TP +\fB-h\fR +Output a short summary of available command line options\&. +.TP +\fB-l\fR +Output a list of modules compiled into the server\&. This will \fBnot\fR list dynamically loaded modules included using the LoadModule directive\&. +.TP +\fB-L\fR +Output a list of directives provided by static modules, together with expected arguments and places where the directive is valid\&. Directives provided by shared modules are not listed\&. +.TP +\fB-M\fR +Dump a list of loaded Static and Shared Modules\&. +.TP +\fB-S\fR +Show the settings as parsed from the config file (currently only shows the virtualhost settings)\&. +.TP +\fB-T\fR (Available in 2\&.3\&.8 and later) +Skip document root check at startup/restart\&. +.TP +\fB-t\fR +Run syntax tests for configuration files only\&. The program immediately exits after these syntax parsing tests with either a return code of 0 (Syntax OK) or return code not equal to 0 (Syntax Error)\&. If -D \fIDUMP\fR_\fIVHOSTS \fRis also set, details of the virtual host configuration will be printed\&. If -D \fIDUMP\fR_\fIMODULES \fR is set, all loaded modules will be printed\&. +.TP +\fB-v\fR +Print the version of \fBhttpd\fR, and then exit\&. +.TP +\fB-V\fR +Print the version and build parameters of \fBhttpd\fR, and then exit\&. +.TP +\fB-X\fR +Run httpd in debug mode\&. Only one worker will be started and the server will not detach from the console\&. + +.PP +The following arguments are available only on the Windows platform: + + +.TP +\fB-k install|config|uninstall\fR +Install Apache httpd as a Windows NT service; change startup options for the Apache httpd service; and uninstall the Apache httpd service\&. +.TP +\fB-n \fIname\fR\fR +The \fIname\fR of the Apache httpd service to signal\&. +.TP +\fB-w\fR +Keep the console window open on error so that the error message can be read\&. + diff --git a/docs/man/httxt2dbm.1 b/docs/man/httxt2dbm.1 new file mode 100644 index 0000000..2a06b0c --- /dev/null +++ b/docs/man/httxt2dbm.1 @@ -0,0 +1,65 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "HTTXT2DBM" 1 "2019-11-13" "Apache HTTP Server" "httxt2dbm" + +.SH NAME +httxt2dbm \- Generate dbm files for use with RewriteMap + +.SH "SYNOPSIS" + +.PP +\fB\fBhttxt2dbm\fR [ -\fBv\fR ] [ -\fBf\fR \fIDBM_TYPE\fR ] -\fBi\fR \fISOURCE_TXT\fR -\fBo\fR \fIOUTPUT_DBM\fR \fR + + +.SH "SUMMARY" + +.PP +\fBhttxt2dbm\fR is used to generate dbm files from text input, for use in RewriteMap with the \fBdbm\fR map type\&. + +.PP +If the output file already exists, it will not be truncated\&. New keys will be added and existing keys will be updated\&. + + +.SH "OPTIONS" + + +.TP +\fB-v\fR +More verbose output +.TP +\fB-f \fIDBM_TYPE\fR\fR +Specify the DBM type to be used for the output\&. If not specified, will use the APR Default\&. Available types are: \fBGDBM\fR for GDBM files, \fBSDBM\fR for SDBM files, \fBDB\fR for berkeley DB files, \fBNDBM\fR for NDBM files, \fBdefault\fR for the default DBM type\&. +.TP +\fB-i \fISOURCE_TXT\fR\fR +Input file from which the dbm is to be created\&. The file should be formatted with one record per line, of the form: \fBkey value\fR\&. See the documentation for RewriteMap for further details of this file's format and meaning\&. +.TP +\fB-o \fIOUTPUT_DBM\fR\fR +Name of the output dbm files\&. + +.SH "EXAMPLES" + +.nf + + httxt2dbm -i rewritemap\&.txt -o rewritemap\&.dbm + httxt2dbm -f SDBM -i rewritemap\&.txt -o rewritemap\&.dbm +.fi + diff --git a/docs/man/logresolve.1 b/docs/man/logresolve.1 new file mode 100644 index 0000000..92fadb2 --- /dev/null +++ b/docs/man/logresolve.1 @@ -0,0 +1,51 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "LOGRESOLVE" 1 "2018-07-06" "Apache HTTP Server" "logresolve" + +.SH NAME +logresolve \- Resolve IP-addresses to hostnames in Apache log files + +.SH "SYNOPSIS" + +.PP +\fB\fBlogresolve\fR [ -\fBs\fR \fIfilename\fR ] [ -\fBc\fR ] < \fIaccess_log\fR > \fIaccess_log\&.new\fR\fR + + +.SH "SUMMARY" + +.PP +\fBlogresolve\fR is a post-processing program to resolve IP-addresses in Apache's access logfiles\&. To minimize impact on your nameserver, logresolve has its very own internal hash-table cache\&. This means that each IP number will only be looked up the first time it is found in the log file\&. + +.PP +Takes an Apache log file on standard input\&. The IP addresses must be the first thing on each line and must be separated from the remainder of the line by a space\&. + + +.SH "OPTIONS" + + +.TP +\fB-s \fIfilename\fR\fR +Specifies a filename to record statistics\&. +.TP +\fB-c\fR +This causes \fBlogresolve\fR to apply some DNS checks: after finding the hostname from the IP address, it looks up the IP addresses for the hostname and checks that one of these matches the original address\&. + diff --git a/docs/man/rotatelogs.8 b/docs/man/rotatelogs.8 new file mode 100644 index 0000000..29c35da --- /dev/null +++ b/docs/man/rotatelogs.8 @@ -0,0 +1,192 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "ROTATELOGS" 8 "2023-03-05" "Apache HTTP Server" "rotatelogs" + +.SH NAME +rotatelogs \- Piped logging program to rotate Apache logs + +.SH "SYNOPSIS" + +.PP +\fB\fBrotatelogs\fR [ -\fBl\fR ] [ -\fBL\fR \fIlinkname\fR ] [ -\fBp\fR \fIprogram\fR ] [ -\fBf\fR ] [ -\fBD\fR ] [ -\fBt\fR ] [ -\fBv\fR ] [ -\fBe\fR ] [ -\fBc\fR ] [ -\fBn\fR \fInumber-of-files\fR ] \fIlogfile\fR \fIrotationtime\fR|\fIfilesize\fR(B|K|M|G) [ \fIoffset\fR ]\fR + + +.SH "SUMMARY" + +.PP +\fBrotatelogs\fR is a simple program for use in conjunction with Apache's piped logfile feature\&. It supports rotation based on a time interval or maximum size of the log\&. + + +.SH "OPTIONS" + + +.TP +\fB-l\fR +Causes the use of local time rather than GMT as the base for the interval or for \fBstrftime(3)\fR formatting with size-based rotation\&. +.TP +\fB-L\fR \fIlinkname\fR +.PP Causes a hard link to be made from the current logfile to the specified link name\&. This can be used to watch the log continuously across rotations using a command like \fBtail -F linkname\fR\&. .PP If the linkname is not an absolute path, it is relative to \fBrotatelogs\fR' working directory, which is the ServerRoot when \fBrotatelogs\fR is run by the server\&. +.TP +\fB-p\fR \fIprogram\fR +If given, \fBrotatelogs\fR will execute the specified program every time a new log file is opened\&. The filename of the newly opened file is passed as the first argument to the program\&. If executing after a rotation, the old log file is passed as the second argument\&. \fBrotatelogs\fR does not wait for the specified program to terminate before continuing to operate, and will not log any error code returned on termination\&. The spawned program uses the same stdin, stdout, and stderr as rotatelogs itself, and also inherits the environment\&. +.TP +\fB-f\fR +Causes the logfile to be opened immediately, as soon as \fBrotatelogs\fR starts, instead of waiting for the first logfile entry to be read (for non-busy sites, there may be a substantial delay between when the server is started and when the first request is handled, meaning that the associated logfile does not "exist" until then, which causes problems from some automated logging tools) +.TP +\fB-D\fR +Creates the parent directories of the path that the log file will be placed in if they do not already exist\&. This allows \fBstrftime(3)\fR formatting to be used in the path and not just the filename\&. +.TP +\fB-t\fR +Causes the logfile to be truncated instead of rotated\&. This is useful when a log is processed in real time by a command like tail, and there is no need for archived data\&. No suffix will be added to the filename, however format strings containing '%' characters will be respected\&. +.TP +\fB-T\fR +Causes all but the initial logfile to be truncated when opened\&. This is useful when the format string contains something that will loop around, such as the day of the month\&. Available in 2\&.4\&.56 and later\&. +.TP +\fB-v\fR +Produce verbose output on STDERR\&. The output contains the result of the configuration parsing, and all file open and close actions\&. +.TP +\fB-e\fR +Echo logs through to stdout\&. Useful when logs need to be further processed in real time by a further tool in the chain\&. +.TP +\fB-c\fR +Create log file for each interval, even if empty\&. +.TP +\fB-n \fInumber-of-files\fR\fR +Use a circular list of filenames without timestamps\&. This option overwrites log files at startup and during rotation\&. With -n 3, the series of log files opened would be "logfile", "logfile\&.1", "logfile\&.2", then overwriting "logfile"\&. When this program first opens "logfile", the file will only be truncated if \fB-t\fR is also provided\&. Every subsequent rotation will always begin with truncation of the target file\&. For size based rotation without \fB-t\fR and existing log files in place, this option may result in unintuitive behavior such as initial log entries being sent to "logfile\&.1", and entries in "logfile\&.1" not being preserved even if later "logfile\&.n" have not yet been used\&. Available in 2\&.4\&.5 and later\&. +.TP +\fB\fIlogfile\fR\fR +.PP The path plus basename of the logfile\&. If \fIlogfile\fR includes any '%' characters, it is treated as a format string for \fBstrftime(3)\fR\&. Otherwise, the suffix \fI\&.nnnnnnnnnn\fR is automatically added and is the time in seconds (unless the -t option is used)\&. Both formats compute the start time from the beginning of the current period\&. For example, if a rotation time of 86400 is specified, the hour, minute, and second fields created from the \fBstrftime(3)\fR format will all be zero, referring to the beginning of the current 24-hour period (midnight)\&. .PP When using \fBstrftime(3)\fR filename formatting, be sure the log file format has enough granularity to produce a different file name each time the logs are rotated\&. Otherwise rotation will overwrite the same file instead of starting a new one\&. For example, if \fIlogfile\fR was \fB/var/log/errorlog\&.%Y-%m-%d\fR with log rotation at 5 megabytes, but 5 megabytes was reached twice in the same day, the same log file name would be produced and log rotation would keep writing to the same file\&. .PP If the logfile is not an absolute path, it is relative to \fBrotatelogs\fR' working directory, which is the ServerRoot when \fBrotatelogs\fR is run by the server\&. +.TP +\fB\fIrotationtime\fR\fR +The time between log file rotations in seconds\&. The rotation occurs at the beginning of this interval\&. For example, if the rotation time is 3600, the log file will be rotated at the beginning of every hour; if the rotation time is 86400, the log file will be rotated every night at midnight\&. (If no data is logged during an interval, no file will be created\&.) +.TP +\fB\fIfilesize\fR(B|K|M|G)\fR +The maximum file size in followed by exactly one of the letters \fBB\fR (Bytes), \fBK\fR (KBytes), \fBM\fR (MBytes) or \fBG\fR (GBytes)\&. .PP When time and size are specified, the size must be given after the time\&. Rotation will occur whenever either time or size limits are reached\&. +.TP +\fB\fIoffset\fR\fR +The number of minutes offset from UTC\&. If omitted, zero is assumed and UTC is used\&. For example, to use local time in the zone UTC -5 hours, specify a value of \fB-300\fR for this argument\&. In most cases, \fB-l\fR should be used instead of specifying an offset\&. + +.SH "EXAMPLES" + +.nf + + CustomLog "|bin/rotatelogs /var/log/logfile 86400" common + +.fi + +.PP +This creates the files /var/log/logfile\&.nnnn where nnnn is the system time at which the log nominally starts (this time will always be a multiple of the rotation time, so you can synchronize cron scripts with it)\&. At the end of each rotation time (here after 24 hours) a new log is started\&. + +.nf + + CustomLog "|bin/rotatelogs -l /var/log/logfile\&.%Y\&.%m\&.%d 86400" common + +.fi + +.PP +This creates the files /var/log/logfile\&.yyyy\&.mm\&.dd where yyyy is the year, mm is the month, and dd is the day of the month\&. Logging will switch to a new file every day at midnight, local time\&. + +.nf + + CustomLog "|bin/rotatelogs /var/log/logfile 5M" common + +.fi + +.PP +This configuration will rotate the logfile whenever it reaches a size of 5 megabytes\&. + +.nf + + ErrorLog "|bin/rotatelogs /var/log/errorlog\&.%Y-%m-%d-%H_%M_%S 5M" + +.fi + +.PP +This configuration will rotate the error logfile whenever it reaches a size of 5 megabytes, and the suffix to the logfile name will be created of the form \fBerrorlog\&.YYYY-mm-dd-HH_MM_SS\fR\&. + +.nf + + CustomLog "|bin/rotatelogs -t /var/log/logfile 86400" common + +.fi + +.PP +This creates the file \fB/var/log/logfile\fR, truncating the file at startup and then truncating the file once per day\&. It is expected in this scenario that a separate process (such as tail) would process the file in real time\&. + +.nf + + CustomLog "|bin/rotatelogs -T /var/log/logfile\&.%d 86400" common + +.fi + +.PP +If the server is started (or restarted) on the first of the month, this appends to \fB/var/log/logfile\&.01\fR\&. When a log entry is written on the second of the month, \fB/var/log/logfile\&.02\fR is truncated and new entries will be added to the top\&. This example keeps approximately 1 months worth of logs without external maintenance\&. + +.SH "PORTABILITY" + +.PP +The following logfile format string substitutions should be supported by all \fBstrftime(3)\fR implementations, see the \fBstrftime(3)\fR man page for library-specific extensions\&. + +.Ip "\(bu \s-1\fB%A\fR\s0 \- full weekday name (localized) + +.Ip "\(bu \s-1\fB%a\fR\s0 \- 3-character weekday name (localized) + +.Ip "\(bu \s-1\fB%B\fR\s0 \- full month name (localized) + +.Ip "\(bu \s-1\fB%b\fR\s0 \- 3-character month name (localized) + +.Ip "\(bu \s-1\fB%c\fR\s0 \- date and time (localized) + +.Ip "\(bu \s-1\fB%d\fR\s0 \- 2-digit day of month + +.Ip "\(bu \s-1\fB%H\fR\s0 \- 2-digit hour (24 hour clock) + +.Ip "\(bu \s-1\fB%I\fR\s0 \- 2-digit hour (12 hour clock) + +.Ip "\(bu \s-1\fB%j\fR\s0 \- 3-digit day of year + +.Ip "\(bu \s-1\fB%M\fR\s0 \- 2-digit minute + +.Ip "\(bu \s-1\fB%m\fR\s0 \- 2-digit month + +.Ip "\(bu \s-1\fB%p\fR\s0 \- am/pm of 12 hour clock (localized) + +.Ip "\(bu \s-1\fB%S\fR\s0 \- 2-digit second + +.Ip "\(bu \s-1\fB%U\fR\s0 \- 2-digit week of year (Sunday first day of week) + +.Ip "\(bu \s-1\fB%W\fR\s0 \- 2-digit week of year (Monday first day of week) + +.Ip "\(bu \s-1\fB%w\fR\s0 \- 1-digit weekday (Sunday first day of week) + +.Ip "\(bu \s-1\fB%X\fR\s0 \- time (localized) + +.Ip "\(bu \s-1\fB%x\fR\s0 \- date (localized) + +.Ip "\(bu \s-1\fB%Y\fR\s0 \- 4-digit year + +.Ip "\(bu \s-1\fB%y\fR\s0 \- 2-digit year + +.Ip "\(bu \s-1\fB%Z\fR\s0 \- time zone name + +.Ip "\(bu \s-1\fB%%\fR\s0 \- literal `%' + diff --git a/docs/man/suexec.8 b/docs/man/suexec.8 new file mode 100644 index 0000000..1eb7902 --- /dev/null +++ b/docs/man/suexec.8 @@ -0,0 +1,48 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "SUEXEC" 8 "2018-07-06" "Apache HTTP Server" "suexec" + +.SH NAME +suexec \- Switch user before executing external programs + +.SH "SYNOPSIS" + +.PP +\fB\fBsuexec\fR -\fBV\fR\fR + + +.SH "SUMMARY" + +.PP +\fBsuexec\fR is used by the Apache HTTP Server to switch to another user before executing CGI programs\&. In order to achieve this, it must run as \fBroot\fR\&. Since the HTTP daemon normally doesn't run as \fBroot\fR, the \fBsuexec\fR executable needs the setuid bit set and must be owned by \fBroot\fR\&. It should never be writable for any other person than \fBroot\fR\&. + +.PP +For further information about the concepts and the security model of suexec please refer to the suexec documentation (http://httpd\&.apache\&.org/docs/2\&.4/suexec\&.html)\&. + + +.SH "OPTIONS" + + +.TP +\fB-V\fR +If you are \fBroot\fR, this option displays the compile options of \fBsuexec\fR\&. For security reasons all configuration options are changeable only at compile time\&. + diff --git a/docs/man/tr/ab.1 b/docs/man/tr/ab.1 new file mode 100644 index 0000000..f9499e5 --- /dev/null +++ b/docs/man/tr/ab.1 @@ -0,0 +1,213 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "AB" 1 "2014-06-24" "Apache HTTP Sunucusu" "ab" +.nh +.SH İSİM +ab \- Apache HTTP sunucusu başarım ölçme aracı + +.SH "KULLANIM" + +.PP +\fBab\fR [ -\fBA\fR \fIyetkili-kullanıcı:parola\fR ] [ -\fBb\fR \fItampon-boyu\fR ] [ -\fBB\fR \fIyerel-adres\fR ] [ -\fBc\fR \fIbağlantı-sayısı\fR ] [ -\fBC\fR \fIçerez-ismi=değer\fR ] [ -\fBd\fR ] [ -\fBe\fR \fIcsv-dosyası\fR ] [ -\fBf\fR \fIprotokol\fR ] [ -\fBg\fR \fIgnuplot-dosyası\fR ] [ -\fBh\fR ] [ -\fBH\fR \fIözel-başlık\fR ] [ -\fBi\fR ] [ -\fBk\fR ] [ -\fBl\fR ] [ -\fBm\fR \fIHTTP-yöntemi\fR ] [ -\fBn\fR \fIistek-sayısı\fR ] [ -\fBp\fR \fIPOST-dosyası\fR ] [ -\fBP\fR \fIvekil-yetkilisi:parola\fR ] [ -\fBq\fR ] [ -\fBr\fR ] [ -\fBs\fR \fIzamanasimi\fR ] [ -\fBS\fR ] [ -\fBt\fR \fIsaniye\fR ] [ -\fBT\fR \fIiçerik-türü\fR ] [ -\fBu\fR \fIPUT-dosyası\fR ] [ -\fBv\fR \fIayrıntı-düzeyi\fR] [ -\fBV\fR ] [ -\fBw\fR ] [ -\fBx\fR \fI-öznitelikleri\fR ] [ -\fBX\fR \fIvekil\fR[:\fIport\fR] ] [ -\fBy\fR \fI-öznitelikleri\fR ] [ -\fBz\fR \fI
    -öznitelikleri\fR ] [ -\fBZ\fR \fIşifre-kümesi\fR ] [http[s]://]\fIkonakadı\fR[:\fIport\fR]/\fIdizin\fR + + +.SH "ÖZET" + +.PP +\fBab\fR Apache Hiper Metin Aktarım Protokolü (HTTP) sunucunuzun başarımını ölçmek amacıyla kullanabileceğiniz bir kıyaslama aracıdır\&. Mevcut Apache kurulumunuzun görevini nasıl yerine getirdiği hakkında bir izlenim edinmeniz için tasarlanmıştır\&. Özellikle, Apache kurulumunuzun saniyede kaç isteği sunma yeteneğinde olduğunu gösterir\&. + + +.SH "SEÇENEKLER" + + +.TP +\fB-A\fR \fIyetkili-kullanıcı\fR:\fIparola\fR +Sunucuya TEMEL Kimlik Doğrulamada kullanılmak üzere kanıt sağlar\&. Kullanıcı adı ile parola arasına sadece : konur ve sunucunun buna ihtiyacı olup olmadığına bakılmaksızın (yani, bir "401 kimlik doğrulaması gerekli" yanıtı beklenmeden) bağlantı üzerinden base64 kodlu olarak sunucuya gönderilir\&. +.TP +\fB-b\fR \fItampon-boyu\fR +TCP gönderme/alma tamponlarının bayt cinsinden uzunluğu\&. +.TP +\fB-B\fR \fIyerel-adres\fR +Uzak bağlantılar yaparken dinlenecek adres\&. +.TP +\fB-c\fR \fIbağlantı-sayısı\fR +Aynı anda işleme sokulacak bağlantı sayısı\&. Aynı anda bir bağlantı öntanımlı değerdir\&. +.TP +\fB-C\fR \fIçerez-ismi\fR=\fIdeğer\fR +İsteğe bir Cookie: satırı ekler\&. Argüman olarak genellikle bir \fIisim=değer\fR çifti kullanılır\&. Bu çiftler birden fazla olabilir\&. +.TP +\fB-d\fR +"percentage served within XX [ms] table" iletisi gösterilmez\&. (Geriye uyumluluk için vardır)\&. +.TP +\fB-e\fR \fIcsv-dosyası\fR +Sunulan isteğin birim zamanda (milisaniye) ne kadarının (yüzde cinsinden) sunulduğunu gösteren virgül ayraçlı değerler (CSV) dosyası\&. Sonuçlar 'bobin haline' getirilmiş olduğundan doğal olarak 'gnuplot' dosyasından daha yararlıdır\&. +.TP +\fB-f\fR \fIprotokol\fR +SSL/TLS protokolü belirtilir (SSL2, SSL3, TLS1, TLS1\&.1, TLS1\&.2 veya ALL)\&. TLS1\&.1 ve TLS1\&.2 desteği 2\&.4\&.4 ve sonraki sürümler içindir\&. +.TP +\fB-g\fR \fIgnuplot-dosyası\fR +Ölçülen değerler bir 'gnuplot' veya TSV (sekme ayraçlı değerler) dosyasına yazılır\&. Bu dosya, Gnuplot, IDL, Mathematica, Igor hatta Excel tarafından veri dosyası olarak kabul edilir\&. Veri sütunlarının başlıkları dosyanın ilk satırında bulunur\&. +.TP +\fB-h\fR +Kullanım bilgisi gösterir\&. +.TP +\fB-H\fR \fIözel-başlık\fR +İsteğe fazladan başlık ekler\&. \fIözel-başlık\fR, aralarında iki nokta imi bulunan bir isim-değer çifti olarak belirtilir\&. Örnek: "Accept-Encoding: zip/zop;8bit" +.TP +\fB-i\fR +GET istekleri yerine HEAD istekleri yapılır\&. +.TP +\fB-k\fR +HTTP KeepAlive (kalıcı bağlantı) özelliğini etkinleştirir, yani tek bir oturum içinde çok sayıda isteğe hizmet sunulabilir\&. Özellik öntanımlı olarak kapalıdır\&. +.TP +\fB-l\fR +Yanıtarın uzunluğu sabit değilse hataları raporlamaz\&. Özdevinimli sayfalarda kullanışlı olabilir\&. 2\&.4\&.7 ve sonraki sürümler içindir\&. +.TP +\fB-m\fR \fIHTTP-yöntemi\fR +İstekler için özel HTTP yöntemi, belirtilir\&. 2\&.4\&.10 ve sonraki sürümler içindir\&. +.TP +\fB-n\fR \fIistek-sayısı\fR +Kıyaslama oturumu sırasında sunucuya uygulanacak istek sayısı\&. Öntanımlı olarak hiçbir başarım ölçütü sağlamayan tek bir istek yapılır\&. +.TP +\fB-p\fR \fIPOST-dosyası\fR +POST isteği ile ilgili verileri içeren dosya\&. Ayrıca \fB-T\fR seçeneğini de belirtmeyi unutmayın\&.\&. +.TP +\fB-P\fR \fIvekil-yetkilisi\fR:\fIparola\fR +Vekil sunucuya TEMEL Kimlik Doğrulamasında kullanılacak kanıtları sağlar\&. Kullanıcı adı ile parola arasına sadece : konur ve vekilin buna ihtiyacı olup olmadığına bakılmaksızın (yani, bir "407 vekilde kimlik doğrulaması gerekiyor" yanıtı beklenmeden) bağlantı üzerinden base64 kodlu olarak sunucuya gönderilir\&. +.TP +\fB-q\fR +İstek sayısı 150'den fazla olduğunda, \fBab\fR her 100 veya %10 istekte bir, standart hataya bir işlenen istek sayacı çıktılar\&. \fB-q\fR seçeneği bu çıktının üretilmemesini sağlar\&. +.TP +\fB-r\fR +Soket hata alsa bile program çıkmaz\&. +.TP +\fB-s\fR \fIzamanasimi\fR +Soket zaman aşımına uğramadan önce beklenecek azami saniye sayısı\&. 30 saniye öntanımlı süredir\&. 2\&.4\&.4 ve sonraki sürümler içindir\&. +.TP +\fB-S\fR +Ortalama ve ortanca değerler arasında bir veya iki standart sapmadan fazlası varsa ne ortalama değer ne standart sapma değeri ne de uyarı/hata iletileri gösterilir\&. Öntanımlı olarak, asgari/ortalama/azami değerler gösterilir\&. (Geriye uyumluluk)\&. +.TP +\fB-t\fR \fIsaniye\fR +Ölçümleme işleminin ne kadar süreyle uygulanacağı belirtilir\&. Dahili olarak \fB-n 50000\fR seçeneği uygulanır\&. Bunu belli bir süreye göre kıyaslama yapmak amacıyla kullanabilirsiniz\&. Öntanımlı olarak bir süre kısıtlaması yoktur\&. +.TP +\fB-T\fR \fIiçerik-türü\fR +POST/PUT verisi için kullanılacak içerik türü belirtilir\&. Örnek: application/x-www-form-urlencoded\&. Öntanımlı değer: text/plain\&. +.TP +\fB-v\fR \fIayrıntı-düzeyi\fR +Çıktının ayrıntı düzeyi belirtilir\&. 4 ve üstü ile başlıklar hakkında bilgi, 3 ve üstü ile yanıt kodları (404, 200, vb\&.), 2 ve üstü ile ise uyarı ve bilgi iletileri gösterilir\&. +.TP +-u \fIPUT-dosyası\fR +PUT verisini içeren dosya\&. Ayrıca, -T seçeneğini belirtmeyi de unutmayın\&. +.TP +\fB-V\fR +Sürüm bilgilerini gösterir ve çıkar\&. +.TP +\fB-w\fR +Sonuçları HTML tabloları olarak basar\&. Öntanımlı tablo, beyaz artalanlı ve iki sütunludur\&. +.TP +\fB-x\fR \fI-öznitelikleri\fR +
    etiketinde kullanılacak öznitelikler belirtilir\&. Belirtilen öznitelikler etiket içine
    biçeminde yerleştirilir\&. +.TP +\fB-X\fR \fIvekil\fR[:\fIport\fR] +İstekler için bir vekil sunucu kullanılır\&. +.TP +\fB-y\fR \fI-öznitelikleri\fR + etiketinde kullanılacak öznitelikler belirtilir\&. +.TP +\fB-z\fR \fI
    -öznitelikleri\fR + etiketinde kullanılacak öznitelikler belirtilir\&. +.TP +-Z \fIşifre-kümesi\fR +SSL/TLS şifre kümesi belirtilir (\fBopenssl\fR(1) şifrelerine bakınız)\&. + +.SH "ÇIKTI" + +.PP +Aşağıda \fBab\fR tarafından döndürülen değerler açıklanmıştır: + + +.TP +Server Software +İlk başarılı yanıtın, varsa, \fIserver\fR HTTP başlığında döndürülen değer\&. Bu başlıktaki başlangıçtan 32 ondalık değerli karaktere (genellikle boşluk veya CR/LF karakteri) kadar tüm karakterleri içerir\&. +.TP +Server Hostname +Komut satırında belirtilen DNS veya IP adresi\&. +.TP +Server Port +\fBab\fR'nin bağlandığı port\&. Komut satırında port belirtilmemişse, öntanımlı olarak http için 80, https için 443'tür\&. +.TP +SSL/TLS Protocol +İstemci le sunucu arasında uzlaşılmış protokol değerleri\&. Bu sadece SSL kullanılıyorsa çıktılanır\&. +.TP +Document Path +Komut satırı dizgesinden çözümlenen isteğin URI'si\&. +.TP +Document Length +Başarıyla döndürülen ilk belgenin bayt cinsinden uzunluğu\&. Eğer belge uzunluğu sınama sırasında değişirse yanıt bir hata içerecektir\&. +.TP +Concurrency Level +Sınama sırasında kullanılan eşzamanlı istemcilerin sayısı\&. +.TP +Time taken for tests +İlk soket bağlantısının alındığı andan son yanıtın alındığı ana kadar geçen süre\&. +.TP +Complete requests +Alınan başarılı yanıtların sayısı\&. +.TP +Failed requests +Başarısızlık olarak addedilen isteklerin sayısı\&. Sayı sıfırdan büyükse, diğer satırda, bağlanma, okuma, yanlış içerik uzunluğu, istisnalar gibi sebeplerle başarısız olmuş istekler gösterilir\&. +.TP +Write errors +Başarısız yazma hatalarının (kırık boru) sayısı\&. +.TP +Non-2xx responses +200 serisi yanıt kodları ile açıklanamayan yanıtların sayısı\&. Tüm yanıtlar 200 olursa bu alan çıktılanmaz\&. +.TP +Keep-Alive requests +Keep-Alive isteklerinde sonuçlanan bağlantı sayısı\&. +.TP +Total body sent +Sınamanın parçası olarak veri gönderimi yapılandırılmışsa, bu sınama sırasında gönderilen toplam bayt sayısıdır\&. Sınama sırasında gövde gönderilmiyorsa bu alan çıktılanmaz\&. +.TP +Total transferred +Sunucudan alınan toplam bayt sayısı\&. Bu sayı aslında hattan gönderilen bayt sayısıdır\&. +.TP +HTML transferred +Sunucudan alınan belge baytlarının sayısı\&. Bu sayı HTTP başlıklarının bayt sayısını içermez\&. +.TP +Requests per second +Saniyedeki istek sayısı\&. İstek sayısının toplam süreye oranıdır\&. +.TP +Time per request +İstek başına harcanan süre\&. İlk değer eşzamanlılık * süre * 1000 / biten formülüyle hesaplanırken ikincisi için süre * 1000 / biten formülü kullanılır\&. +.TP +Transfer rate +okunantoplam / 1024 / süre formülüyle hesaplanan aktarım hızı\&. + +.SH "BÖRTÜ BÖCEK" + +.PP +Duruk bildirimli sabit uzunlukta çeşitli tamponlar vardır\&. Sunucudan gelen yanıt başlıkları ve diğer harici girdiler, komut satırı argümanları ile birlikte basitçe çözümlenir, bu size can sıkıcı gelebilir\&. + +.PP +HTTP/1\&.x protokolünü tamamen gerçeklemez; sadece yanıtların 'belli başlı' bazı biçimlerini kabul eder\&. Aksi takdirde, \fBstrstr\fR(3) işlevinin yoğun kullanımı nedeniyle sunucu yerine \fBab\fR'nin başarımını ölçerdiniz\&. + diff --git a/docs/man/tr/apachectl.8 b/docs/man/tr/apachectl.8 new file mode 100644 index 0000000..9553bc0 --- /dev/null +++ b/docs/man/tr/apachectl.8 @@ -0,0 +1,95 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "APACHECTL" 8 "2013-04-17" "Apache HTTP Sunucusu" "apachectl" +.nh +.SH İSİM +apachectl \- Apache HTTP Sunucusu Denetim Arayüzü + +.SH "KULLANIM" + +.PP +\fBapachectl\fR önyüz kipinde çalıştığında \fBhttpd\fR programının bütün komut satırı argümanlarını kabul edebilir\&. + +.PP +\fBapachectl\fR [ \fIhttpd-argümanları\fR ] + +.PP +SysV başlatma betiği kipinde ise, \fBapachectl\fR aşağıda tanımlanan basit, tek sözcüklük komutları kabul eder\&. + +.PP +\fBapachectl\fR \fIkomut\fR + + +.SH "ÖZET" + +.PP +\fBapachectl\fR Apache Hiper Metin Aktarım Protokolü (HTTP) sunucusu için bir denetim aracıdır\&. Sistem yöneticisinin Apache \fBhttpd\fR artalan sürecini denetimi altında tutabilmesine yardımcı olmak amacıyla tasarlanmıştır\&. + +.PP +\fBapachectl\fR iki kipte işleyebilir\&. İlkinde, \fBhttpd\fR komutu için basit bir önyüz gibi davranarak, gerekli ortam değişkenlerini atar ve belirtilen komut satırı seçenekleriyle \fBhttpd\fR sürecini başlatır\&. İkinci kipte ise, \fBapachectl\fR bir SysV başlatma betiği olarak \fBstart\fR, \fBrestart\fR, \fBstop\fR gibi tek sözcüklük basit argümanlar alır ve bunları uygun sinyallere dönüştürerek \fBhttpd\fR'ye gönderir\&. + +.PP +Eğer Apache kurulumunuzda standart dışı dosya yolları kullanmışsanız, \fBhttpd\fR programına uygun yolları atamak için \fBapachectl\fR betiğini elden geçirmelisiniz\&. Bu arada gerek gördüğünüz \fBhttpd\fR komut satırı argümanlarını da belirtebilirsiniz\&. Ayrıntılar için betik içindeki açıklamalara bakınız\&. + +.PP +\fBapachectl\fR betiği başarı durumunda 0 çıkış değeri ile döner\&. Bir hata durumunda ise sıfırdan farklı bir değerle döner\&. Daha fazla bilgi için betik içindeki açıklamalara bakınız\&. + + +.SH "SEÇENEKLER" + +.PP +Burada sadece SysV başlatma betiğine özgü seçeneklere yer verilmiştir\&. Diğer argümanlar için \fBhttpd\fR kılavuz sayfasına bakınız\&. + + +.TP +\fBstart\fR +Apache \fBhttpd\fR artalan sürecini başlatır\&. Zaten çalışmaktaysa bir hata verir\&. \fBapachectl -k start\fR komutuna eşdeğerdir\&. +.TP +\fBstop\fR +Apache \fBhttpd\fR artalan sürecini durdurur\&. \fBapachectl -k stop\fR komutuna eşdeğerdir\&. +.TP +\fBrestart\fR +Apache \fBhttpd\fR artalan sürecini yeniden başlatır; çalışmıyorsa çalıştırılır\&. Artalan sürecinin ölü olmadığından emin olmak için yeniden başlatmadan önce \fBconfigtest\fR seçeneği verilmiş gibi yapılandırma dosyaları sınanır\&. \fBapachectl -k restart\fR komutuna eşdeğerdir\&. +.TP +\fBfullstatus\fR +\fBmod_status\fR üzerinden tam bir durum raporu gösterir\&. Bunun çalışması için sunucuda \fBmod_status\fR etkinleştirilmiş olmalı ve sisteminizde \fBlynx\fR gibi bir metin kipi HTTP tarayıcı kurulu olmalıdır\&. Durum raporuna erişmek için kullanılacak adres betik içinde STATUSURL değişkenine atanabilir\&. +.TP +\fBstatus\fR +Özet halinde bir durum raporu gösterir\&. O an sunulmakta olan isteklerin gösterilmemesi dışında \fBfullstatus\fR seçeneği gibidir\&. +.TP +\fBgraceful\fR +Apache \fBhttpd\fR artalan sürecini \fInazikçe\fR yeniden başlatır; çalışmıyorsa çalıştırılır\&. O an hizmet sunmakta olan çocuk süreçleri hemen durdurmaması dışında normal yeniden başlatma gibidir\&. Bir yan etki olarak eski günlük dosyaları hemen kapatılmaz\&. Yani, günlük dosyalarını döndüren bir betik kullanıyorsanız yenilerini başlatmadan önce eski dosyaların tamamen kapandığından emin olmak için belli bir süre beklemeniz gerekecektir\&. Artalan sürecinin ölü olmadığından emin olmak için yeniden başlatmadan önce \fBconfigtest\fR seçeneği verilmiş gibi yapılandırma dosyaları sınanır\&. \fBapachectl -k graceful\fR komutuna eşdeğerdir\&. +.TP +\fBgraceful-stop\fR +Apache \fBhttpd\fR artalan sürecini \fInazikçe\fR durdurur\&. O an hizmet sunmakta olan çocuk süreçleri hemen durdurmaması dışında normal durdurma gibidir\&. Bir yan etki olarak eski günlük dosyaları hemen kapatılmaz\&. \fBapachectl -k graceful-stop\fR komutuna eşdeğerdir\&. +.TP +\fBconfigtest\fR +Yapılandırma dosyasında sözdizimi denetimi yapılmasını sağlar\&. Yapılandırma dosyaları çözümlenir ve bir sorun yoksa bir Syntax Ok raporu verilir fakat, bir hata varsa o hataya ilişkin ayrıntılı bilgi verilir\&. \fBapachectl -t\fR komutuna eşdeğerdir\&. + +.PP +Aşağıdaki seçenek eski sürümlerde kullanılmaktaydı, fakat artık kullanılmamaktadır\&. + + +.TP +startssl +\fBhttpd\fR programını SSL destekli başlatmak için, yapılandırma dosyanızı ilgili yönergeleri içermesi için elden geçirmeli ve normal \fBapachectl start\fR komutunu kullanmalısınız\&. + diff --git a/docs/man/tr/apxs.1 b/docs/man/tr/apxs.1 new file mode 100644 index 0000000..75216e5 --- /dev/null +++ b/docs/man/tr/apxs.1 @@ -0,0 +1,251 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "APXS" 1 "2013-08-16" "Apache HTTP Sunucusu" "apxs" +.nh +.SH İSİM +apxs \- Apache Eklenti Aracı + +.SH "KULLANIM" + +.PP +\fBapxs\fR -\fBg\fR [ -\fBS\fR \fIisim=değer\fR ] -\fBn\fR \fImodüladı\fR + +.PP +\fBapxs\fR -\fBq\fR [ -\fBv\fR ] [ -\fBS\fR \fIisim=değer\fR ] \fIsorgu\fR \&.\&.\&. + +.PP +\fBapxs\fR -\fBc\fR [ -\fBS\fR \fIisim=değer\fR ] [ -\fBo\fR \fIdso-dosyası\fR ] [ -\fBI\fR \fIinclude-dizini\fR ] [ -\fBD\fR \fIisim=değer\fR ] [ -\fBL\fR \fIlib-dizini\fR ] [ -\fBl\fR \fIkütüphane-adı\fR ] [ -\fBWc,\fR\fIderleyici-seçenekleri\fR ] [ -\fBWl,\fR\fIilintileyici-seçenekleri\fR ] [ -\fBp\fR ] \fIdosya\fR \&.\&.\&. + +.PP +\fBapxs\fR -\fBi\fR [ -\fBS\fR \fIisim=değer\fR ] [ -\fBn\fR \fImodüladı\fR ] [ -\fBa\fR ] [ -\fBA\fR ] \fIdso-dosyası\fR \&.\&.\&. + +.PP +\fBapxs\fR -\fBe\fR [ -\fBS\fR \fIisim=değer\fR ] [ -\fBn\fR \fImodüladı\fR ] [ -\fBa\fR ] [ -\fBA\fR ] \fIdso-dosyası\fR \&.\&.\&. + + +.SH "ÖZET" + +.PP +\fBapxs\fR, Apache Hiper Metin Aktarım Protokolü (HTTP) sunucusu için ek modül derleme ve kurulum aracıdır\&. Bu araç sayesinde, bir veya daha fazla kaynak veya nesne \fIdosya\fRsından bir devingen paylaşımlı nesne (DSO - "Dynamic Shared Object" kısaltması) derlemek ve bu nesneyi (modülü) Apache sunucusuna çalışma anında \fBmod_so\fR modülünün \fBLoadModule\fR yönergesi üzerinden yüklemek mümkün olmaktadır\&. + +.PP +Bu eklenti mekanizmasını platformunuzda kullanmak için DSO desteğinin olması ve \fBhttpd\fR programının \fBmod_so\fR modülünü içerecek şekilde derlenmiş olması gerekir\&. Eğer bunlar mevcut değilse \fBapxs\fR aracı durumu size bildirecektir\&. Bunu aşağıdaki komutla kendiniz de sınayabilirsiniz: + +.nf + + $ httpd -l + +.fi + +.PP +\fBmod_so\fR modülü gösterilen listede yer almalıdır\&. Bu gereksinimler sağlandığı takdirde \fBapxs\fR aracı sayesinde DSO mekanizması üzerinden kendi modüllerinizi kurmak suretiyle Apache sunucunuzun işlevselliğini kolayca arttırabilirsiniz\&. Örnek bir uygulama: + +.nf + + $ apxs -i -a -c mod_foo\&.c + gcc -fpic -DSHARED_MODULE -I/dosya/yolu/apache/include -c mod_foo\&.c + ld -Bshareable -o mod_foo\&.so mod_foo\&.o + cp mod_foo\&.so /dosya/yolu/apache/modules/mod_foo\&.so + chmod 755 /dosya/yolu/apache/modules/mod_foo\&.so + [`foo' modülü /dosya/yolu/apache/etc/httpd\&.conf'ta etkinleştiriliyor] + $ apachectl restart + /dosya/yolu/apache/sbin/apachectl restart: httpd not running, trying to start + [Tue Mar 31 11:27:55 1998] [debug] mod_so\&.c(303): loaded module foo_module + /dosya/yolu/apache/sbin/apachectl restart: httpd started + $ _ + +.fi + +.PP +\fIdosya\fR olarak bir C kaynak dosyası (\&.c), bir nesne dosyası (\&.o) ve hatta bir kütüphane arşivi archive (\&.a) belirtebilirsiniz\&. \fBapxs\fR aracı bu dosya uzantılarını tanıdığından C dosyalarını derleme işleminden, arşiv ve nesne dosyalarını ise doğrudan ilintileme işleminden geçirir\&. Fakat böyle önceden derlenmiş nesne dosyalarını kullanırken, devingen paylaşımlı nesne olarak kullanılmalarını sağlamak üzere konumdan bağımsız kod (PIC) üretecek şekilde derlenmiş olduklarından emin olmalısınız\&. Örneğin GCC'yi bunun için daima \fB-fpic\fR seçeneği ile kullanmalısınız\&. Diğer C derleyiciler için, \fBapxs\fR'in nesne dosyalarını derlerken kullanacağı seçenekleri öğrenmek için o derleyicilerin kılavuz sayfalarına bakınız\&. + +.PP +Apache'deki DSO desteği ile ilgili daha ayrıntılı bilgi edinmek için \fBmod_so\fR belgesini okumakla yetinmeyip src/modules/standard/mod_so\&.c kaynak dosyasını da okuyunuz\&. + + +.SH "SEÇENEKLER" + +.SS "Ortak Seçenekler" + + +.TP +\fB-n\fR \fImodüladı\fR +\fB-i\fR (kurulum) ve \fB-g\fR (şablon üretimi) seçenekleri için modül ismi belirtmek amacıyla kullanılır\&. Bir modül ismi belirtmek için bu seçeneği kullanın\&. \fB-g\fR seçeneği için bu gereklidir\&. \fB-i\fR seçeneği için ise araç, modül ismini kaynağın ismine bakarak veya (son çare olarak) dosya isminden tahmin etmeye çalışarak saptamaya çalışır\&. + +.SS "Sorgu Seçenekleri" + + +.TP +\fB-q\fR \fIsorgu\fR +httpd'yi derlemekte kullanılacak değişkenler ve ortam ayarları için bir sorgu gerçekleştirir\&. When invoked without \fIsorgu\fR belirtilmeksizin çağrıldığında, bilinen değişkenleri değerleriyle birlikte basar\&. İsteğe bağlı \fB-v\fR seçeneği liste çıktısını biçemler\&. .PP Modülünüzü yükleyecek \fBhttpd\fR'yi derlemek için kullanılacak ayarları elle belirtmek için kullanılır\&. Örneğin, Apache'nin C başlık dosyalarının yerini kendi Makefile dosyalarınızın içinde şöyle belirtebilirsiniz: INC=-I`apxs -q INCLUDEDIR` + +.SS "Yapılandırma Seçenekleri" + + +.TP +\fB-S\fR \fIisim=değer\fR +Bu seçenek yukarıda açıklanan \fBapxs\fR ayarlarını değiştirir\&. + +.SS "Şablon Üretme Seçenekleri" + + +.TP +\fB-g\fR +\fImodüladı\fR (\fB-n\fR seçeneğine bakınız) adında bir alt dizin oluşturur ve içine iki dosya yerleştirir: Kendi modülünüzü oluşturabilmeniz için veya \fBapxs\fR mekanizmaları ile hemen oynamaya başlayabilmeniz için mod_\fImodüladı\fR\&.c adında bir modül kaynak dosyası örneği ve bu modülü derleyip kurmayı kolaylaştırmak için bir Makefile dosyası\&. + +.SS "DSO Derleme Seçenekleri" + + +.TP +\fB-c\fR +Bu seçenek derleme yapılacağını belirtir\&. Önce belirtilen C kaynak \fIdosyalar\fRını (\&.c), nesne dosyalarını (\&.o) elde etmek için derler\&. Sonra bunları kalan nesne dosyaları (\&.o ve \&.a) ile ilintileyerek \fIdso-dosyası\fR adında bir devingen paylaşımlı nesne oluşturur\&. Eğer \fB-o\fR seçeneği ile modül ismi belirtilmemişse \fIdosyalar\fR arasındaki ilk dosyanın ismine bakarak dosya ismi tahmin edilmeye çalışılır ve mod_\fIisim\fR\&.so dosya adı bu isimden elde edilir\&. +.TP +\fB-o\fR \fIdso-dosyası\fR +Oluşturulacak devingen paylaşımlı nesnenin ismini belirtmek için kullanılır\&. Modül ismi bu seçenekle belirtilmez ve \fIdosya\fR listesinden bir isim tahmini de yapılamazsa son çare olarak mod_unknown\&.so ismi kullanılır\&. +.TP +\fB-D\fR \fIisim=değer\fR +Bu seçenek doğrudan derleme komutlarına aktarılır\&. Bu seçeneği derleme işlemine kendi tanımlarınızı belirtmek için kullanın\&. +.TP +\fB-I\fR \fIinclude-dizini\fR +Bu seçenek doğrudan derleme komutlarına aktarılır\&. Bu seçeneği derleme işleminde kullanılmak üzere kendi başlık dosyalarınızı içeren dizinleri arama yollarına eklemek için kullanın\&. +.TP +\fB-L\fR \fIlib-dizini\fR +Bu seçenek doğrudan derleme komutlarına aktarılır\&. Bu seçeneği derleme işleminde kullanılmak üzere kendi kütüphane dizinlerinizi arama yollarına eklemek için kullanın\&. +.TP +\fB-l\fR \fIkütüphane-adı\fR +Bu seçenek doğrudan derleme komutlarına aktarılır\&. Bu seçeneği derleme işleminde kullanılmak üzere kendi kütüphanelerinizi arama yollarına eklemek için kullanın\&. +.TP +\fB-Wc\fR,\fIderleyici-seçenekleri\fR +Bu seçenek libtool --mode=compile komutuna doğrudan seçenek aktarmak için kullanılır\&. Bu seçeneği yerel derleyiciniz için gereken ek seçenekleri belirtmek için kullanın\&. +.TP +\fB-Wl\fR,\fIilintileyici-seçenekleri\fR +Bu seçenek libtool --mode=link komutuna doğrudan seçenek aktarmak için kullanılır\&. Bu seçeneği yerel ilintileyiciniz için gereken ek seçenekleri belirtmek için kullanın\&. +.TP +\fB-p\fR +Bu seçenek apxs'in apr/apr-util kütüphaneleriyle ilintilenmesini sağlar\&. apr/apr-util kütüphanelerini kullanan yardımcı uygulamaları derlerken yararlıdır\&. + +.SS "DSO Kurulum ve Yapılandırma Seçenekleri" + + +.TP +\fB-i\fR +Kurulum işlemini belirtir ve devingen olarak paylaşımlı nesneleri sunucunun \fImodules\fR dizinine kurar\&. +.TP +\fB-a\fR +İlgili LoadModule satırını Apache'nin httpd\&.conf yapılandırma dosyasına özdevinimli olarak ekleyerek veya böyle bir satır varsa bunu etkin kılarak modülü etkinleştirir\&. +.TP +\fB-A\fR +\fBLoadModule\fR yönergesini daha sonra etkinleştirmek üzere satırın başına bir diyez imi (#) yerleştirmesi dışında \fB-a\fR seçeneği ile aynıdır\&. +.TP +\fB-e\fR +Modülü kurmaya çalışmaksızın Apache'nin httpd\&.conf yapılandırma dosyasını \fB-i\fR işlemine benzer şekilde \fB-a\fR ve \fB-A\fR seçenekleri ile düzenleme işlemini belirtir\&. + +.SH "ÖRNEKLER" + +.PP +Apache'nin sunucu işlevselliğini genişletmek amacıyla kullanacağınız mod_foo\&.c adında bir Apache modülünüz olduğunu varsayalım\&. Öncelikle, C kaynak dosyasını, Apache sunucusuna çalışma anında yüklenmeye uygun bir paylaşımlı nesne olarak derlemeniz gerekir\&. Bunu sağlamak için şu komutları vermelisiniz: + +.nf + + $ apxs -c mod_foo\&.c + /dosya/yolu/libtool --mode=compile gcc \&.\&.\&. -c mod_foo\&.c + /dosya/yolu/libtool --mode=link gcc \&.\&.\&. -o mod_foo\&.la mod_foo\&.slo + $ _ + +.fi + +.PP +Bundan sonra, Apache yapılandırmanızın bu paylaşımlı nesneyi yüklemek için bir \fBLoadModule\fR yönergesi içermesini sağlamalısınız\&. \fBapxs\fR bu adımı basitleştirmek amacıyla, paylaşımlı nesneyi sunucunun \fImodules\fR dizinine özdevinimli olarak kurmak ve httpd\&.conf dosyasını buna uygun olarak güncellemek için bir yol sağlar\&. Bu sonuç şöyle elde edilebilir: + +.nf + + $ apxs -i -a mod_foo\&.la + /dosya/yolu/instdso\&.sh mod_foo\&.la /path/to/apache/modules + /dosya/yolu/libtool --mode=install cp mod_foo\&.la /dosya/yolu/apache/modules + \&.\&.\&. + chmod 755 /dosya/yolu/apache/modules/mod_foo\&.so + [`foo' modülü /dosya/yolu/apache/conf/httpd\&.conf'da etkinleştiriliyor] + $ _ + +.fi + +.PP +Yapılandıma dosyasına (eğer yoksa) şu satır eklenir: + +.nf + + LoadModule foo_module modules/mod_foo\&.so + +.fi + +.PP +Bunu öntanımlı olarak iptal etmek isterseniz \fB-A\fR seçeneğini kullanmanız gerekir: + +.nf + + $ apxs -i -A mod_foo\&.c + +.fi + +.PP +\fBapxs\fR mekanizmalarını hızlıca denemek için örnek bir Apache modül şablonunu ve bir Makefile dosyasını şöyle oluşturabilirsiniz: + +.nf + + $ apxs -g -n foo + Creating [DIR] foo + Creating [FILE] foo/Makefile + Creating [FILE] foo/modules\&.mk + Creating [FILE] foo/mod_foo\&.c + Creating [FILE] foo/\&.deps + $ _ + +.fi + +.PP +Ardından bu örnek modülü bir paylaşımlı nesne olarak derleyip Apache sunucusuna yükleyebilirsiniz: + +.nf + + $ cd foo + $ make all reload + apxs -c mod_foo\&.c + /dosya/yolu/libtool --mode=compile gcc \&.\&.\&. -c mod_foo\&.c + /dosya/yolu/libtool --mode=link gcc \&.\&.\&. -o mod_foo\&.la mod_foo\&.slo + apxs -i -a -n "foo" mod_foo\&.la + /dosya/yolu/instdso\&.sh mod_foo\&.la /dosya/yolu/apache/modules + /dosya/yolu/libtool --mode=install cp mod_foo\&.la /dosya/yolu/apache/modules + \&.\&.\&. + chmod 755 /dosya/yolu/apache/modules/mod_foo\&.so + [`foo' modülü /dosya/yolu/apache/conf/httpd\&.conf'ta etkinleştiriliyor] + apachectl restart + /dosya/yolu/apache/sbin/apachectl restart: httpd not running, trying to start + chmod 755 /dosya/yolu/apache/modules/mod_foo\&.so + [`foo' modülü /dosya/yolu/apache/etc/httpd\&.conf'ta etkinleştiriliyor] + apachectl restart + /dosya/yolu/apache/sbin/apachectl restart: httpd not running, trying to start + [Tue Mar 31 11:27:55 1998] [debug] mod_so\&.c(303): loaded module foo_module + /dosya/yolu/apache/sbin/apachectl restart: httpd started + $ _ + +.fi + diff --git a/docs/man/tr/dbmmanage.1 b/docs/man/tr/dbmmanage.1 new file mode 100644 index 0000000..4e4b17c --- /dev/null +++ b/docs/man/tr/dbmmanage.1 @@ -0,0 +1,121 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "DBMMANAGE" 1 "2013-04-17" "Apache HTTP Sunucusu" "dbmmanage" +.nh +.SH İSİM +dbmmanage \- DBM biçemli kullanıcı kimlik doğrulama dosyalarını yönetir + +.SH "KULLANIM" + +.PP +\fBdbmmanage\fR [ \fIkodlama\fR ] \fIdosyaismi\fR add|adduser|check|delete|update \fIkullanıcı\fR [ \fIşifreli_parola\fR [ \fIgrup\fR[,\fIgrup\fR\&.\&.\&.] [ \fIaçıklama\fR ] ] ] + +.PP +\fBdbmmanage\fR \fIdosyaismi\fR view [ \fIkullanıcı\fR ] + +.PP +\fBdbmmanage\fR \fIdosyaismi\fR import + + +.SH "ÖZET" + +.PP +\fBdbmmanage\fR, mod_authn_dbm üzerinden HTTP kullanıcılarının temel kimlik doğrulaması için kullanıcı isimlerinin ve parolalarının saklanmasında kullanılacak DBM dosyalarını oluşturmak ve güncellemek için kullanılır\&. Apache HTTP sunucusunun mevcut özkaynaklarının kullanımı sadece \fBdbmmanage\fR tarafından oluşturulan dosyalarda listelenmiş kullanıcılara tahsis edilebilir\&. Bu program sadece, kullanıcı isimleri bir DBM dosyasında saklanmak istenirse işe yarar\&. Düz metin bir veritabanı kullanmak isterseniz \fBhtpasswd\fR sayfasına bakınız\&. + +.PP +DBM parola veritabanı sağlayan diğer bir araç da \fBhtdbm\fR'dir\&. + +.PP +Bu kılavuz sayfası sadece komut satırı değiştirgelerini listeler\&. Kullanıcı kimlik doğrulamasını \fBhttpd\fR'de yapılandırmak için gerekli yönergelerle ilgili ayrıntılar için Apache dağıtımının bir parçası olan ve http://httpd\&.apache\&.org/ adresinde de bulunan Apache HTTP Sunucusu Belgelerine bakınız\&. + + +.SH "SEÇENEKLER" + + +.TP +\fIdosyaismi\fR +DBM dosyasının ismi\&. Genellikle, \&.db, \&.pag veya \&.dir eklentisi olmaksızın belirtilir\&. +.TP +\fIkullanıcı\fR +İşlemleri gerçekleştirecek kullanıcı ismi\&. \fIkullanıcı\fR ismi ikinokta imi (:) içeremez\&. +.TP +\fIşifreli_parola\fR +\fBupdate\fR ve \fBadd\fR komutları için kullanılacak şifreli paroladır\&. Parolanın istenmesini sağlamak, fakat hemen ardından alanları doldurmak için bir tire imi (-) kullanabilirsiniz\&. Buna ek olarak, \fBupdate\fR komutunu kullanırken özgün parolaya dokunulmaması için bir nokta imi (\&.) kullanabilirsiniz\&. +.TP +\fIgrup\fR +Kullanıcının üyesi olduğu grup\&. Grup ismi ikinokta imi (:) içeremez\&.Kullanıcıyı bir gruba atamadan açıklama alanını doldurmak istiyorsanız bir tire imi (-) kullanabilirsiniz\&. Buna ek olarak, \fBupdate\fR komutunu kullanırken özgün gruba dokunulmaması için bir nokta imi (\&.) kullanabilirsiniz\&. +.TP +\fIaçıklama\fR +Adı ve soyadı, eposta adresi gibi kullanıcıyla ilgili bir takım bilgiler buraya yazılır\&. Sunucu bu alanı gözardı eder\&. + +.SS "Kodlamalar" + + +.TP +\fB-d\fR +CRYPT şifrelemesi (Win32 ve Netware hariç, öntanımlı) +.TP +\fB-m\fR +MD5 şifrelemesi (Win32 ve Netware için öntanımlı) +.TP +\fB-s\fR +SHA1 şifrelemesi +.TP +\fB-p\fR +düz metin (\fIönerilmez\fR) + +.SS "Komutlar" + + +.TP +\fBadd\fR +\fIşifreli_parola\fR'yı kullanarak \fIdosyaismi\fR dosyasına \fIkullanıcı\fR için bir girdi ekler\&. dbmmanage passwords\&.dat add rbowen foKntnEF3KSXA +.TP +\fBadduser\fR +Parola sorduktan sonra \fIdosyaismi\fR dosyasına \fIkullanıcı\fR için bir girdi ekler\&. dbmmanage passwords\&.dat adduser krietz +.TP +\fBcheck\fR +Parola sorduktan sonra belirtilen \fIkullanıcı\fR, \fIdosyaismi\fR dosyasında var mı diye bakar; varsa belirtilen parolayı kullanıcınınkiyle eşleştirmeye çalışır\&. dbmmanage passwords\&.dat check rbowen +.TP +\fBdelete\fR +\fIdosyaismi\fR dosyasından \fIkullanıcı\fR girdisini siler\&. dbmmanage passwords\&.dat delete rbowen +.TP +\fBimport\fR +Standart girdiden \fIkullanıcı\fR:\fIparola\fR satırlarını (her satırda bir tane) okur ve bunları \fIdosyaismi\fR dosyasına ekler\&. Parola şifrelenmiş olmalıdır\&. +.TP +\fBupdate\fR +Belirtilen \fIkullanıcı\fR'nın \fIdosyaismi\fR dosyasında mevcut olması dışında \fBadduser\fR komutu gibidir\&. dbmmanage passwords\&.dat update rbowen +.TP +\fBview\fR +Sadece, DBM dosyasının içeriğini gösterir\&. Bir \fIkullanıcı\fR belirtirseniz sadece o kaydı gösterir\&. dbmmanage passwords\&.dat view + +.SH "HATALAR" + +.PP +Birden fazla DBM dosya biçemi vardır ve büyük bir olasılıkla da sisteminizde bu birden fazla biçemle ilgili kütüphaneler vardır\&. SDBM, NDBM, GNU'nun GDBM projesi ve Berkeley DB 2 bunların başlıcalarıdır\&. Ne yazık ki, bu kütüphanelerin her birinin dosya biçimleri farklıdır\&. Bu bakımdan, \fIdosyaismi\fR dosyasında kullanılan dosya biçeminin \fBdbmmanage\fR tarafından kullanılanla aynı biçemde olduğundan emin olmalısınız\&. \fBdbmmanage\fR hangi tür DBM dosyasına baktığını saptayacak yeterliliğe sahip değildir\&. Yanlış biçemli bir dosya belirtirseniz hiçbir şey dönmeyebileceği gibi, başka isimde bir DBM dosyasının oluşturulması veya daha da kötüsü üzerine yazmaya çalışıyorsanız DBM dosyasının bozulması bile olasıdır\&. + +.PP +\fBdbmmanage\fR programının başlangıcında @AnyDBM::ISA dizisi olarak tanımlanmış DBM biçem tercihlerinin bir listesi vardır\&. Berkeley DB 2 biçemini tercih ettiğimizden \fBdbmmanage\fR sistem kütüphanelerini şu sıraya göre arar: Berkeley DB 2, NDBM, GDBM ve SDBM\&. \fBdbmmanage\fR DBM dosyası hareketleri için bu sıralamaya göre bulduğu ilk kütüphaneyi kullanacaktır\&. Sıralama Perl'deki dbmopen() çağrısının kullandığından faklı olduğu gibi Perl'deki standart @AnyDBM::ISA sıralamasından da oldukça farklıdır\&. Bu bakımdan, DBM dosyalarınızı yönetmek için Perl ile yazılmış başka araçlar kullanıyorsanız, onların da bu tercih sırasını izlemesini sağlamalısınız\&. Benzer şekilde, bu dosyalara erişmek için diğer dillerde (C gibi) yazılmış programlar kullanıyorsanız bunlar için de aynı durum geçerlidir\&. + +.PP +Unix sistemlerinde, kullanılan DBM dosyasının biçemini öğrenmek için \fBfile\fR programı kullanılabilir\&. + diff --git a/docs/man/tr/fcgistarter.8 b/docs/man/tr/fcgistarter.8 new file mode 100644 index 0000000..bb1aad5 --- /dev/null +++ b/docs/man/tr/fcgistarter.8 @@ -0,0 +1,59 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "FCGİSTARTER" 8 "2013-11-22" "Apache HTTP Sunucusu" "fcgistarter" +.nh +.SH İSİM +fcgistarter \- Bir FastCGI programını çalıştır + +.SH "KULLANIM" + +.PP +\fBfcgistarter\fR -\fBc\fR \fIkomut\fR -\fBp\fR \fIport\fR [ -\fBi\fR \fIarabirim\fR ] -\fBN\fR \fIsayı\fR + + +.SH "ÖZET" + +.PP + + + +.SH "BİLGİNİZE" + +.PP +Şimdilik sadece Unix sistemlerinde çalışmaktadır\&. + +.SH "SEÇENEKLER" + + +.TP +\fB-c\fR \fIkomut\fR +Çalıştırılacak FastCGI programı +.TP +\fB-p\fR \fIport\fR +Programın dinleyeceği port +.TP +\fB-i\fR \fIarabirim\fR +Programın dinleyeceği arabirim +.TP +\fB-N\fR \fIsayı\fR +Program örneklerinin sayısı + diff --git a/docs/man/tr/htcacheclean.8 b/docs/man/tr/htcacheclean.8 new file mode 100644 index 0000000..010dca2 --- /dev/null +++ b/docs/man/tr/htcacheclean.8 @@ -0,0 +1,146 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "HTCACHECLEAN" 8 "2013-04-17" "Apache HTTP Sunucusu" "htcacheclean" +.nh +.SH İSİM +htcacheclean \- Disk arabelleğini temizler + +.SH "KULLANIM" + +.PP +\fBhtcacheclean\fR [ -\fBD\fR ] [ -\fBv\fR ] [ -\fBt\fR ] [ -\fBr\fR ] [ -\fBn\fR ] [ -\fBR\fR\fIboyut\fR ] -\fBp\fR\fIyol\fR [ -\fBl\fR\fIsınır\fR | -\fBL\fR\fIlimit\fR ] + +.PP +\fBhtcacheclean\fR [ -\fBn\fR ] [ -\fBt\fR ] [ -\fBi\fR ] [ -\fBP\fR\fIpiddosyası\fR ] [ -\fBR\fR\fIboyut\fR ] -\fBd\fR\fIsüre\fR -\fBp\fR\fIyol\fR [ -\fBl\fR\fIsınır\fR | -\fBL\fR\fIlimit\fR ] + +.PP +\fBhtcacheclean\fR [ -\fBv\fR ] [ -\fBR\fR\fIboyut\fR ] -\fBp\fR\fIyol\fR [ -\fBa\fR ] [ -\fBA\fR ] + +.PP +\fBhtcacheclean\fR [ -\fBD\fR ] [ -\fBv\fR ] [ -\fBt\fR ] [ -\fBR\fR\fIboyut\fR ] -\fBp\fR\fIyol\fR \fIurl\fR + + +.SH "ÖZET" + +.PP +\fBhtcacheclean\fR, mod_cache_disk deposunun boyutlarını belli sınırlar içinde veya kullanımdaki dosya düğümlerinin sınırları içinde tutmak için kullanılır\&. Bu araç ya elle ya da bir artalan süreci olarak çalıştırılır\&. Artalan süreci olarak çalıştırıldığında, silinecek arabellek içeriğini tespit etmek için arabellek dizinlerine belli aralıklarla bakmak dışında uykuda olur\&. Artalan sürecini temiz olarak durdurmak için TERM veya INT sinyali göndermeniz yeterlidir\&. Elle çalıştırıldığında, silinecek arabellek içeriğini tespit etmek için arabellek dizinlerine bir kereliğine bakar\&. Bir veya daha fazla URL belirtilmesi durumunda arabellekte olanlar arabellekten silinir\&. + + +.SH "SEÇENEKLER" + + +.TP +\fB-d\fR\fI süre\fR +Artalanda çalışarak \fIsüre\fR dakikada bir arabelleği temizler\&. Bu seçenek \fB-D\fR, \fB-v\fR ve \fB-r\fR seçenekleri ile birlikte kullanılamaz\&. Artalan sürecini temiz olarak sonlandırmak için SIGTERM veya SIGINT göndermek yeterlidir\&. +.TP +\fB-D\fR +Kuru kuruya çalışıp, hiçbir şeyi silmez\&. \fB-d\fR seçeneği ile birlikte kullanılamaz\&. Kuru çalıştırma sırasında \fB-t\fR seçeneği ile dizinler silinmek istenirse, statlarda silinmiş görünen dosya düğümleri silinmiş dizinler olarak hesaba katılmaz ve tahmini olarak imlenir\&. +.TP +\fB-v\fR +Çıktı daha ayrıntılı olur\&. \fB-d\fR seçeneği ile birlikte kullanılamaz\&. +.TP +\fB-r\fR +İyice temizlik yapılır\&. Bunun için Apache HTTP sunucusunun çalışmadığı varsayılır (aksi takdirde arabellek içeriği bozulabilir)\&. \fB-t\fR seçeneğinin de uygulanmasını sağlar\&. \fB-d\fR seçeneği ile birlikte kullanılamaz\&. +.TP +\fB-n\fR +Nazik olur\&. Diğer süreçlerin yararına daha yavaş çalışır\&. (a) disk G/Ç işlemlerinde gecikmeler olursa ve (b) çekirdek bu arada başka bir süreci öne çekmişse \fBhtcacheclean\fR uyumayı tercih edecektir\&. +.TP +\fB-t\fR +Tüm boş dizinleri siler\&. Öntanımlı olarak, sadece arabellek dosyaları silinirse de bazı yapılandırmalarda büyük miktarda dizin oluşturulması bu seçeneğin kullanılmasını gerektirebilir\&. Yapılandırmanız çok sayıda dizin gerektiriyorsa ve dosya düğümlerinin veya dosya ayırma tablolarının tükenmesi sözkonusu ise bu seçeneğin kullanılması önerilir\&. +.TP +\fB-p\fR\fI yol\fR +\fIyol\fR, disk arabelleğinin kök dizini olarak belirtilir\&. CacheRoot yönergesinde belirtilen dizin olmalıdır\&. +.TP +\fB-P\fR\fIpiddosyası\fR +Artalan süreci olarak çalışmada süreç kimliğinin yazılacağı dosyanın adını belirtmek için kullanılır\&. +.TP +\fB-R\fR\fIboyut\fR +Disk bloklarının boyunu denkleştirmek için yuvarlanacak üst boyutu belirtmekte kullanılır\&. Arabellek bölümünün blok boyutunu belirler\&. +.TP +\fB-l\fR\fI sınır\fR +\fIsınır\fR, disk arabelleğinin toplam boyutu olarak belirtilir\&. Değerin öntanımlı olarak bayt cinsinden belirtileceği varsayılır\&. Değerin sonuna kilobayt için K, megabayt M, bayt için B harfi konulabilir\&. +.TP +\fB-L\fR\fIlimit\fR +Disk arabellek dosyası düğümü toplamının sınırını belirlemekte kullanılır\&. +.TP +\fB-i\fR +Akıllı olup sadece disk arabelleği değiştiği zaman çalışır\&. Bu seçenek \fB-d\fR seçeneği ile birlikte belirtilmek zorundadır\&. +.TP +\fB-a\fR +O an arabellekte saklanmakta olan URL'leri listeler\&. Birden fazla aynı URL varsa yalnız biri listelenir\&. +.TP +\fB-A\fR +O an arabellekte saklanmakta olan URL'leri öznitelikleri ile listeler\&. Öznitelikler şu sırayla verilir: url, header size, body size, status, entity version, date, expiry, request time, response time, body present, head request + +.SH "BELLİ BİR URL'NİN SİLİNMESİ" + +.PP +\fBhtcacheclean\fR tarafından aktarılan URL'ler arabellekten silinir\&. Bir URL birden fazla mevcutsa hepsi silinir\&. + +.PP +Ters vekilli bir URL silinmişse, etkin URL \fBHost\fR başlığı \fBport\fR, \fByol\fR ve \fBsorgu\fR ile oluşturulur\&. Bir sorgu dizgesi olsun olmasın, URL içinde '?' daima açıkça belirtilmelidir\&. Örneğin, \fBlocalhost\fR sunucusundaki \fB/\fR yolu silinmek istenirse silinecek URL \fBhttp://localhost:80/?\fR olurdu\&. + +.SH "ARABELLEKTEKİ URL'LERİN LİSTELENMESİ" + +.PP +\fBhtcacheclean\fR'e \fB-a\fR veya \fB-A\fR seçeneğinin aktarılmasıyla, arabellekteki URL'ler bulundukça her satıra bir URL gelecek biçemde listelenir\&. \fB-A\fR seçeneği URL'nin ardından arabellek içeriğini tamamını şu sırayla dökümler: + + +.TP +url +Öğenin URL'si\&. +.TP +header size +Bayt cinsinden başlık uzunluğu\&. +.TP +body size +Bayt cinsinden gövde uzunluğu\&. +.TP +status +Arabellekteki yanıtın durumu\&. +.TP +entity version +Öğenin silinmeksizin kaç kere doğrulandığı\&. +.TP +date +Yanıt tarihi\&. +.TP +expiry +Yanıtın zaman aşımı tarihi\&. +.TP +request time +İsteğin başlama zamanı\&. +.TP +response time +İsteğin bitiş zamanı\&. +.TP +body present +0 ise istekle birlikte gövde saklanmaz, 1 ise saklanır\&. +.TP +head request +1 ise, öğe, gövde olmaksızın arabellekli bir HEAD isteği içerir, 0 ise içermez\&. + +.SH "ÇIKIŞ DURUMU" + +.PP +\fBhtcacheclean\fR, tüm işlemler başarıyla yerine getirildiğinde 0, aksi takdirde 1 döndürür\&. Bir URL belirtildiğinde, bu URL arablleklenmi ve silinmişse 0, aksi takdirde 2 döndürür\&. URL'nin silinmesi sırasında bir hata oluşursa 1 döndürür\&. + diff --git a/docs/man/tr/htdbm.1 b/docs/man/tr/htdbm.1 new file mode 100644 index 0000000..ddd216b --- /dev/null +++ b/docs/man/tr/htdbm.1 @@ -0,0 +1,187 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "HTDBM" 1 "2013-04-17" "Apache HTTP Sunucusu" "htdbm" +.nh +.SH İSİM +htdbm \- DBM parola veritabanlarını yönetir + +.SH "KULLANIM" + +.PP +\fBhtdbm\fR [ -\fBT\fR\fIVTtürü\fR ] [ -\fBi\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIbedel\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIparola-dosyası\fR \fIkullanıcı\fR + +.PP +\fBhtdbm\fR -\fBb\fR [ -\fBT\fR\fIVTtürü\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIbedel\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIparola-dosyası\fR \fIkullanıcı\fR \fIparola\fR + +.PP +\fBhtdbm\fR -\fBn\fR [ -\fBi\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIbedel\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIkullanıcı\fR + +.PP +\fBhtdbm\fR -\fBnb\fR [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIbedel\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIkullanıcı\fR \fIparola\fR + +.PP +\fBhtdbm\fR -\fBv\fR [ -\fBT\fR\fIVTtürü\fR ] [ -\fBi\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIbedel\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIparola-dosyası\fR \fIkullanıcı\fR + +.PP +\fBhtdbm\fR -\fBvb\fR [ -\fBT\fR\fIVTtürü\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIbedel\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIparola-dosyası\fR \fIkullanıcı\fR \fIparola\fR + +.PP +\fBhtdbm\fR -\fBx\fR [ -\fBT\fR\fIVTtürü\fR ] \fIparola-dosyası\fR \fIkullanıcı\fR + +.PP +\fBhtdbm\fR -\fBl\fR [ -\fBT\fR\fIVTtürü\fR ] + + +.SH "ÖZET" + +.PP +\fBhtdbm\fR, mod_authn_dbm üzerinden HTTP kullanıcılarının temel kimlik doğrulaması için kullanıcı isimlerinin ve parolalarının saklanmasında kullanılacak DBM dosyalarını yönetmek için kullanılır\&. DBM dosyaları hakkında daha ayrıntılı bilgi edinmek için \fBdbmmanage\fR sayfasına bakınız\&. + + +.SH "SEÇENEKLER" + + +.TP +\fB-b\fR +Betik kipi; parola için istek yapmak yerine parola komut satırından verilir\&. \fBParola komut satırında görünür\fR olacağından çok dikkatli kullanmak gerekir\&. Betik kullanımı için \fB-i\fR seçeneğine bakınız\&. +.TP +\fB-i\fR +Parolayı doğrulamaksızın standart girdiden okur (betik kullanımı için)\&. +.TP +\fB-c\fR +\fIparola-dosyası\fR oluşturur\&. Dosya mevcutsa, dosya silinip yeniden yazılır\&. Bu seçenek \fB-n\fR seçeneği ile birlikte kullanılamaz\&. +.TP +\fB-n\fR +Sonuçları veritabanında güncellemek yerine standart çıktıya gönderir\&. \fIparola-dosyası\fR belirtilmediğinden, bu seçenek komut satırı sözdizimini değiştirir\&. Bu seçenek \fB-c\fR seçeneği ile birlikte kullanılamaz\&. +.TP +\fB-m\fR +Parolalar için MD5 şifrelemesi kullanılır\&. Windows ve Netware için bu öntanımlıdır\&. +.TP +\fB-B\fR +Parolalar için bcrypt şifrelemesi kullanılır\&. Şu an için çok güvenli kabul edilmektedir\&. +.TP +\fB-C\fR \fIbedel\fR +Bu seçenek sadece \fB-B\fR (bcrypt şifrelemesi) seçeneği ile birlikte kullanılabilir\&. Bcrypt algoritmasına hesaplama süresini belirtir (daha yüksek değerler daha güvenlidir, öntanımlı 5, geçerli değerler: 4 - 31)\&. +.TP +\fB-d\fR +Parolaları şifrelemek için crypt() kullanılır\&. Windows, ve Netware dışında öntanımlıdır\&. \fBhtdbm\fR tarafından tüm platformlarda destekleniyor olsa da Windows ve Netware üzerinde httpd sunucusu tarafından desteklenmez\&. Bu algoritma günümüz standartlarında \fBgüvenilmez\fR kabul edilmektedir\&. +.TP +\fB-s\fR +Parolalar için SHA şifrelemesi kullanılır\&. LDAP Dizin değişim biçemini (ldif) kullanarak Netscape sunucularına/sunucularından göçü kolaylaştırır\&. Bu algoritma günümüz standartlarında \fBgüvenilmez\fR kabul edilmektedir\&. +.TP +\fB-p\fR +Düz metin parolalar kullanılır\&. \fBhtdbm\fR tarafından tüm platformlarda destekleniyor olsa da Windows, Netware ve TPF üzerinde httpd sunucusu tarafından sadece düz metin parolalar kabul edilir\&. +.TP +\fB-l\fR +Veritabanındaki kullanıcıları açıklamalarıyla birlikte standart çıktıya gönderir\&. +.TP +\fB-v\fR +Kullanıcı adını ve parolasını doğrular\&. Program belirtilen parolanın geçerli olup olmadığını belirten bir ileti basar\&. Eğer parola geçersizse program hata kodu 3 ile çıkar\&. +.TP +\fB-x\fR +Kullanıcıyı siler\&. Kullanıcı belirtilen DBM dosyasında mevcutsa silinir\&. +.TP +\fB-t\fR +Son değiştirgenin bir açıklama olarak yorumlanmasını sağlar\&. Bu seçenek kullanıldığında komut satırının sonuna fazladan bir dizge eklenebilir\&. Bu dizge, veritabanında belirtilen kullanıcının "Comment" alanında saklanır\&. +.TP +\fIparola-dosyası\fR +DBM dosyasının ismi\&. Genellikle, \&.db, \&.pag veya \&.dir eklentisi olmaksızın belirtilir\&. \fB-c\fR seçeneği ile birlikte verilmişse ve DBM dosyası mevcut değilse dosya oluşturulur, mevcutsa dosya güncellenir\&. +.TP +\fIkullanıcı\fR +\fIparola-dosyası\fR'nda oluşturulacak veya güncellenecek kullanıcı ismi\&. \fIkullanıcı\fR bu dosyada mevcut değilse yeni bir girdi eklenir\&. Girdi mevcutsa parolası değiştirilir\&. +.TP +\fIparola\fR +Şifrelenip DBM dosyasında saklanacak düz metin parola\&. Sadece \fB-b\fR seçeneği ile kullanılır\&. +.TP +\fB-T\fR \fIVTtürü\fR +DBM dosyasının türü; SDBM, GDBM, DB, veya "default" olabilir\&. + +.SH "HATALAR" + +.PP +Birden fazla DBM dosya biçemi vardır ve büyük bir olasılıkla da sisteminizde bu birden fazla biçemle ilgili kütüphaneler vardır\&. SDBM, NDBM, GNU'nun GDBM projesi ve Berkeley/Sleepycat DB 2/3/4 bunların başlıcalarıdır\&. Ne yazık ki, bu kütüphanelerin her birinin dosya biçimleri farklıdır\&. Bu bakımdan, \fIdosyaismi\fR dosyasında kullanılan dosya biçeminin \fBhtdbm\fR tarafından kullanılanla aynı biçemde olduğundan emin olmalısınız\&. \fBhtdbm\fR hangi tür DBM dosyasına baktığını saptayacak yeterliliğe sahip değildir\&. Yanlış biçemli bir dosya belirtirseniz hiçbir şey dönmeyebileceği gibi, başka isimde bir DBM dosyasının oluşturulması veya daha da kötüsü üzerine yazmaya çalışıyorsanız DBM dosyasının bozulması bile olasıdır\&. + +.PP +Unix sistemlerinde, kullanılan DBM dosyasının biçemini öğrenmek için \fBfile\fR programı kullanılabilir\&. + +.SH "ÇIKIŞ DURUMU" + +.PP +\fBhtdbm\fR, kullanıcı ismi ve parolasını DBM dosyasına başarıyla eklemiş veya güncellemişse 0, dosyalara erişirken bir sorun çıkmışsa 1, komut satırında bir sözdizimi hatası varsa 2, parola etkileşimli alınmış fakat girdi ile eşleşme sağlanamamışsa 3, işlem kesintiye uğramışsa 4, bir değer çok uzunsa 5 (kullanıcı, parola, dosya ismi veya açıklama), kullanıcı ismi kuraldışı karakter içeriyorsa (Kısıtlamalar bölümüne bakınız) 6 ve dosya geçerli bir DBM parola dosyası değilse 7 değeriyle döner\&. + +.SH "ÖRNEKLER" + +.nf + + htdbm /usr/local/etc/apache/\&.htdbm-users jsmith + +.fi + +.PP +jsmith kullanıcısı için parolayı ekler veya değiştirir\&. Parolayı vermesi için kullanıcıya parola isteği yapılır\&. Windows üzerinde çalıştırılırsa parola Apache MD5 algoritması ile şifrelenir, aksi takdirde sistemin crypt() yordamı kullanılır\&. Dosya mevcut değilse \fBhtdbm\fR beklenen hiçbir işlemi yapmadan bir hata vererek çıkar\&. + +.nf + + htdbm -c /home/doe/public_html/\&.htdbm jane + +.fi + +.PP +Yeni bir dosya oluşturur ve kullanıcı jane için kaydı bir girdi olarak bu dosyaya yazar\&. Dosya mevcutsa fakat okunamıyor veya yazılamıyorsa dosyada bir değişiklik yapılmaz ve \fBhtdbm\fR bir ileti gösterip bir hata durumu ile çıkar\&. + +.nf + + htdbm -mb /usr/web/\&.htdbm-all jones Pwd4Steve + +.fi + +.PP +Komut satırından verilen parolayı (Pwd4Steve) MD5 algoritmasıyla şifreler ve bunu belirtilen dosyada saklar\&. + +.SH "GÜVENLİK DEĞERLENDİRMELERİ" + +.PP +\fBhtdbm\fR tarafından yönetilen parola dosyalarına sunucunun URI uzayından erişilememelidir; yani dosya bir tarayıcı ile okunabilecek bir yerde bulunmamalıdır\&. + +.PP +Komut satırında parolanın şifrelenmemiş olarak görünmesi sebebiyle \fB-b\fR seçeneğinin kullanımından kaçınılmasını öneriyoruz\&. + +.PP +crypt() algoritması kullanılırken, parolayı şekillendirmek için parolanın ilk 8 baytının kullanılacağına dikkat ediniz\&. Eğer parola 8 bayttan uzunsa kalanlar bir uyarı verilmeksizin iptal edilir\&. + +.PP +SHA şifreleme biçeminde tuz kullanılmaz; yani, bir parolanın sadece bir şifreli gösterimi olabilir\&. crypt() ve MD5 biçemleri parolanın önüne rasgele üretilmiş bir tuz dizgesi eklediklerinden sözlük saldırılarına karşı daha dayanıklıdır\&. + +.PP +SHA ve crypt() biçimleri günümüz standartlarında \fBgüvenilmez\fR kabul edilmektedir\&. + +.SH "KISITLAMALAR" + +.PP +Windows platformunda, \fBhtdbm\fR ile şifrelenen parolalar 255 karakterden daha uzun olamaz\&. 255 karakterden sonrası kırpılır\&. + +.PP +\fBhtdbm\fR tarafından kullanılan MD5 algoritması Apache yazılımına özeldir; bu algoritma ile şifrelenen parolalar başka HTTP sunucularında kullanılamayabilir\&. + +.PP +Kullanıcı isimleri 255 bayttan uzun olamaz ve iki nokta imi (:) içeremez\&. + diff --git a/docs/man/tr/htdigest.1 b/docs/man/tr/htdigest.1 new file mode 100644 index 0000000..5fecb4e --- /dev/null +++ b/docs/man/tr/htdigest.1 @@ -0,0 +1,62 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "HTDİGEST" 1 "2013-04-17" "Apache HTTP Sunucusu" "htdigest" +.nh +.SH İSİM +htdigest \- Özet kimlik doğrulama dosyalarını yönetir + +.SH "KULLANIM" + +.PP +\fBhtdigest\fR [ -\fBc\fR ] \fIparola-dosyası\fR \fIbölge\fR \fIkullanıcı\fR + + +.SH "ÖZET" + +.PP +\fBhtdigest\fR, HTTP kullanıcılarının digest türü kimlik doğrulaması için kullanıcı isimlerinin ve parolalarının saklanmasında kullanılacak düz metin dosyalarını oluşturmak ve güncellemek için kullanılır\&. Apache HTTP sunucusunun mevcut özkaynaklarının kullanımı sadece \fBhtdigest\fR tarafından oluşturulan dosyalarda listelenmiş kullanıcılara tahsis edilebilir\&. + +.PP +Bu kılavuz sayfası sadece komut satırı değiştirgelerini listeler\&. Kullanıcı kimlik doğrulamasını \fBhttpd\fR'de yapılandırmak için gerekli yönergelerle ilgili ayrıntılar için Apache dağıtımının bir parçası olan ve http://httpd\&.apache\&.org/ adresinde de bulunan Apache HTTP Sunucusu Belgelerine bakınız\&. + + +.SH "SEÇENEKLER" + + +.TP +\fB-c\fR +\fIparola-dosyası\fR oluşturur\&. Dosya mevcutsa, dosya silinip yeniden yazılır\&. +.TP +\fIparola-dosyası\fR +Kullanıcı ismi, parola ve bölge bilgilerini içeren dosyanın ismi\&. \fB-c\fR seçeneği verilmişse ve dosya mevcut değilse oluşturulur, dosya mevcutsa silinip yeniden oluşturulur\&. +.TP +\fIbölge\fR +Kullanıcının mensup olduğu bölge ismi\&. Daha fazla bilgi için: http://tools\&.ietf\&.org/html/rfc2617#section-3\&.2\&.1 +.TP +\fIkullanıcı\fR +\fIparola-dosyası\fR'nda oluşturulacak veya güncellenecek kullanıcı ismi\&. \fIkullanıcı\fR bu dosyada mevcut değilse yeni bir girdi eklenir\&. Girdi mevcutsa parolası değiştirilir\&. + +.SH "GÜVENLİK DEĞERLENDİRMELERİ" + +.PP +Bu program bir setuid çalıştırılabiliri olarak güvenilir olmadığından \fIsetuid yapılmamalıdır\fR\&. + diff --git a/docs/man/tr/htpasswd.1 b/docs/man/tr/htpasswd.1 new file mode 100644 index 0000000..8f36035 --- /dev/null +++ b/docs/man/tr/htpasswd.1 @@ -0,0 +1,170 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "HTPASSWD" 1 "2014-06-24" "Apache HTTP Sunucusu" "htpasswd" +.nh +.SH İSİM +htpasswd \- Temel kimlik doğrulama dosyalarını yönetir + +.SH "KULLANIM" + +.PP +\fBhtpasswd\fR [ -\fBc\fR ] [ -\fBi\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIbedel\fR ] [ -\fBD\fR ] [ -\fBv\fR ] \fIparola-dosyası\fR \fIkullanıcı\fR + +.PP +\fBhtpasswd\fR -\fBb\fR [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIbedel\fR ] [ -\fBD\fR ] [ -\fBv\fR ] \fIparola-dosyası\fR \fIkullanıcı\fR \fIparola\fR + +.PP +\fBhtpasswd\fR -\fBn\fR [ -\fBi\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIbedel\fR ] \fIkullanıcı\fR + +.PP +\fBhtpasswd\fR -\fBnb\fR [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIbedel\fR ] \fIkullanıcı\fR \fIparola\fR + + +.SH "ÖZET" + +.PP +\fBhtpasswd\fR, HTTP kullanıcılarının temel kimlik doğrulaması için kullanıcı isimlerinin ve parolalarının saklanmasında kullanılacak düz metin dosyalarını oluşturmak ve güncellemek için kullanılır\&. \fBhtpasswd\fR, güncelleme sırasında yazmak veya okumak için bir dosyaya erişemezse beklenen hiçbir işlemi yapmaz ve hata vererek çıkar\&. + +.PP +Apache HTTP sunucusunun mevcut özkaynaklarının kullanımı sadece \fBhtpasswd\fR tarafından oluşturulan dosyalarda listelenmiş kullanıcılara tahsis edilebilir\&. \fBhtpasswd\fR sadece düz metin dosyalarda saklanmış kullanıcı isimlerini ve parolalarını yönetirse de, diğer veri saklama türleri için parolayı şifreleyip gösterebilir\&. Bir DBM veritabanı kullanmak isterseniz \fBdbmmanage\fR ve \fBhtdbm\fR sayfasına bakınız\&. + +.PP +\fBhtpasswd\fR, parolaları şifrelemek için bcrypt, Apache'nin kendine özgü MD5 algoritması, SHA1 ya da sistemin crypt() yordamını kullanır\&. Bu bakımdan \fBhtpasswd\fR tarafından yönetilen dosyalar farklı algoritmalarla şifrelenmiş parolalar içerebilir\&. + +.PP +Bu kılavuz sayfası sadece komut satırı değiştirgelerini listeler\&. Kullanıcı kimlik doğrulamasını \fBhttpd\fR'de yapılandırmak için gerekli yönergelerle ilgili ayrıntılar için Apache dağıtımının bir parçası olan ve http://httpd\&.apache\&.org/ adresinde de bulunan Apache HTTP Sunucusu Belgelerine bakınız\&. + + +.SH "SEÇENEKLER" + + +.TP +\fB-b\fR +Betik kipi; parola için istek yapmak yerine parola komut satırından verilir\&. \fBParola komut satırında görünür\fR olacağından çok dikkatli kullanmak gerekir\&. Betik kullanımı için \fB-i\fR seçeneğine bakınız\&. 2\&.4\&.4 ve sonraki sürümler içindir\&. +.TP +\fB-i\fR +Parolayı doğrulamaksızın standart girdiden okur (betik kullanımı için)\&. +.TP +\fB-c\fR +\fIparola-dosyası\fR oluşturur\&. Dosya mevcutsa, dosya silinip yeniden yazılır\&. Bu seçenek \fB-n\fR seçeneği ile birlikte kullanılamaz\&. +.TP +\fB-n\fR +Sonuçları veritabanında güncellemek yerine standart çıktıya gönderir\&. Bu seçenek, Apache'nin metin veriler içermeyen veri depolarına dahil edilebilecek parolaları üretmekte yararlıdır\&. \fIparola-dosyası\fR belirtilmediğinden, bu seçenek komut satırı sözdizimini değiştirir\&. Bu seçenek \fB-c\fR seçeneği ile birlikte kullanılamaz\&. +.TP +\fB-m\fR +Parolalar için MD5 şifrelemesi kullanılır\&. Bu 2\&.2\&.18 sürümünden beri öntanımlıdır\&. +.TP +\fB-B\fR +Parolalar için bcrypt şifrelemesi kullanılır\&. Şu an için çok güvenli kabul edilmektedir\&. +.TP +\fB-C\fR \fIbedel\fR +Bu seçenek sadece \fB-B\fR (bcrypt şifrelemesi) seçeneği ile birlikte kullanılabilir\&. Bcrypt algoritmasına hesaplama süresini belirtir (daha yüksek değerler daha güvenlidir, öntanımlı 5, geçerli değerler: 4 - 31)\&. +.TP +\fB-d\fR +Parolaları şifrelemek için crypt() kullanılır\&. \fBhtpasswd\fR tarafından tüm platformlarda destekleniyor olsa da Windows, Netware ve TPF üzerinde httpd sunucusu tarafından desteklenmez\&. Bu algoritma günümüz standartlarında \fBgüvenilmez\fR kabul edilmektedir\&. 2\&.2\&.17 sürümüne kadar öntanımlı algoritma olarak kullanılmıştı\&. +.TP +\fB-s\fR +Parolalar için SHA şifrelemesi kullanılır\&. LDAP Dizin değişim biçemini (ldif) kullanarak Netscape sunucularına/sunucularından göçü kolaylaştırır\&.Bu algoritma günümüz standartlarında \fBgüvenilmez\fR kabul edilmektedir\&. +.TP +\fB-p\fR +Düz metin parolalar kullanılır\&. \fBhtpasswd\fR tarafından tüm platformlarda destekleniyor olsa da Windows, Netware ve TPF üzerinde httpd sunucusu tarafından sadece düz metin parolalar kabul edilir\&. +.TP +\fB-D\fR +Kullanıcıyı siler\&. Kullanıcı belirtilen dosyada mevcutsa silinir\&. +.TP +-v +Parolayı doğrular\&. Verilen parolayı belitilen htpasswd dosyasında saklanan kullanıcı parolası ile karşılaştırarak doğrulama yapar\&. 2\&.4\&.5 ve sonraki sürümler içindir\&. +.TP +\fIparola-dosyası\fR +Kullanıcı ismini ve parolasını içeren dosyanın ismi\&. \fB-c\fR seçeneği verilmişse ve dosya mevcut değilse oluşturulur, dosya mevcutsa silinip yeniden oluşturulur\&. +.TP +\fIkullanıcı\fR +\fIparola-dosyası\fR'nda oluşturulacak veya güncellenecek kullanıcı ismi\&. \fIkullanıcı\fR bu dosyada mevcut değilse yeni bir girdi eklenir\&. Girdi mevcutsa parolası değiştirilir\&. +.TP +\fIparola\fR +Şifrelenip dosyada saklanacak düz metin parola\&. Sadece \fB-b\fR seçeneği ile kullanılır\&. + +.SH "ÇIKIŞ DURUMU" + +.PP +\fBhtpasswd\fR, kullanıcı ismi ve parolasını DBM dosyasına başarıyla eklemiş veya güncellemişse 0, dosyalara erişirken bir sorun çıkmışsa 1, komut satırında bir sözdizimi hatası varsa 2, parola etkileşimli alınmış fakat girdi ile eşleşme sağlanamamışsa 3, işlem kesintiye uğramışsa 4, bir değer çok uzunsa 5 (kullanıcı, parola, dosya ismi veya açıklama), kullanıcı ismi kuraldışı karakter içeriyorsa (Kısıtlamalar bölümüne bakınız) 6 ve dosya geçerli bir DBM parola dosyası değilse 7 değeriyle döner\&. + +.SH "ÖRNEKLER" + +.nf + + htpasswd /usr/local/etc/apache/\&.htpasswd-users jsmith + +.fi + +.PP +jsmith kullanıcısı için parolayı ekler veya değiştirir\&. Parolayı vermesi için kullanıcıya parola isteği yapılır\&. Parola takviyeli Apache MD5 algoritması ile şifrelenir\&. Dosya mevcut değilse \fBhtpasswd\fR beklenen hiçbir işlemi yapmadan bir hata vererek çıkar\&. + +.nf + + htpasswd -c /home/doe/public_html/\&.htpasswd jane + +.fi + +.PP +Yeni bir dosya oluşturur ve kullanıcı jane için kaydı bir girdi olarak bu dosyaya yazar\&. Dosya mevcutsa fakat okunamıyor veya yazılamıyorsa dosyada bir değişiklik yapılmaz ve \fBhtpasswd\fR bir ileti gösterip bir hata durumu ile çıkar\&. + +.nf + + htpasswd -db /usr/web/\&.htpasswd-all jones Pwd4Steve + +.fi + +.PP +Komut satırından verilen parolayı (Pwd4Steve) crypt() algoritmasıyla şifreler ve bunu belirtilen dosyada saklar\&. + +.SH "GÜVENLİK DEĞERLENDİRMELERİ" + +.PP +\fBhtpasswd\fR tarafından yönetilen parola dosyalarına sunucunun URI uzayından erişilememelidir; yani dosya bir tarayıcı ile okunabilecek bir yerde bulunmamalıdır\&. + +.PP +Bu program bir setuid çalıştırılabiliri olarak güvenilir olmadığından \fIsetuid yapılmamalıdır\fR\&. + +.PP +Komut satırında parolanın şifrelenmemiş olarak görünmesi sebebiyle \fB-b\fR seçeneğinin kullanımından kaçınılmasını öneriyoruz\&. + +.PP +crypt() algoritması kullanılırken, parolayı şekillendirmek için parolanın ilk 8 baytının kullanılacağına dikkat ediniz\&. Eğer parola 8 bayttan uzunsa kalanlar bir uyarı verilmeksizin iptal edilir\&. + +.PP +SHA şifreleme biçeminde tuz kullanılmaz; yani, bir parolanın sadece bir şifreli gösterimi olabilir\&. crypt() ve MD5 biçemleri parolanın önüne rasgele üretilmiş bir tuz dizgesi eklediklerinden sözlük saldırılarına karşı daha dayanıklıdırlar\&. + +.PP +SHA ve crypt() biçimleri günümüz standartlarında \fBgüvenilmez\fR kabul edilmektedir\&. + +.SH "KISITLAMALAR" + +.PP +Windows platformuda, \fBhtpasswd\fR ile şifrelenen parolalar 255 karakterden daha uzun olamaz\&. 255 karakterden sonrası kırpılır\&. + +.PP +\fBhtpasswd\fR tarafından kullanılan MD5 algoritması Apache yazılımına özeldir; bu algoritma ile şifrelenen parolalar başka HTTP sunucularında kullanılamayabilir\&. + +.PP +Kullanıcı isimleri 255 bayttan uzun olamaz ve iki nokta imi (:) içeremez\&. + diff --git a/docs/man/tr/httpd.8 b/docs/man/tr/httpd.8 new file mode 100644 index 0000000..dbcb79b --- /dev/null +++ b/docs/man/tr/httpd.8 @@ -0,0 +1,119 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "HTTPD" 8 "2014-06-24" "Apache HTTP Sunucusu" "httpd" +.nh +.SH İSİM +httpd \- Apache Hiper Metin Aktarım Protokolü Sunucusu + +.SH "KULLANIM" + +.PP +\fBhttpd\fR [ -\fBd\fR \fIsunucu-kök-dizini\fR ] [ -\fBf\fR \fIyapılandırma-dosyası\fR ] [ -\fBC\fR \fIyönerge\fR ] [ -\fBc\fR \fIyönerge\fR ] [ -\fBD\fR \fIparametre\fR ] [ -\fBe\fR \fIseviye\fR ] [ -\fBE\fR \fIdosya\fR ] [ \fB-k\fR start | restart | graceful | stop | graceful-stop ] [ -\fBh\fR ] [ -\fBl\fR ] [ -\fBL\fR ] [ -\fBS\fR ] [ -\fBt\fR ] [ -\fBv\fR ] [ -\fBV\fR ] [ -\fBX\fR ] [ -\fBM\fR ] [ -\fBT\fR ] + +.PP +Windows sistemlerinde, ek olarak şunlar vardır: + +.PP +\fBhttpd\fR [ -\fBk\fR install | config | uninstall ] [ -\fBn\fR \fIisim\fR ] [ -\fBw\fR ] + + +.SH "ÖZET" + +.PP +\fBhttpd\fR, Apache Hiper Metin Aktarım Protokolü (HTTP) sunucusu programıdır\&. Tek başına çalışan bir artalan süreci olarak tasarlanmıştır\&. Bu tarz kullanıldığında istekleri işleme sokmak için çocuk süreçlerden ve evrelerden oluşan bir havuz oluşturur\&. + +.PP +Genelde, \fBhttpd\fR'nin doğrudan çağrılmaması gerekir\&. Unix ve benzerlerinde apachectl aracılığıyla, Windows NT, 2000 ve XP'de bir hizmet olarak, Windows 9x ve ME'de ise bir konsol uygulaması olarak çalıştırılır\&. + + +.SH "SEÇENEKLER" + + +.TP +\fB-d\fR \fIsunucu-kök-dizini\fR +\fIsunucu-kök-dizini\fR'ni ServerRoot yönergesine ilk değer olarak atar\&. Yapılandırma dosyasındaki bir ServerRoot yönergesiyle bu atama geçersiz kılınabilir\&. Bu seçenek belirtilmediği takdirde /usr/local/apache2 dizini öntanımlıdır\&. +.TP +\fB-f\fR \fIyapılandırma-dosyası\fR +Başlatma sırasında \fIyapılandırma-dosyası\fR'ndaki yönergeler kullanılır\&. Eğer \fIyapılandırma-dosyası\fR bir / ile başlamıyorsa dosyanın ServerRoot yönergesinin değerine göreli olduğu varsayılır\&. Seçenek belirtilmediği takdirde conf/httpd\&.conf öntanımlı değerdir\&. +.TP +\fB-k\fR start | restart | graceful | stop | graceful-stop +\fBhttpd\fR'yi başlatmak, durdurmak ve yeniden başlatmak için sinyal gönderir\&. Daha ayrıntılı bilgi edinmek için Apache httpd'nin Durdurulması belgesine bakınız\&. +.TP +\fB-C\fR \fIyönerge\fR +Yapılandırma \fIyönerge\fR'sini yapılandırma dosyalarını okumadan önce işleme sokar\&. +.TP +\fB-c\fR \fIyönerge\fR +Yapılandırma \fIyönerge\fR'sini yapılandırma dosyalarını okuduktan sonra işleme sokar\&. +.TP +\fB-D\fR \fIparametre\fR +Sunucu başlatılırken veya yeniden başlatılırken komutları şarta bağlı olarak işleme sokmak veya atlamak için yapılandırma dosyalarında kullanılan bölümlerinde kullanılmak üzere bir yapılandırma \fIparametre\fR'si tanımlar\&. Ayrıca, -DNO_DETACH (ana sürecin çatallanmasını engellemek için), -DFOREGROUND (ana sürecin setsid() ve benzerlerinden çağrılmasını engellemek için) gibi daha az bilinen bazı başlatma parametrelerini atamakta da kullanılabilir\&. +.TP +\fB-e\fR \fIseviye\fR +Hata günlüğü seviyesi olarak LogLevel yönergesine sunucu başlatılırken \fIseviye\fR değerini atar\&. Bu seçenek, başlatma sırasındaki sorunları saptamak amacıyla hata iletilerinin ayrıntı seviyesini geçici olarak arttırmak için kullanılır\&. +.TP +\fB-E\fR \fIdosya\fR +Sunucunun başlatılması sırasında hata iletilerinin belirtilen \fIdosya\fR'ya gönderilmesini sağlar\&. +.TP +\fB-h\fR +Mevcut komut satırı seçeneklerinin kısa bir özetini çıktılar\&. +.TP +\fB-l\fR +Sunucunun içinde derlenmiş modüllerin listesini çıktılar\&. Bu liste LoadModule yönergesi kullanılarak devingen olarak yüklenen modülleri içermez\&. +.TP +\fB-L\fR +Durağan modüllerce sağlanmış yönergeleri olası değerleriyle geçerli konumlarına yerleştirerek listeler\&. Paylaşımlı modüllerce sağlanan yönergeleri listelemez\&. +.TP +\fB-M\fR +Yüklü durağan ve paylaşımlı modülleri listeler\&. +.TP +\fB-S\fR +Yapılandırma dosyasından çözümlenmiş haliyle ayarları gösterir (şu an sadece sanal konak ayarları gösterilmektedir)\&. +.TP +\fB-T\fR (2\&.3\&.8 ve sonrasında kullanılabilmektedir) +Başlatma ve yeniden başlatma sırasında belge kökü sınanmadan geçilir\&. +.TP +\fB-t\fR +Yapılandırma dosyasını sözdizimi hatalarına karşı denetler\&. Program sözdizimini denetledikten sonra sözdizimi geçerliyse 0 ile, değilse sıfırdan farklı bir değerle çıkar\&. \fB-D\fRDUMP_VHOSTS seçeneği ile birlikte kullanılmışsa ek olarak sanal konak ayrıntıları da basılır\&. \fB-D\fRDUMP_MODULES seçeneği ile ise ek olarak tüm modüller listelenir\&. +.TP +\fB-v\fR +\fBhttpd\fR sürümünü basar ve çıkar\&. +.TP +\fB-V\fR +Sürümü ve \fBhttpd\fR kurulum parametrelerini basar ve çıkar\&. +.TP +\fB-X\fR +\fBhttpd\fR hata ayıklama kipinde çalışır\&. Tek çocuk süreç başlatılır ve sunucu konsolu terketmez\&. + +.PP +Aşağıdaki seçenekler sadece Windows platformunda geçerlidir: + + +.TP +\fB-k\fR install | config | uninstall +Parametreler bakımından sırasıyla: Apache httpd bir Windows NT hizmeti haline getirilir; başlatma seçenekleri Apache httpd hizmeti için değiştirilir; ve Apache httpd hizmeti sistemden kaldırılır\&. +.TP +\fB-n\fR \fIisim\fR +Sinyal gönderilecek Apache httpd hizmetinin \fIismi\fR\&. +.TP +\fB-w\fR +Hata durumunda konsol penceresi açık tutularak hata iletilerinin okunması sağlanır\&. + diff --git a/docs/man/tr/httxt2dbm.1 b/docs/man/tr/httxt2dbm.1 new file mode 100644 index 0000000..b5d9814 --- /dev/null +++ b/docs/man/tr/httxt2dbm.1 @@ -0,0 +1,65 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "HTTXT2DBM" 1 "2013-04-17" "Apache HTTP Sunucusu" "httxt2dbm" +.nh +.SH İSİM +httxt2dbm \- RewriteMap ile kullanmak için DBM dosyaları üretir + +.SH "KULLANIM" + +.PP +\fBhttxt2dbm\fR [ -\fBv\fR ] [ -\fBf\fR \fIDBM_türü\fR ] -\fBi\fR \fIkaynak_metin\fR -\fBo\fR \fIçıktı_DBM\fR + + +.SH "ÖZET" + +.PP +\fBhttxt2dbm\fR, RewriteMap ile kullanmak için düz metin dosyalardan DBM dosyaları üretir\&. + +.PP +Çıktı dosyası mevcutsa dosya kırpılmaz\&. Yeni anahtarlar eklenir, mevcutlar da güncellenir\&. + + +.SH "SEÇENEKLER" + + +.TP +\fB-v\fR +Çıktı daha ayrıntılı olur\&. +.TP +\fB-f\fR \fIDBM_türü\fR +Çıktı için kullanılacak DBM türü belirtilir\&. Belirtilmediği takdirde APR öntanımlısı kullanılır\&. Belirtilebilecek DBM türleri: GDBM dosyalar için GDBM, SDBM dosyalar için SDBM, Berkeley DB dosyalar için DB, NDBM dosyalar için NDBM, öntanımlı DBM türü için default +.TP +\fB-i\fR \fIkaynak_metin\fR +DBM dosyasının üretiminde kullanılacak girdi dosyası belirtilir\&. Bu dosya, her satırda bir kayıt bulunmak üzere her satırı şöyle biçemlenmiş olmalıdır: anahtar değer\&. Bu dosyanın biçemi ve manası ile ilgili ayrıntılar için RewriteMap yönergesinin açıklamasına bakınız\&. +.TP +\fB-o\fR \fIçıktı_DBM\fR +Çıktılanacak DBM dosyasının ismi belirtilir\&. + +.SH "ÖRNEKLER" + +.nf + + httxt2dbm -i rewritemap\&.txt -o rewritemap\&.dbm + httxt2dbm -f SDBM -i rewritemap\&.txt -o rewritemap\&.dbm +.fi + diff --git a/docs/man/tr/logresolve.1 b/docs/man/tr/logresolve.1 new file mode 100644 index 0000000..7ec05a4 --- /dev/null +++ b/docs/man/tr/logresolve.1 @@ -0,0 +1,51 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "LOGRESOLVE" 1 "2013-04-17" "Apache HTTP Sunucusu" "logresolve" +.nh +.SH İSİM +logresolve \- Apache günlük dosyalarındaki IP adreslerini konak isimlerine dönüştürür + +.SH "KULLANIM" + +.PP +\fBlogresolve\fR [ -\fBs\fR \fIdosyaismi\fR ] [ -\fBc\fR ] < \fIgünlük_dosyası\fR > \fIyeni_günlük_dosyası\fR + + +.SH "ÖZET" + +.PP +\fBlogresolve\fR, Apache'nin erişim günlüklerindeki IP adreslerini çözümlemek için bir ardıl işlem uygulamasıdır\&. İsim sunucunuza bindirdiği yükü en aza indirmek için \fBlogresolve\fR kendi arabelleğinde oluşturduğu eşleme tablosunu kullanır\&. + +.PP +Apache günlük dosyasını standart girdisinden okur\&. IP adresleri günlük dosyası satırlarında ilk bileşen olmalı ve sonraki bileşenlerden bir boşluk ile ayrılmalıdır\&. + + +.SH "SEÇENEKLER" + + +.TP +-s \fIdosyaismi\fR +İstatistiklerin kaydedileceği dosyanın ismi belirtilir\&. +.TP +-c +\fBlogresolve\fR uygulamasının bazı DNS sorguları yapmasına sebep olur: IP adresine karşılık olan konak ismini bulduktan sonra özgün adresle karşılaştırmak için bu konak ismine karşılık gelen IP adresini sorgular\&. + diff --git a/docs/man/tr/rotatelogs.8 b/docs/man/tr/rotatelogs.8 new file mode 100644 index 0000000..5a515aa --- /dev/null +++ b/docs/man/tr/rotatelogs.8 @@ -0,0 +1,177 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "ROTATELOGS" 8 "2015-01-18" "Apache HTTP Sunucusu" "rotatelogs" +.nh +.SH İSİM +rotatelogs \- Apache günlüklerini döndürmek için borulu günlük kayıt programı + +.SH "KULLANIM" + +.PP +\fBrotatelogs\fR [ -\fBl\fR ] [ -\fBL\fR \fIisim\fR ] [ -\fBp\fR \fIprogram\fR ] [ -\fBf\fR ] [ -\fBt\fR ] [ -\fBv\fR ] [ -\fBe\fR ] [ -\fBc\fR ] [ -\fBn\fR \fIdosya_sayısı\fR ] \fIdosyaismi\fR \fIsüre\fR|\fIboyut\fR(B|K|M|G) [ \fIsaat_farkı\fR ] + + +.SH "ÖZET" + +.PP +\fBrotatelogs\fR, Apache'nin borulu günlük dosyaları özelliği ile birlikte kullanmak için tasarlanmış basit bir programdır\&. Günlük dosyasının azami boyutuna göre veya belli aralıklarla günlük dosyalarını döndürür\&. + + +.SH "SEÇENEKLER" + + +.TP +\fB-l\fR +GMT yerine yerel zamanın kullanılmasını sağlar\&. +.TP +\fB-L\fR \fIbagismi\fR +Belirtilen bağ dosyası ismine geçerli günlük dosyasından kalıcı bir bağ oluşturulur\&. tail -F bagismi gibi bir komut kullanılarak günlüğün sürekli izlenmesi için kullanılabilir\&. +.TP +\fB-p\fR \fIprogram\fR +Belirtildiği takdirde, \fBrotatelogs\fR yeni bir günlük dosyasının her açılışında belirtilen programı çalıştırır\&. Yeni açılan dosyanın ismi programa ilk argüman olarak aktarılır\&. Bu işlem bir döndürme sonrası yapılırsa eski günlük dosyası ikinci argüman olarak aktarılır\&. \fBrotatelogs\fR işlemini sürdürmek için belirtilen programın sonlanmasını beklemez, dolayısıyla sonlanma soucunda döndürülen hata kodunu günlüğe kaydetmez\&. Çalıştırılan program \fBrotatelogs\fR ile aynı stdin, stdout ve stderr'i kullanır ve ortamı da miras alır\&. +.TP +\fB-f\fR +İlk günlük giridisinin okunmasını beklemeden \fBrotatelogs\fR başlar başlamaz günlük dosyasının açılmasını sağlar\&. Çok meşgul sitelerde, sunucu başlatılıp ilk istek sunuluncaya kadar geçen zamanda günlük dosyasının yokluğu özdevinimli işlemler yapan bazı günlükleme araçlarında sorunlara yol açabilir\&. Bu seçenek bu gibi durumlarda yararlıdır\&. +.TP +\fB-t\fR +Günlük dosyasının döndürülmek yerine tepeden kırpılmasına sebep olur\&. Günlüğün \fBtail\fR gibi bir araç tarafından gerçek zamanda işlendiği ve veriyi saklamanın gerekmediği durumda kullanışlıdır\&. Dosya ismine bir sonek eklenmez, ancak biçem dizgesi '%' karakteri içeriyorsa buna uyulur\&. +.TP +\fB-v\fR +Standart hataya verilen çıktı daha ayrıntılı olur\&. Çıktı, yapılandırma çözümlemesinin sonuçlarını ve tüm dosya açma/kapama işlemlerini içerir\&. +.TP +\fB-e\fR +Günlüğü standart çıktıya basar\&. Günlüğün zincirdeki ilgili araç tarafından gerçek zamanda işlenmesi gerektiğinde kullanışlıdır\&. +.TP +\fB-c\fR +Create log file for each interval, even if empty\&. +.TP +\fB-n\fR \fIdosya_sayısı\fR +Zaman damgalarına bakılmaksızın bir dosya serisi açılır\&. Örneğin -n3 belirtilirse "logfile", "logfile\&.1", "logfile\&.2" serisi açılır ve "logfile" üzerine yazılır\&. 2\&.4\&.5 ve sonraki sürümler içindir\&. +.TP +\fIdosyaismi\fR +.PP Günlük dosyasının ismi yoluyla birlikte belirtilir\&. \fIdosyaismi\fR '%' karakterleri içeriyorsa bunlar strftime(3) biçem belirteçleri olarak ele alınır\&. Aksi takdirde, özdevinimli olarak \fI\&.nnnnnnnnnn\fR uzantısı üretilir\&. (\fB-t\fR seçeneği kullanılmadıkça) Uzantı saniye cinsindendir ve her iki durumda da bu değer, mevcut döngü diliminin başlangıcına göre hesaplanır\&. Örneğin, döndürmenin 86400 saniyede bir yapılacağı belirtilmişse, strftime(3) biçeminde oluşturulan saat, dakika ve saniye alanları, 24 saatlik sürenin başlangıcını (geceyarısı) göstermek üzere sıfırlarla doldurulur\&. .PP strftime(3) dosyaismi biçemlemesi kullanılırken, günlük dosyası biçeminin günlük dosyası döndürülürken her zaman farklı bir dosya ismi üretecek yeterlilikte parçacıklı yapıya sahip olduğundan emin olmalısınız\&. Aks takdirde döndürme işlemi yeni bir dosya başlatmak yerine hep aynı dosyanın üzerine yazar\&. Örneğin, \fIlogfile\fR için /var/log/errorlog\&.%Y-%m-%d belirtilmişse 5 mega baytta bir yeni bir günlük dosyasına başlanacaktır\&. Fakat 5 megabayta gün içinde iki kez ulaşılırsa aynı günlük dosyası üretilir ve günlük hep aynı dosyanın üzerine yazılır\&. +.TP +\fIsüre\fR +Günlük dosyasının yenisinin kaç saniyede bir açılacağı belirtilir\&. Örneğin, bu süre 3600 saniye ise günlük dosyası her saat başında yenilenir; 86400 saniye ise her geceyarısı yenilenir\&. (Bu süre zarfında günlüğe kaydedilecek bir olay gerçekleşmemişse dosya oluşturulmaz\&.) +.TP +\fIboyut\fR(B|K|M|G) +Boyuta göre döndürme için azami dosya boyutu\&. Belirtilenin bir süre değil de bir boyut değeri olarak ele alınması için değerin sonuna şu karakterlerden biri eklenmelidir: B (Bayt), K (kilobayt), M (megabayt), G (gigabayt)\&. .PP Süre ve boyut birlikte belirtilmişse boyut süreden sonra belirtilmelidir\&. Dosya yenilemesi, bunlardan hangisi daha önce aşılırsa o zaman gerçekleşir\&. +.TP +\fIsaat_farkı\fR +Koordinatlı evrensel zamana göre "dakika" farkı\&. Belirtilmezse, sıfır öntanımlıdır\&. Örneğin, -5 saatlik bir zaman diliminde bulunuyorsanız bu değer -300 olmalıdır\&. Çoğu durumda, bunun yerine \fB-l\fR seçeneğini kullanmak gerekir\&. + +.SH "ÖRNEKLER" + +.nf + + CustomLog "|bin/rotatelogs /var/log/logfile 86400" common + +.fi + +.PP +nnnn, günlük kaydının başladığı sistem zamanı olmak üzere /var/log/logfile\&.nnnn dosyası oluşturulur\&. Bu zaman, daima döngü süresinin katları olacağından bunu cron betiklerinizi eşzamanlamakta kullanabilirsiniz\&. Her döngü süresinin sonunda (burada 24 saat sonra) yeni bir günlük dosyası açılır\&. + +.nf + + CustomLog "|bin/rotatelogs -l /var/log/logfile\&.%Y\&.%m\&.%d 86400" common + +.fi + +.PP +yyyy, yıl; mm, ay; dd, ayın gününü belirtmek üzere /var/log/logfile\&.yyyy\&.mm\&.dd dosyası oluşturulur\&. Her gün yerel zamanla geceyarısı yeni bir günlük dosyasına geçilecektir\&. + +.nf + + CustomLog "|bin/rotatelogs /var/log/logfile 5M" common + +.fi + +.PP +Günlük dosyası 5 megabaytlık olunca yenisinin oluşturulmasını sağlar\&. + +.nf + + ErrorLog "|bin/rotatelogs /var/log/errorlog\&.%Y-%m-%d-%H_%M_%S 5M" + +.fi + +.PP +Hata günlüğünün 5 megabaytta bir errorlog\&.YYYY-mm-dd-HH_MM_SS biçemli bir isimle oluşturulmasını sağlar\&. + +.nf + + CustomLog "|bin/rotatelogs -t /var/log/logfile 86400" common + +.fi + +.PP +/var/log/logfile dosyasını oluşturur, sunucu başlatılırken ve günde bir kere dosyanın tepesi kırpılır\&. Bu senaryoda ayrı bir sürecin (tail gibi) dosyayı gerçek zamanlı işleyeceği umulur\&. + +.SH "TAŞINABİLİRLİK" + +.PP +Aşağıdaki günlük dosyası biçem belirteçlerinin tüm strftime(3) gerçeklenimlerince desteklenmesi gerekir\&. Kullandığınız kütüphaneye özgü belirteçler için sisteminizdeki strftime(3) kılavuz sayfasına bakınız\&. + +.Ip "\(bu \s-1%A\s0 \- tam gün ismi (yerelleştirilmiş) + +.Ip "\(bu \s-1%a\s0 \- 3 harflik gün ismi (yerelleştirilmiş) + +.Ip "\(bu \s-1%B\s0 \- tam ay ismi (yerelleştirilmiş) + +.Ip "\(bu \s-1%b\s0 \- 3 harflik ay ismi (yerelleştirilmiş) + +.Ip "\(bu \s-1%c\s0 \- tarih ve saat (yerelleştirilmiş) + +.Ip "\(bu \s-1%d\s0 \- 2 haneli ay günü numarası + +.Ip "\(bu \s-1%H\s0 \- 2 haneli saat (24 saatlik) + +.Ip "\(bu \s-1%I\s0 \- 2 haneli saat (12 saatlik) + +.Ip "\(bu \s-1%j\s0 \- 3 hanelik yıl günü numarası + +.Ip "\(bu \s-1%M\s0 \- 2 haneli dakika + +.Ip "\(bu \s-1%m\s0 \- 2 haneli ay + +.Ip "\(bu \s-1%p\s0 \- 12 saatlik kip için öö/ös (yerelleştirilmiş) + +.Ip "\(bu \s-1%S\s0 \- 2 haneli saniye + +.Ip "\(bu \s-1%U\s0 \- 2 haneli yılın hafta numarası (Haftanın ilk gününün Pazar olduğu varsayımıyla) + +.Ip "\(bu \s-1%W\s0 \- 2 haneli yılın hafta numarası (Haftanın ilk gününün Pazartesi olduğu varsayımıyla) + +.Ip "\(bu \s-1%w\s0 \- 1 hanelik haftanın gün numarası (Haftanın ilk gününün Pazar olduğu varsayımıyla) + +.Ip "\(bu \s-1%X\s0 \- saat (yerelleştirilmiş) + +.Ip "\(bu \s-1%x\s0 \- tarih (yerelleştirilmiş) + +.Ip "\(bu \s-1%Y\s0 \- 4 hanelik yıl + +.Ip "\(bu \s-1%y\s0 \- 2 hanelik yıl + +.Ip "\(bu \s-1%Z\s0 \- zaman dilimi ismi + +.Ip "\(bu \s-1%%\s0 \- `%' iminin kendisi + diff --git a/docs/man/tr/suexec.8 b/docs/man/tr/suexec.8 new file mode 100644 index 0000000..324d408 --- /dev/null +++ b/docs/man/tr/suexec.8 @@ -0,0 +1,48 @@ +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.\" DO NOT EDIT! Generated from XML source. +.\" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "SUEXEC" 8 "2013-08-16" "Apache HTTP Sunucusu" "suexec" +.nh +.SH İSİM +suexec \- harici programları çalıştırmadan önce kullanıcıyı değiştirir + +.SH "KULLANIM" + +.PP +\fBsuexec\fR -\fBV\fR + + +.SH "ÖZET" + +.PP +\fBsuexec\fR, CGI programlarını çalıştırmadan önce Apache HTTP Sunucusu tarafından kullanıcı değiştirmek için kullanılır\&. Bunu yapabilmek için sunucunun root tarafından çalıştırılmış olması gerekir\&. HTTP artalan süreci normalde root aidiyetinde çalışmadığından \fBsuexec\fR'in çalıştırılabilir dosyasının sahibi root olmalı, setuid biti etkin (u+s) olmalı ve dosyaya root dışında hiç kimse yazamamalıdır\&. + +.PP +\fBsuexec\fR güvenlik modeli ve kavramlar hakkında bilgi edinmek için suexec belgesine (http://httpd\&.apache\&.org/docs/2\&.4/suexec\&.html) bakınız\&. + + +.SH "SEÇENEKLER" + + +.TP +\fB-V\fR +root iseniz, bu seçenek \fBsuexec\fR derleme seçeneklerini gösterir\&. Güvenlik sebebiyle tüm yapılandırma seçenekleri sadece derleme sırasında değiştirilebilir\&. + diff --git a/docs/manual/BUILDING b/docs/manual/BUILDING new file mode 100644 index 0000000..71ad945 --- /dev/null +++ b/docs/manual/BUILDING @@ -0,0 +1,2 @@ +For instructions on building the manual, see +. diff --git a/docs/manual/LICENSE b/docs/manual/LICENSE new file mode 100644 index 0000000..57bc88a --- /dev/null +++ b/docs/manual/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/docs/manual/bind.html b/docs/manual/bind.html new file mode 100644 index 0000000..150fa61 --- /dev/null +++ b/docs/manual/bind.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: bind.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: bind.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: bind.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: bind.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: bind.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: bind.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/bind.html.de b/docs/manual/bind.html.de new file mode 100644 index 0000000..fe44ac3 --- /dev/null +++ b/docs/manual/bind.html.de @@ -0,0 +1,229 @@ + + + + + +An Adressen und Ports binden - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    An Adressen und Ports binden

    +
    +

    Verfügbare Sprachen:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    Diese Übersetzung ist möglicherweise + nicht mehr aktuell. Bitte prüfen Sie die englische Version auf + die neuesten Änderungen.
    + +

    Konfiguration der vom Apache HTTP Server verwendeten Adressen und + Ports.

    +
    + +
    top
    +
    +

    Überblick

    + + + + +

    Beim Start bindet sich der httpd an bestimmte Adressen und Ports + der lokalen Maschine und wartet auf eingehende Anfragen. + Standardmäßig lauscht er an allen Adressen des Systems. + Es kann jeodch notwendig sein, ihm mit zuteilen, nur an bestimmten + Ports zu lauschen oder nur an ausgewählten Adressen, bzw. einer + Kombination aus beidem. Dies wird oft mit der Funktionalität virtueller Hosts kombiniert, die bestimmt, wie + der httpd auf verschiedene IP-Adressen, Hostnamen und + Ports reagiert.

    + +

    Die Direktive Listen + weist den Server an, eingehende Anfragen nur an bestimmten Port(s) + oder Adress/Port-Kombinationen zu akzeptieren. Wenn bei der + Listen-Direktive nur eine + Portnummer angegeben wird, dann lauscht der Server auf allen + Netzwerkinterfaces an dem angegebenen Port. Ist auch eine IP-Adresse + angegeben, dann lauscht der Server an der angegebenen Schnittstelle + auf dem angegebenen Port. Es können mehrere Listen-Anweisungen verwendet werden, + um eine Reihe von Adressen und Ports anzugeben, an denen gelauscht + werden soll. Der Server wird dann auf Anfragen an jeder der + abgehörten Adressen und Ports antworten.

    + +

    Um beispielsweise den Server zu veranlassen, auf allen + Netzwerkinterfaces sowohl an Port 80, als auch an Port 8000 + Verbindungen zu akzeptieren, geben Sie an:

    + +
    Listen 80
    +Listen 8000
    +
    + +

    Um den Server Verbindungen an Port 80 auf einem Netzwerkinterface + akzeptieren zu lassen und an Port 8080 auf einem anderen Interface, geben + Sie an:

    + +
    Listen 192.0.2.1:80
    +Listen 192.0.2.5:8000
    +
    + +

    IPv6-Adressen müssen wie im folgenden Beispiel in eckigen + Klammern angegeben werden:

    + +
    Listen [2001:db8::a00:20ff:fea7:ccea]:80
    +
    + +

    Sich überlappende Listen-Direktiven generieren einen + fatalen Fehler, der verhindert, dass der Server hochfährt.

    + +

    + (48)Address already in use: make_sock: could not bind to address [::]:80 +

    + +

    Diese + Diskussion im Wiki gibt weitere Tipps zur Fehlerbehebung.

    +
    +
    top
    +
    +

    Betrachtung von IPv6-Besonderheiten

    + + +

    Eine wachsende Anzahl von Plattformen implementiert IPv6. Die + APR unterstützt IPv6 auf den meisten + dieser Plattformen und ermöglicht dem httpd, IPv6-Sockets zu + verwenden und über IPv6 gesendete Anfragen zu behandeln.

    + +

    Für httpd-Administratoren kommt erschwerend die Frage hinzu, + ob IPv6-Sockets sowohl IPv4- als auch IPv6-Verbindungen handhaben + können. Zum Betrieb von IPv4-Verbindungen an IPv6-Sockets + werden auf IPv6 abgebildete IPv4-Adressen (Anm.d.Ü.: so genannete + IPv4-gemappte IPv6-Adressen) verwendet, welche + standardmäßig auf den meisten Plattformen erlaubt sind. + Unter FreeBSD, NetBSD und OpenBSD jedoch sind sie + standardmäßig deaktiviert, um den Systemgrundsätzen + dieser Plattformen zu entsprechen. Auf Systemen, wo dies + standardmäßig dekativiert ist, kann dieses Verhalten mit + einem speziellen configure-Parameter für den + httpd geändert werden.

    + +

    Auf der anderen Seite ist die Verwendung von gemappten Adressen + bei einigen Plattformen wie Linux und True64 der + einzige Weg, sowohl IPv4 wie auch IPv6 zu + verwenden. Wenn Sie möchten, dass der httpd IPv4- + und IPv6-Verbindungen mit einem Minimum an Sockets behandelt, was + die Verwendung von IPv4-gemappten IPv6-Adressen erfordert, dann + müssen Sie die configure-Option + --enable-v4-mapped angeben.

    + +

    --enable-v4-mapped ist die Voreinstellung auf allen + Plattformen außer FreeBSD, NetBSD und OpenBSD, so dass Ihr + httpd wahrscheinlich so übersetzt wurde.

    + +

    Geben Sie wie in dem folgenden Beispiel bei allen Listen-Anweisungen eine IPv4-Adresse + an, wenn Sie möchten, dass Ihr httpd lediglich IPv4-Adressen + behandelt, unabhängig davon, was Ihre Plattform und die APR + unterstützen:

    + +
    Listen 0.0.0.0:80
    +Listen 192.0.2.1:80
    +
    + +

    Wenn Sie möchten, dass der httpd IPv4- und IPv6-Verbindungen + an separaten Sockets behandelt (d.h. IPv4-gemappte Adressen + deaktiviert werden sollen) und Ihre Plattform es unterstützt, + dann müssen Sie die configure-Option + --disable-v4-mapped angeben. Unter FreeBSD, NetBSD und + OpenBSD ist --disable-v4-mapped voreingestellt.

    +
    top
    +
    +

    Angabe des Protokolls bei Listen

    + +

    Das optionale zweite Protokoll-Argument von Listen ist für die meisten + Konfigurationen gar nicht erforderlich. Wenn nicht angegeben, sind + https für Port 443 und http für + alle anderen Ports die Voreinstellungen. Die Protokollangabe wird + sowohl dazu verwendet, herauszufinden, welches Modul Anfragen + verarbeiten soll, als auch, um protokollspezifische Optimierungen + bei der AcceptFilter-Direktive + zu aktivieren.

    + +

    Sie müssen das Protokoll nur angeben, wenn Sie + ungewöhnliche Ports benutzen, beispielsweise https + auf Port 8443:

    + +
    Listen 192.170.2.1:8443 https
    +
    +
    top
    +
    +

    Das Zusammenspiel mit virtuellen Hosts

    + + +

    Die Direktive Listen + implementiert keine virtuellen Hosts - sie teilt dem Hauptserver + lediglich mit, an welchen Adressen und Ports er zu lauschen hat. + Werden keine <VirtualHost>-Container verwendet, dann + verhält sich der Server bei allen angenommenen Anfragen gleich. + <VirtualHost>-Abschnitte können jedoch + dazu verwendet werden, ein unterschiedliches Verhalten für eine + oder mehrere Adressen und Ports festzulegen. Um einen virtuellen + Host einzurichten, muss dem Server zunächst mitgeteilt werden, + an den betreffenden Adressen oder Ports zu lauschen. Dann sollte ein + <VirtualHost>-Abschnitt für die + angebene Adresse und den angegebenen Port erstellt werden, um das + Verhalten dieses virtuellen Hosts festzulegen. Beachten Sie bitte, + dass auf einen <VirtualHost> nicht zugegriffen werden + kann, wenn er für eine Adresse und einen Port eingerichtet + wurde, an dem der Server nicht lauscht.

    +
    +
    +

    Verfügbare Sprachen:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Kommentare

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/bind.html.en b/docs/manual/bind.html.en new file mode 100644 index 0000000..c048fd7 --- /dev/null +++ b/docs/manual/bind.html.en @@ -0,0 +1,246 @@ + + + + + +Binding to Addresses and Ports - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Binding to Addresses and Ports

    +
    +

    Available Languages:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Configuring Apache HTTP Server to listen on specific addresses and ports.

    +
    + +
    top
    +
    +

    Overview

    + + + + + +

    When httpd starts, it binds to some port and address on + the local machine and waits for incoming requests. By default, + it listens to all addresses on the machine. However, it may need to + be told to listen on specific ports, or only on selected + addresses, or a combination of both. This is often combined with the + Virtual Host feature, which determines how + httpd responds to different IP addresses, hostnames and + ports.

    + +

    The Listen + directive tells the server to accept + incoming requests only on the specified port(s) or + address-and-port combinations. If only a port number is + specified in the Listen + directive, the server listens to the given port on all interfaces. + If an IP address is given as well as a port, the server will listen + on the given port and interface. Multiple Listen directives may be used to + specify a number of addresses and ports to listen on. The + server will respond to requests from any of the listed + addresses and ports.

    + +

    For example, to make the server accept connections on both + port 80 and port 8000, on all interfaces, use:

    + +
    Listen 80
    +Listen 8000
    +
    + +

    To make the server accept connections on port 80 for one interface, + and port 8000 on another, use

    + +
    Listen 192.0.2.1:80
    +Listen 192.0.2.5:8000
    +
    + +

    IPv6 addresses must be enclosed in square brackets, as in the + following example:

    + +
    Listen [2001:db8::a00:20ff:fea7:ccea]:80
    +
    + +

    Overlapping Listen directives will result in a + fatal error which will prevent the server from starting up.

    + +

    + (48)Address already in use: make_sock: could not bind to address [::]:80 +

    + +

    See the + discussion in the wiki for further troubleshooting tips.

    + +
    + +
    top
    +
    +

    Changing Listen configuration on restart

    + + +

    When httpd is restarted, special consideration must be made for + changes to Listen directives. During a restart, httpd keeps ports + bound (as in the original configuration) to avoid generating + "Connection refused" errors for any new attempts to connect to the + server. If changes are made to the set of Listen directives used + which conflict with the old configuration, configuration will fail + and the server will terminate.

    + +

    For example, changing from configuration:

    + +
    Listen 127.0.0.1:80
    +
    + +

    to the following may fail, because binding to port 80 across + all addresses conflicts with binding to port 80 on just + 127.0.0.1.

    + +
    Listen 80
    +
    + +

    To have such configuration changes take effect, it is necessary + to stop and then start the server.

    + +
    top
    +
    +

    Special IPv6 Considerations

    + + +

    A growing number of platforms implement IPv6, and + APR supports IPv6 on most of these platforms, + allowing httpd to allocate IPv6 sockets, and to handle requests sent + over IPv6.

    + +

    One complicating factor for httpd administrators is whether or + not an IPv6 socket can handle both IPv4 connections and IPv6 + connections. Handling IPv4 connections with an IPv6 socket uses + IPv4-mapped IPv6 addresses, which are allowed by default on most + platforms, but are disallowed by default on FreeBSD, NetBSD, and + OpenBSD, in order to match the system-wide policy on those + platforms. On systems where it is disallowed by default, a + special configure parameter can change this behavior + for httpd.

    + +

    On the other hand, on some platforms, such as Linux and Tru64, the + only way to handle both IPv6 and IPv4 is to use + mapped addresses. If you want httpd to handle IPv4 and IPv6 connections + with a minimum of sockets, which requires using IPv4-mapped IPv6 + addresses, specify the --enable-v4-mapped configure option.

    + +

    --enable-v4-mapped is the default on all platforms except + FreeBSD, NetBSD, and OpenBSD, so this is probably how your httpd was + built.

    + +

    If you want httpd to handle IPv4 connections only, regardless of + what your platform and APR will support, specify an IPv4 address on all + Listen directives, as in the + following examples:

    + +
    Listen 0.0.0.0:80
    +Listen 192.0.2.1:80
    +
    + +

    If your platform supports it and you want httpd to handle IPv4 and + IPv6 connections on separate sockets (i.e., to disable IPv4-mapped + addresses), specify the --disable-v4-mapped configure option. --disable-v4-mapped is the + default on FreeBSD, NetBSD, and OpenBSD.

    +
    top
    +
    +

    Specifying the protocol with Listen

    + +

    The optional second protocol argument of + Listen + is not required for most + configurations. If not specified, https is the default for + port 443 and http the default for all other ports. The + protocol is used to determine which module should handle a request, and + to apply protocol specific optimizations with the + AcceptFilter directive.

    + +

    You only need to set the protocol if you are running on non-standard + ports. For example, running an https site on port 8443:

    + +
    Listen 192.170.2.1:8443 https
    +
    +
    top
    +
    +

    How This Works With Virtual Hosts

    + + +

    The Listen directive does not implement + Virtual Hosts - it only tells the + main server what addresses and ports to listen on. If no + <VirtualHost> + directives are used, the server will behave + in the same way for all accepted requests. However, + <VirtualHost> + can be used to specify a different behavior + for one or more of the addresses or ports. To implement a + VirtualHost, the server must first be told to listen to the + address and port to be used. Then a + <VirtualHost> section + should be created for the specified address and port to set the + behavior of this virtual host. Note that if the + <VirtualHost> + is set for an address and port that the + server is not listening to, it cannot be accessed.

    +
    +
    +

    Available Languages:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/bind.html.fr.utf8 b/docs/manual/bind.html.fr.utf8 new file mode 100644 index 0000000..58177c8 --- /dev/null +++ b/docs/manual/bind.html.fr.utf8 @@ -0,0 +1,254 @@ + + + + + +Ecoute sélective - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Ecoute sélective

    +
    +

    Langues Disponibles:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Configuration du serveur HTTP Apache pour l'écoute + sur un port et une adresse IP spécifiques.

    +
    + +
    top
    +
    +

    Vue d'ensemble

    + + + + + +

    Au démarrage de httpd, un port et une adresse lui sont associés sur + l'hôte local et le serveur se met en attente de l'arrivée d'une requête. + Par défaut, le serveur écoute toutes les adresses de l'hôte local. + Cependant, on peut lui préciser des ports et des adresses spécifiques à + écouter, ou une combinaison des deux. Tout ceci est souvent associé avec la + fonctionnalité des serveurs virtuels qui détermine la + manière dont httpd répond aux différents ports, noms d'hôtes et + adresses IP.

    + +

    La directive Listen permet + d'indiquer au serveur qu'il ne doit accepter des requêtes que sur le(s) + port(s) spécifiés ou une combinaison adresse/port. Si seul un numéro de port + est spécifié dans la directive Listen, le serveur se met à l'écoute sur ce + port et sur toutes les interfaces réseau. Si une adresse IP est spécifiée + en plus du port, le serveur va écouter sur ce port et uniquement sur + l'interface réseau correspondante. On peut utiliser plusieurs directives + Listen pour spécifier plusieurs + adresses et ports à écouter. Le serveur répondra alors aux requêtes sur tous + les ports et adresses spécifiés.

    + +

    Par exemple, pour faire en sorte que le serveur accepte des connexions + sur les ports 80 et 8000 et sur toutes les interfaces, utilisez :

    + +
    Listen 80
    +Listen 8000
    +
    + +

    Pour faire en sorte que le serveur accepte des connexions sur le port 80 + pour une interface, et sur le port 8000 pour une + autre interface, utilisez :

    + +
    Listen 192.0.2.1:80
    +Listen 192.0.2.5:8000
    +
    + +

    Les adresses IPv6 doivent être mises entre crochets, comme dans + l'exemple suivant :

    + +
    Listen [2001:db8::a00:20ff:fea7:ccea]:80
    +
    + +

    Des directives Listen + imbriquées provoqueront une erreur fatale qui + empêchera le serveur de démarrer.

    + +

    + (48)Address already in use: make_sock: could not bind to address [::]:80 +

    + +

    Voir cette + discussion dans le wiki pour plus de détails à propos de la résolution + de ce problème.

    + +
    + +
    top
    +
    +

    Changer la configuration de l'écoute au redémarrage

    + + +

    Lorsque httpd est redémarré, certaines remarques sont à prendre en compte + quant aux modifications apportées aux directives Listen. Au cours du redémarrage, httpd + conserve la liaison avec les ports de la configuration précédente afin + d'éviter l'obtention d'un message d'erreur "Connection refused" lors d'une + tentative ultérieure de connexion au serveur. Si les modifications apportées au jeu de + directives Listen utilisé entrent + en conflit avec ce dernier, le serveur refusera de redémarrer.

    + +

    Par exemple, modifier la configuration suivante :

    + +
    Listen 127.0.0.1:80
    +
    + +

    pour utiliser la suivante pourra échouer car écouter le port 80 sur + toutes les adresses IP entre en conflit avec une écoute sélective du port 80 + sur la seule adresse IP 127.0.0.1.

    + +
    Listen 80
    +
    + +

    Pour qu'une telle modification de configuration soit prise en compte avec + succès, il est nécessaire d'arrêter, puis de démarrer le serveur.

    + +
    top
    +
    +

    Remarques spécifiques à IPv6

    + + +

    Un nombre croissant de plateformes implémentent IPv6, et + APR supporte IPv6 sur la plupart d'entre elles, + ce qui permet à httpd d'allouer des points de connexion (sockets) IPv6 + et de traiter des requêtes envoyées sur IPv6.

    + +

    Les administrateurs de httpd doivent se préoccuper de la possibilité + pour un point de connexion IPv6 de traiter à la fois des connexions IPv4 + et des connexions IPv6. + Le traitement de connexions IPv4 avec un point de connexion IPv6 utilise + des adresses IPv6 traduites en IPv4 qui sont autorisées par défaut sur la + plupart des plateformes, mais sont interdites par défaut sous FreeBSD, NetBSD, + et OpenBSD, afin de respecter la politique de sécurité du système sur ces plateformes. + Sur les systèmes où ces adresses sont interdites par défaut, un + paramètre spécial du script configure permet de modifier + ce comportement pour httpd.

    + +

    En revanche, sur certaines plateformes comme Linux et Tru64, la + seule manière de gérer à la fois IPv6 et IPv4 passe + par l'utilisation d'adresses traduites. Si vous voulez que httpd gère + des connexions IPv4 et IPv6 avec un minimum de points de connexion, + ce qui nécessite l'utilisation d'adresses IPv6 traduites en IPv4, + utilisez l'option --enable-v4-mapped du script configure.

    + +

    L'option --enable-v4-mapped est utilisée par défaut sur + toutes les plateformes sauf FreeBSD, NetBSD, et OpenBSD ; + votre httpd a donc probablement été construit avec cette option.

    + +

    Si vous souhaitez que httpd ne gère que des connexions IPv4, sans se + soucier de ce que votre plateforme et APR supportent, spécifiez une adresse + IPv4 dans toutes les directives + Listen, comme dans l'exemple + suivant :

    + +
    Listen 0.0.0.0:80
    +Listen 192.0.2.1:80
    +
    + +

    Si votre plateforme le supporte et si vous souhaitez que httpd gère + des connexions IPv4 et IPv6 sur des points de connexion séparés + (c'est à dire désactiver la traduction des adresses IPv6 au format IPv4), + utilisez l'option --disable-v4-mapped du script + configure. --disable-v4-mapped est + utilisée par défaut sur FreeBSD, NetBSD, et OpenBSD.

    +
    top
    +
    +

    Spécification du protocole avec Listen

    + +

    Dans la plupart des configurations, le second paramètre optionnel + protocol de la directive Listen n'est pas obligatoire. S'il + n'est pas spécifié, les protocoles par défaut + sont https pour le port 443, et http pour + tous les autres ports. Le protocole sert à déterminer quel module + doit traiter une requête, et à appliquer les optimisations + spécifiques au protocole à l'aide de la directive AcceptFilter.

    + +

    Vous ne devez définir le protocole que si vous travaillez avec + des ports non standards. Par exemple, pour travailler en + https sur le port 8443 :

    + +
    Listen 192.170.2.1:8443 https
    +
    +
    top
    +
    +

    Qu'en est-il avec les serveurs virtuels

    + + +

    La directive Listen n'implémente pas les serveurs virtuels. + Elle indique simplement au serveur principal sur quels adresses et ports + il doit écouter. Si aucune directive + <VirtualHost> + n'est présente, le serveur se comportera de la même façon pour toutes + les requêtes acceptées. En revanche, la directive + <VirtualHost> + peut être utilisée pour provoquer une réaction différente du serveur + pour un ou plusieurs adresses ou ports. Pour implémenter un serveur virtuel, + on doit d'abord indiquer au serveur sur quels adresses et ports il doit écouter. + Ensuite, une section + <VirtualHost> + doit être créée pour le couple adresse+port spécifié afin de définir le + comportement de cet hôte virtuel. Notez que si la directive + <VirtualHost> + est définie pour une adresse et un port sur lesquels le serveur n'est pas censé + écouter, cet hôte virtuel ne sera pas accessible.

    +
    +
    +

    Langues Disponibles:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/bind.html.ja.utf8 b/docs/manual/bind.html.ja.utf8 new file mode 100644 index 0000000..255205b --- /dev/null +++ b/docs/manual/bind.html.ja.utf8 @@ -0,0 +1,209 @@ + + + + + +ãƒã‚¤ãƒ³ãƒ‰ - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    ãƒã‚¤ãƒ³ãƒ‰

    +
    +

    翻訳済ã¿è¨€èªž:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + +

    Apache ãŒä½¿ç”¨ã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã¨ãƒãƒ¼ãƒˆã®è¨­å®šã‚’ã—ã¾ã™ã€‚

    +
    + +
    top
    +
    +

    概è¦

    + + + + + +

    Apache ã¯èµ·å‹•時ã«ã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒžã‚·ãƒ³ã®ã‚ã‚‹ãƒãƒ¼ãƒˆãŠã‚ˆã³ã‚¢ãƒ‰ãƒ¬ã‚¹ + ã«å¯¾ã—ã¦æŽ¥ç¶šã—ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒæ¥ã‚‹ã®ã‚’å¾…ã¡ã¾ã™ã€‚ + デフォルトã§ã¯ãƒžã‚·ãƒ³ã®ã™ã¹ã¦ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«å¯¾ã—㦠Listen ã—ã¾ã™ã€‚ + 特定ã®ãƒãƒ¼ãƒˆã‹ã€ç‰¹å®šã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ã¿ã‹ã€ + ã¾ãŸã¯ãれらã®çµ„ã¿åˆã‚ã›ã§ Listen ã™ã‚‹ã‚ˆã†ã«æŒ‡å®šã—ãŸã„å ´åˆã‚‚ã‚りã¾ã™ã€‚ + ç•°ãªã‚‹ IP アドレスã€ãƒ›ã‚¹ãƒˆåã€ãƒãƒ¼ãƒˆã«å¯¾ã—㦠Apache ãŒã©ã®ã‚ˆã†ã« + 応答ã™ã‚‹ã‹ã‚’制御ã™ã‚‹ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆæ©Ÿèƒ½ã¨çµ„ã¿åˆã‚ã›ã¦ã‚ˆã使ã‚れã¾ã™ã€‚

    + +

    Listen + ディレクティブã§ã€ç‰¹å®šã®ãƒãƒ¼ãƒˆã‚„アドレス・ãƒãƒ¼ãƒˆã®çµ„ã‹ã‚‰å…¥ã£ã¦ãã‚‹ + リクエストã®ã¿ã‚’å—ã‘付ã‘るよã†ã«ã§ãã¾ã™ã€‚ + ã‚‚ã—ãƒãƒ¼ãƒˆç•ªå·ã ã‘㌠Listen + ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã§æŒ‡å®šã•れãŸå ´åˆã¯ã€ + ã™ã¹ã¦ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェースã®ä¸Žãˆã‚‰ã‚ŒãŸãƒãƒ¼ãƒˆç•ªå·ã«å¯¾ã—㦠+ Listen ã—ã¾ã™ã€‚ IP アドレスã¨ãƒãƒ¼ãƒˆç•ªå·ã¨ãŒåŒæ™‚ã«ä¸Žãˆã‚‰ã‚ŒãŸå ´åˆã¯ã€ + サーãƒã¯ä¸Žãˆã‚‰ã‚ŒãŸã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェースã®ãƒãƒ¼ãƒˆã‚’ Listen ã—ã¾ã™ã€‚ + Listen ディレクティブを複数使ã£ã¦ + Listen ã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã¨ãƒãƒ¼ãƒˆã‚’ã„ãã¤ã‚‚指定ã§ãã¾ã™ã€‚ + サーãƒã¯æŒ‡å®šã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã‚„ãƒãƒ¼ãƒˆã‹ã‚‰ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã™ã¹ã¦ã« + 対ã—ã¦å¿œç­”ã—ã¾ã™ã€‚

    + +

    ãŸã¨ãˆã°ã€å…¨ã¦ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェースã®ãƒãƒ¼ãƒˆ 80 㨠8000 ã®ä¸¡æ–¹ã«ãŠã„㦠+ 接続をå—ã‘付ã‘ã‚‹ã«ã¯

    + +

    + Listen 80
    + Listen 8000 +

    + +

    ã¨ã—ã¾ã™ã€‚ + ã‚るインターフェースã§ã¯ 80 番ã§ã€ã¾ãŸã€åŒæ™‚ã«ä»–ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェース㮠+ 8000 番ãƒãƒ¼ãƒˆã§æŽ¥ç¶šã‚’å—ã‘付ã‘ã‚‹ã«ã¯ã€ +

    + +

    + Listen 192.0.2.1:80
    + Listen 192.0.2.5:8000 +

    + +

    ã¨ã—ã¾ã™ã€‚ + IPv6 アドレスã¯ã€è§’æ‹¬å¼§ã§æ¬¡ã®ä¾‹ã®ã‚ˆã†ã«å›²ã¾ãªã‘れã°ã„ã‘ã¾ã›ã‚“。

    + +

    + Listen [2001:db8::a00:20ff:fea7:ccea]:80 +

    +
    top
    +
    +

    IPv6 ã®ç‰¹è¨˜äº‹é …

    + + +

    多ãã®ãƒ—ラットホーム㧠IPv6 ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ãã¦ã„ã¦ã€ + APR ã¯ã“れらã®ã»ã¨ã‚“ã©ã§ IPv6 をサãƒãƒ¼ãƒˆã—ã¦ã„ã‚‹ã®ã§ã€ + Apache 㯠IPv6 ソケットを割り当ã¦ã¦ IPv6 + 経由ã§é€ã‚‰ã‚Œã¦ããŸãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’扱ã†ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    IPv6 ソケット㌠IPv4 㨠IPv6 コãƒã‚¯ã‚·ãƒ§ãƒ³ã®ä¸¡æ–¹ã‚’扱ã†ã“ã¨ãŒã§ãã‚‹ã‹ + ã©ã†ã‹ã¯ã€Apache 管ç†è€…ã«ã¨ã£ã¦åބ介ãªå•題ã§ã™ã€‚ + IPv4 コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’ IPv6 ã‚½ã‚±ãƒƒãƒˆã§æ‰±ã†å ´åˆã¯ã€ + IPv4 マップã•れ㟠IPv6 アドレスを使用ã—ã¦ã„ã¦ã€ + ã»ã¨ã‚“ã©ã®ãƒ—ラットホームã§ã¯ãƒ‡ãƒ•ォルトã§ä½¿ç”¨å¯èƒ½ã§ã™ãŒã€ + FreeBSD, NetBSD, OpenBSD ã§ã¯ã€ã‚·ã‚¹ãƒ†ãƒ å…¨ä½“ã¨ã—ã¦ã®ãƒãƒªã‚·ãƒ¼ã¨ã®æ•´åˆæ€§ã‹ã‚‰ã€ + デフォルトã§ã¯ä½¿ç”¨ä¸å¯ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚ + ã“れらã®ãƒ‡ãƒ•ォルトã§ä½¿ç”¨ä¸å¯ã®ãƒ—ラットホームã§ã‚ã£ã¦ã‚‚〠+ 特別㪠configure ã® + 設定パラメータ㧠Apache ã®æŒ™å‹•を変化ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    一方ã§ã€Linux ã‚„ Tru64 ã¨ã„ã£ãŸãƒ—ラットホーム㧠IPv4 㨠IPv6 + ã®ä¸¡æ–¹ã‚’扱ã†ã«ã¯ã€ãƒžãƒƒãƒ—ドアドレスを使用ã™ã‚‹ä»¥å¤–ã®æ–¹æ³•ã¯ã‚りã¾ã›ã‚“。 + IPv4 㨠IPv6 ã®ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’最å°é™ã®ã‚½ã‚±ãƒƒãƒˆã§æ‰±ã„ãŸã„ã®ã§ã‚れã°ã€ + IPv4 マップ㮠IPv6 アドレスを使用ã™ã‚‹å¿…è¦ãŒã‚り〠+ --enable-v4-mapped configure + オプションを指定ã—ã¾ã™ã€‚

    + +

    --enable-v4-mapped ã¯ã€ + FreeBSD, NetBSD, OpenBSD 以外ã®å…¨ã¦ã®ãƒ—ラットホームã§ã®ãƒ‡ãƒ•ォルトã§ã™ã€‚ + ã§ã™ã‹ã‚‰ã€ãŠãらããŠæ‰‹å…ƒã® Apache ã¯ã“ã®è¨­å®šã§ãƒ“ルドã•れã¦ã„ã‚‹ã§ã—ょã†ã€‚

    + +

    プラットフォームや APR ãŒä½•をサãƒãƒ¼ãƒˆã™ã‚‹ã‹ã«é–¢ã‚らãšã€ + IPv4 コãƒã‚¯ã‚·ãƒ§ãƒ³ã®ã¿ã‚’扱ã†ã‚ˆã†ã«ã—ãŸã„å ´åˆã¯ã€ + 次ã®ä¾‹ã®ã‚ˆã†ã«å…¨ã¦ã® + Listen ディレクティブ㧠+ IPv4 アドレスを指定ã—ã¦ãã ã•ã„。

    + +

    + Listen 0.0.0.0:80
    + Listen 192.0.2.1:80 +

    + +

    æ¡ä»¶ã‚’満ãŸã™ãƒ—ラットホームã§ã€Apache ㌠+ IPv4 㨠IPv6 ã®ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’別々ã®ã‚½ã‚±ãƒƒãƒˆã§æ‰±ã†ã‚ˆã†ã«ã—ãŸã„å ´åˆ + (ã¤ã¾ã‚Š IPv4 マップã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’無効ã«ã—ãŸã„å ´åˆ) + ã¯ã€--disable-v4-mapped + configure + オプションを指定ã—ã¦ã€æ¬¡ã®ã‚ˆã†ã«å€‹åˆ¥æŒ‡å®šã® + Listen + ディレクティブを使用ã—ã¦ãã ã•ã„。 + --disable-v4-mapped ã¯ã€ + FreeBSD, NetBSD, OpenBSD プラットホームã§ã®ãƒ‡ãƒ•ォルトã§ã™ã€‚

    +
    top
    +
    +

    ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã«å¯¾ã—ã¦ã©ã†åƒãã®ã‹

    + + +

    Listen ディレクティブ + ã§ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆãŒå®Ÿè£…ã•れるã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“。 + Listen ã¯å˜ã«ãƒ¡ã‚¤ãƒ³ã‚µãƒ¼ãƒã«ã©ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã¨ãƒãƒ¼ãƒˆã‚’ Listen ã™ã¹ãã‹ã‚’ + æ•™ãˆã‚‹ã ã‘ã§ã™ã€‚ + <VirtualHost> + ディレクティブãŒä½¿ã‚れãªã„å ´åˆã¯ã€ + å—ã‘入れãŸãƒªã‚¯ã‚¨ã‚¹ãƒˆã™ã¹ã¦ã«å¯¾ã—ã¦å…¨ãåŒã˜æŒ™å‹•ã‚’ã—ã¾ã™ã€‚ + ã—ã‹ã—ãªãŒã‚‰ + <VirtualHost> + を使ã£ã¦ã€ + 一ã¤ä»¥ä¸Šã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚„ãƒãƒ¼ãƒˆã«å¯¾ã—ã¦ç•°ãªã‚‹æŒ™å‹•ã‚’ã™ã‚‹ã‚ˆã†ã« + 指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + VirtualHost を実装ã™ã‚‹ã«ã¯ã€ã¾ãšåˆã‚ã«ä½¿ç”¨ã—ãŸã„アドレスã¨ãƒãƒ¼ãƒˆã«å¯¾ã—㦠+ サーãƒãŒ Listen ã—ã¦ã„ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 + ãã—ã¦ã€ãã®æŒ‡å®šã—ãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã¨ãƒãƒ¼ãƒˆã§ã® + ã“ã®ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã®æŒ™å‹•を設定ã™ã‚‹ãŸã‚ã«ã€ + <VirtualHost> + セクションを作りã¾ã™ã€‚ã‚‚ã— + <VirtualHost> + ㌠Listen ã—ã¦ã„ãªã„アドレスã¨ãƒãƒ¼ãƒˆã«å¯¾ã—㦠+ 設定ã•れã¦ã—ã¾ã†ã¨ã€ + ãれã«ã¯ã‚¢ã‚¯ã‚»ã‚¹ã§ããªã„ã¨ã„ã†ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。

    +
    +
    +

    翻訳済ã¿è¨€èªž:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/bind.html.ko.euc-kr b/docs/manual/bind.html.ko.euc-kr new file mode 100644 index 0000000..d5eb29a --- /dev/null +++ b/docs/manual/bind.html.ko.euc-kr @@ -0,0 +1,179 @@ + + + + + +ÁÖ¼Ò¿Í Æ÷Æ® ÁöÁ¤ (Binding) - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    ÁÖ¼Ò¿Í Æ÷Æ® ÁöÁ¤ (Binding)

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + +

    ¾ÆÆÄÄ¡°¡ ƯÁ¤ ÁÖ¼Ò¿Í Æ÷Æ®¿¡¼­ ¼­ºñ½ºÇϵµ·Ï ¼³Á¤Çϱâ.

    +
    + +
    top
    +
    +

    °³¿ä

    + + + + + +

    ¾ÆÆÄÄ¡¸¦ ½ÃÀÛÇÏ¸é ¾ÆÆÄÄ¡´Â ÄÄÇ»ÅÍÀÇ ¾î¶² Æ÷Æ®¿Í ÁÖ¼Ò¿¡ + ¿¬°áÇÏ¿©, µé¾î¿À´Â ¿äûÀ» ±â´Ù¸°´Ù. ±âº»ÀûÀ¸·Î ¾ÆÆÄÄ¡´Â + ÄÄÇ»ÅÍÀÇ ¸ðµç ÁÖ¼Ò¿¡¼­ ±â´Ù¸°´Ù. ±×·¯³ª ¾ÆÆÄÄ¡°¡ ƯÁ¤ Æ÷Æ®³ª + ¼±ÅÃÇÑ ÁÖ¼Ò¸¸À» ±â´Ù¸®°Ô ÇØ¾ßÇÒ °æ¿ì°¡ ÀÖ´Ù. ¶Ç ÀÌ ¹®Á¦´Â + ¾ÆÆÄÄ¡°¡ ¾î¶»°Ô ´Ù¸¥ IP ÁÖ¼Ò, È£½ºÆ®¸í, Æ÷Æ®¿¡ ¹ÝÀÀÇÒÁö¸¦ + °áÁ¤ÇÏ´Â °¡»óÈ£½ºÆ® ±â´É°úµµ °ü·ÃµÇÀÖ´Ù.

    + +

    Listen Áö½Ã¾î´Â + ¼­¹ö°¡ ƯÁ¤ Æ÷Æ®³ª ÁÖ¼Ò¿Í Æ÷Æ® Á¶ÇÕ¿¡¼­¸¸ ¿äûÀ» ¹Þ°Ô + ÇÑ´Ù. Listen + Áö½Ã¾î¿¡ Æ÷Æ® ¹øÈ£¸¸ ÁöÁ¤Çϸé, ¼­¹ö´Â ¸ðµç ÀÎÅÍÆäÀ̽º¿¡¼­ + ÁöÁ¤ÇÑ Æ÷Æ®¸¦ ±â´Ù¸°´Ù. ¿©·¯ Listen Áö½Ã¾î·Î ±â´Ù¸± ¿©·¯ + ÁÖ¼Ò¿Í Æ÷Æ®¸¦ ÁöÁ¤ÇÒ ¼öµµ ÀÖ´Ù. ¼­¹ö´Â ¿­°ÅÇÑ ÁÖ¼Ò¿Í Æ÷Æ®·Î + ¿äûÀÌ µé¾î¿À¸é ÀÀ´äÇÑ´Ù.

    + +

    ¿¹¸¦ µé¾î, ¼­¹ö°¡ 80¹ø°ú 8000¹ø Æ÷Æ® ¸ðµÎ¿¡¼­ ¿¬°áÀ» + ¹Þµµ·Ï ÇÏ·Á¸é:

    + +

    + Listen 80
    + Listen 8000 +

    + +

    ¼­¹ö°¡ ÁöÁ¤ÇÑ µÎ ÀÎÅÍÆäÀ̽º¿Í Æ÷Æ®¿¡¼­ ¿¬°áÀ» ±â´Ù¸®µµ·Ï + ÇÏ·Á¸é,

    + +

    + Listen 192.0.2.1:80
    + Listen 192.0.2.5:8000 +

    + +

    IPv6 ÁÖ¼Ò´Â ´ÙÀ½°ú °°ÀÌ ´ë°ýÈ£·Î ¹­¾î¾ß ÇÑ´Ù:

    + +

    + Listen [2001:db8::a00:20ff:fea7:ccea]:80 +

    +
    top
    +
    +

    IPv6¿¡¼­ Ưº°È÷ °í·ÁÇÒ Á¡

    + + +

    IPv6¸¦ ±¸ÇöÇÑ Ç÷¡ÆûÀÌ ´Ã°í ÀÖ°í APRÀÌ À̵é Ç÷¡Æû ´ëºÎºÐ¿¡¼­ + IPv6¸¦ Áö¿øÇϱ⶧¹®¿¡, ¾ÆÆÄÄ¡´Â IPv6 ¼ÒÄÏÀ» ÇÒ´çÇÏ¿© IPv6·Î + ¹ÞÀº ¿äûÀ» ó¸®ÇÒ ¼ö ÀÖ´Ù.

    + +

    ¾ÆÆÄÄ¡ °ü¸®ÀÚ¿¡°Ô º¹ÀâÇÑ ºÎºÐÀº IPv6 ¼ÒÄÏÀÌ IPv4 ¿¬°á°ú + IPv6 ¿¬°áÀ» ¸ðµÎ ó¸®ÇÒ ¼ö ÀÖ´À³Ä´Â Á¡ÀÌ´Ù. ´ëºÎºÐÀÇ Ç÷¡Æû¿¡¼­´Â + IPv4-´ëÀÀ(mapped) IPv6 ÁÖ¼Ò¸¦ »ç¿ëÇÏ¿© IPv6 ¼ÒÄÏ¿¡¼­ IPv4 + ¿¬°áÀ» ¹ÞÁö¸¸, FreeBSD¿Í NetBSD¿Í OpenBSDÀº ½Ã½ºÅÛÀüü Á¤Ã¥¶§¹®¿¡ + ±âº»ÀûÀ¸·Î Çã¿ëÇÏÁö ¾Ê´Â´Ù. ±×·¯³ª ±âº»ÀûÀ¸·Î Çã¿ëÇÏÁö¾Ê´Â + ½Ã½ºÅÛÀÌ¶óµµ ¾ÆÆÄÄ¡¸¦ À§ÇØ Æ¯º°ÇÑ ¼³Á¤ ÆÄ¶ó¹ÌÅÍ·Î º¯°æÇÒ + ¼ö ÀÖ´Ù.

    + +

    ¹Ý¸é ¸®´ª½º¿Í Tru64 °°Àº ÀϺΠÇ÷¡Æû¿¡¼­ IPv4¿Í IPv6À» + ¸ðµÎ ó¸®ÇÏ·Á¸é ´ëÀÀ ÁÖ¼Ò¸¦ »ç¿ëÇØ¾ß¸¸ + ÇÑ´Ù. ¾ÆÆÄÄ¡°¡ ÃÖ¼ÒÇÑÀÇ ¼ÒÄÏÀ» »ç¿ëÇÏ¿© IPv4 ¿¬°á°ú IPv6 + ¿¬°áÀ» ¸ðµÎ ¹Þµµ·ÏÇÏ·Á¸é, IPv4-´ëÀÀ IPv6 ÁÖ¼Ò¸¦ »ç¿ëÇϰí + configure ¿É¼Ç + --enable-v4-mapped¸¦ ÁöÁ¤ÇÑ´Ù.

    + +

    --enable-v4-mapped´Â FreeBSD, NetBSD, OpenBSD¸¦ + Á¦¿ÜÇÑ ¸ðµç Ç÷¡Æû¿¡¼­ ±âº»°ªÀ̰í, ¾Æ¸¶µµ ´ç½ÅÀÇ ¾ÆÆÄÄ¡µµ + ¸¶Âù°¡ÁöÀÏ °ÍÀÌ´Ù.

    + +

    Ç÷¡Æû°ú APRÀÇ Áö¿ø¿©ºÎ¿Í °ü°è¾øÀÌ ¾ÆÆÄÄ¡°¡ IPv4 ¿¬°á¸¸À» + ¹Þµµ·ÏÇÏ·Á¸é, ´ÙÀ½ ¿¹Á¦¿Í °°ÀÌ ¸ðµç Listen Áö½Ã¾î¿¡ IPv4 ÁÖ¼Ò¸¦ + »ç¿ëÇÑ´Ù:

    + +

    + Listen 0.0.0.0:80
    + Listen 192.0.2.1:80 +

    + +

    Ç÷¡Æû¿¡¼­ Áö¿øÇÏ¸ç ¾ÆÆÄÄ¡°¡ ¼­·Î ´Ù¸¥ ¼ÒÄÏÀ¸·Î IPv4 + ¿¬°á°ú IPv6 ¿¬°áÀ» ¹Þµµ·ÏÇÏ·Á¸é (Áï IPv4-´ëÀÀ ÁÖ¼Ò¸¦ »ç¿ëÇÏÁö + ¾ÊÀ¸·Á¸é), configure + ¿É¼Ç --disable-v4-mapped¸¦ + ÁöÁ¤ÇÑ´Ù. --disable-v4-mapped´Â FreeBSD, NetBSD, + OpenBSD¿¡¼­ ±âº»°ªÀÌ´Ù.

    + +
    top
    +
    +

    °¡»óÈ£½ºÆ®¿Í ¾î¶»°Ô ¿¬°üµÇ³ª

    + + +

    ListenÀº + °¡»óÈ£½ºÆ®¸¦ ¸¸µéÁö ¾Ê´Â´Ù. ÀÌ´Â ´ÜÁö ÁÖ¼­¹ö°¡ + ¾î¶² ÁÖ¼Ò¿Í Æ÷Æ®¸¦ ±â´Ù¸±Áö¸¸ ¾Ë·ÁÁØ´Ù. <VirtualHost> Áö½Ã¾î¸¦ + »ç¿ëÇÏÁö ¾ÊÀ¸¸é, ¼­¹ö´Â ¹ÞÀº ¸ðµç ¿äûÀ» ¶È°°ÀÌ Ã³¸®ÇÑ´Ù. + ±×·¯³ª <VirtualHost>·Î ¿©·¯ ÁÖ¼Ò¿Í Æ÷Æ®¿¡ + ´ëÇØ ´Ù¸¥ ÇൿÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. °¡»óÈ£½ºÆ®¸¦ ¸¸µé·Á¸é + ¸ÕÀú ¼­¹ö¿¡°Ô »ç¿ëÇÒ ÁÖ¼Ò¿Í Æ÷Æ®¸¦ ¾Ë·ÁÁà¾ß ÇÑ´Ù. ±×¸®°í + ƯÁ¤ ÁÖ¼Ò¿Í Æ÷Æ®¿¡ ´ëÇÑ °¡»óÈ£½ºÆ®ÀÇ ÇൿÀ» ÁöÁ¤ÇÒ + <VirtualHost> + ¼½¼ÇÀÌ ÇÊ¿äÇÏ´Ù. ÁÖ¼­¹ö°¡ ±â´Ù¸®Áö¾Ê´Â ÁÖ¼Ò¿Í Æ÷Æ®¸¦ »ç¿ëÇÏ´Â + <VirtualHost>´Â + Á¢±ÙÇÒ ¼ö ¾øÀ½À» ÁÖÀÇÇ϶ó.

    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/bind.html.tr.utf8 b/docs/manual/bind.html.tr.utf8 new file mode 100644 index 0000000..3f3acab --- /dev/null +++ b/docs/manual/bind.html.tr.utf8 @@ -0,0 +1,244 @@ + + + + + +Adresleri ve Portları Dinleme - Apache HTTP Sunucusu Sürüm 2.4 + + + + + + + +
    <-
    +

    Adresleri ve Portları Dinleme

    +
    +

    Mevcut Diller:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Apache HTTPD sunucusunun belli adresleri ve portları dinlemek üzere + yapılandırılması.

    +
    + +
    top
    +
    +

    Genel Bakış

    + + + + + +

    httpd başlatıldığında yerel makinedeki bazı adres ve portları kendine + bağlar ve gelecek istekleri bekler. Öntanımlı olarak makine üzerindeki + tüm adresleri dinler. Bununla birlikte, belli portları veya sadece + seçilmiş bazı adresleri ya da her ikisini de dinlemesi için bunun + belirtilmesi gerekebilir. Bu çoğunlukla, httpd’nin farklı IP + adreslerine, konak isimlerine ve portlarına nasıl yanıt vereceğinin + belirlendiği sanal konak özelliği ile birlikte + yürür.

    + +

    Listen yönergesi sunucuya + gelen istekleri sadece belli port(lar)dan veya belli adres ve port + birleşimlerinden kabul etmesini söyler. Listen yönergesinde sadece port + numarası belirtilmişse sunucu tüm arabirimlerin belirtilen portunu + dinleyecektir. Portla birlikte bir IP adresi de belirtilmişse sunucu + belirtilen portu ve arabirimi dinleyecektir. Çok sayıda adres ve portu + dinlemek için çok sayıda Listen yönergesi kullanılabilir. Sunucu + böyle bir durumda belirtilen bütün adres ve portlardan gelen isteklere + yanıt verecektir.

    + +

    Örneğin, sunucunun hem 80 portundan hem de 8000 portundan gelen + bağlantıları kabul etmesini sağlamak için,

    + +
    Listen 80
    +Listen 8000
    +
    + +

    yapılandırmasını kullanabilirsiniz. Sunucunun 80 portuna gelen + bağlantıları bir arabirimden 8000 portuna gelenleri ise başka bir + arabirimden kabul etmesini sağlamak için ise,

    + +
    Listen 192.0.2.1:80
    +Listen 192.0.2.5:8000
    +
    + +

    yapılandırmasını kullanabilirsiniz. IPv6 adresleri aşağıdaki örnekteki + gibi köşeli ayraçlar içine alınarak belirtilmelidir:

    + +
    Listen [2001:db8::a00:20ff:fea7:ccea]:80
    +
    + +
    +

    Bir Listen yönergesinin + aynısının tekrarı sunucunun başlatılmasını engelleyen ölümcül bir hatayla + sonuçlanacaktır.

    + +

    + (48)Address already in use: make_sock: could not bind to address [::]:80 +

    + +

    Sorun giderme ile ilgili ipuçları için + wiki + belgesine bakınız.

    +
    + +
    top
    +
    +

    Dinleme yapılandırmasının yeniden başlatırken değiştirilmesi

    + + +

    httpd yeniden başlatılırken, + Listen yönergelerindeki + değişiklikler için özel değerlendirmeler yapılmalıdır. Yeniden başlatma + sırasında, httpd, yeni bağlanma çabalarında "Connection refused" (bağlantı + reddedildi) hatasından kaçınmak için [özgün yapılandırmadaki gibi] portları + bağlı tutar. Bu bakımdan, Listen + yönergelerinden yapılan değişiklikler yenden başlatılrken yapılandırmanın + başarısız olmasına ve sunucunun sonlanmasına sebep olur.

    + +

    Örneğin:

    + +
    Listen 127.0.0.1:80
    +
    + +

    yapılandırmasını aşağıdakiyle değiştirmek yenden başlatma sırasında + sucunun hta verip sonlanmasına sebep olur. Çünkü, tüm adreslerden 80 porta + bağlanmak sadece 127.0.0.1 adresine bağlanmakla çelişir.

    + +
    Listen 80
    +
    + +

    Böyle değişikliklerin etkili olabilmesi için sunucu önce durdurulmalı + sonra başlatımalıdır (restart yerine stop ve start kullanılmalıdır).

    + +
    top
    +
    +

    IPv6 Adreslerin Durumu

    + + +

    IPv6’yı gerçekleyen platformların sayısı giderek artmaktadır. Bu + platformların çoğunda APR, httpd’nin IPv6 + soketleri ayırmasını mümkün kılarak IPv6’yı desteklemekte ve IPv6 + üzerinden gönderilmiş istekleri elde etmektedir.

    + +

    httpd yöneticilerinin kafasını karıştırıran tek şey IPv6 soketlerin + hem IPv4 hem de IPv6 bağlantılarını kabul edip etmeyeceğidir. IPv4 + bağlantılarını kabul eden IPv6 soketleri IPv4 eşlemli IPv6 adresleri + kullanırlar. Bu çoğu sistemde öntanımlı olarak böyleyken, FreeBSD, + NetBSD ve OpenBSD’de sistem geneline uygulanan kurallar gereğince + öntanımlı olarak buna izin verilmez; bu sistemlerde özel bir + configure parametresi ile httpd’nin + davranışı değiştirilebilir.

    + +

    Diğer taraftan, Linux ve Tru64 gibi bazı platformlarda hem IPv4 hem de + IPv6 adresleri kabul etmenin tek yolu eşlemli adresler + kullanmaktır. httpd’nin IPv4 ve IPv6 adresleri, IPv4 eşlemli + IPv6 adreslerin kullanımını gerektiren en az sayıda soketle kabul etmesini + istiyorsanız, configure betiğine + --enable-v4-mapped seçeneğini belirtiniz.

    + +

    --enable-v4-mapped seçeneği, FreeBSD, NetBSD ve OpenBSD + hariç tüm platformlarda öntanımlıdır. Muhtemelen siz de + httpd’nin böyle derlenmesini isterdiniz.

    + +

    Platformunuzun ve APR’nin neyi desteklediğine bakmaksızın + httpd’nin sadece IPv4 adresleri kabul etmesini istiyorsanız, + tüm Listen yönergelerinde + örnekteki gibi IPv4 adresleri belirtiniz:

    + +
    Listen 0.0.0.0:80
    +Listen 192.0.2.1:80
    +
    + +

    Platformunuz IPv4 ve IPv6 adresleri ayrı soketlerden kabul ediyorsa ve + httpd’nin de buna uygun davranmasını (yani IPv4 eşlemli IPv6 + adreslerin iptalini) istiyorsanız configure + betiğine --disable-v4-mapped seçeneğini belirtiniz. Bu + seçenek FreeBSD, NetBSD ve OpenBSD’de öntanımlıdır.

    +
    top
    +
    +

    Protokolü Listen ile Belirtme

    + +

    Listen yönergesinin isteğe + bağlı ikinci değiştirgesi protokol çoğu yapılandırmada gerekli + olmaz. Belirtilmediği takdirde, https için 443, + http için ise diğer bütün portlar öntanımlıdır. Protokol, + isteğin hangi modül tarafından işleneceğini ve AcceptFilter yönergesi ile uygulanacak + protokole özgü en iyilemeleri belirlemekte kullanılır.

    + +

    Sadece standartdışı bir port kullanmak isterseniz protokolü belirtmeniz + gerekir. Örneğin, birhttps sitesini port 8443 üzerinde + çalıştırmak isterseniz:

    + +
    Listen 192.170.2.1:8443 https
    +
    +
    top
    +
    +

    Sanal Konaklarla Nasıl Çalışır?

    + + +

    Listen yönergesi sanal + konaklar için gerçeklenmemiştir; sadece ana sunucuya hangi adresleri ve + portları dinleyeceğini söyler. Hiç <VirtualHost> yönergesi kullanılmamışsa sunucu + kabul edilen tüm isteklere aynı şekilde davranacaktır. Eğer bir veya + daha fazla adres ve port için farklı bir davranış belirtmek + istiyorsanız <VirtualHost> kullanabilirsiniz. Bir sanal + konağı gerçeklemek için önce sunucunun sanal konak için kullanacağı + adres ve portu dinleyeceğini belirtmek gerekir. Bundan sonra bu sanal + konağın davranışını ayarlamak üzere belirtilen adres ve port için bir + <VirtualHost> bölümü + oluşturulmalıdır. Yalnız dikkat edin, eğer <VirtualHost> için belirtilen adres ve port + sunucu tarafından dinlenmiyorsa ona erişemezsiniz.

    +
    +
    +

    Mevcut Diller:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Yorumlar

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/caching.html b/docs/manual/caching.html new file mode 100644 index 0000000..72dfd5b --- /dev/null +++ b/docs/manual/caching.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: caching.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: caching.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: caching.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/caching.html.en b/docs/manual/caching.html.en new file mode 100644 index 0000000..d6df8a8 --- /dev/null +++ b/docs/manual/caching.html.en @@ -0,0 +1,908 @@ + + + + + +Caching Guide - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Caching Guide

    +
    +

    Available Languages:  en  | + fr  | + tr 

    +
    + +

    This document supplements the mod_cache, + mod_cache_disk, mod_file_cache and htcacheclean reference documentation. + It describes how to use the Apache HTTP Server's caching features to accelerate web and + proxy serving, while avoiding common problems and misconfigurations.

    +
    + +
    top
    +
    +

    Introduction

    + + +

    The Apache HTTP server offers a range of caching features that + are designed to improve the performance of the server in various + ways.

    + +
    +
    Three-state RFC2616 HTTP caching
    +
    + mod_cache + and its provider modules + mod_cache_disk + provide intelligent, HTTP-aware caching. The content itself is stored + in the cache, and mod_cache aims to honor all of the various HTTP + headers and options that control the cacheability of content + as described in + Section + 13 of RFC2616. + mod_cache + is aimed at both simple and complex caching configurations, where + you are dealing with proxied content, dynamic local content or + have a need to speed up access to local files on a potentially + slow disk. +
    + +
    Two-state key/value shared object caching
    +
    + The shared object cache API (socache) + and its provider modules provide a + server wide key/value based shared object cache. These modules + are designed to cache low level data such as SSL sessions and + authentication credentials. Backends allow the data to be stored + server wide in shared memory, or datacenter wide in a cache such + as memcache or distcache. +
    + +
    Specialized file caching
    +
    + mod_file_cache + offers the ability to pre-load + files into memory on server startup, and can improve access + times and save file handles on files that are accessed often, + as there is no need to go to disk on each request. +
    +
    + +

    To get the most from this document, you should be familiar with + the basics of HTTP, and have read the Users' Guides to + Mapping URLs to the Filesystem and + Content negotiation.

    + +
    top
    +
    +

    Three-state RFC2616 HTTP caching

    + + + + + +

    The HTTP protocol contains built in support for an in-line caching + mechanism + + described by section 13 of RFC2616, and the + mod_cache module can be used to take advantage of + this.

    + +

    Unlike a simple two state key/value cache where the content + disappears completely when no longer fresh, an HTTP cache includes + a mechanism to retain stale content, and to ask the origin server + whether this stale content has changed and if not, make it fresh + again.

    + +

    An entry in an HTTP cache exists in one of three states:

    + +
    +
    Fresh
    +
    + If the content is new enough (younger than its freshness + lifetime), it is considered fresh. An + HTTP cache is free to serve fresh content without making any + calls to the origin server at all. +
    +
    Stale
    +
    +

    If the content is too old (older than its freshness + lifetime), it is considered stale. An + HTTP cache should contact the origin server and check whether + the content is still fresh before serving stale content to a + client. The origin server will either respond with replacement + content if not still valid, or ideally, the origin server will + respond with a code to tell the cache the content is still + fresh, without the need to generate or send the content again. + The content becomes fresh again and the cycle continues.

    + +

    The HTTP protocol does allow the cache to serve stale data + under certain circumstances, such as when an attempt to freshen + the data with an origin server has failed with a 5xx error, or + when another request is already in the process of freshening + the given entry. In these cases a Warning header + is added to the response.

    +
    +
    Non Existent
    +
    + If the cache gets full, it reserves the option to delete content + from the cache to make space. Content can be deleted at any time, + and can be stale or fresh. The htcacheclean tool can be + run on a once off basis, or deployed as a daemon to keep the size + of the cache within the given size, or the given number of inodes. + The tool attempts to delete stale content before attempting to + delete fresh content. +
    +
    + +

    Full details of how HTTP caching works can be found in + + Section 13 of RFC2616.

    + +

    Interaction with the Server

    + + +

    The mod_cache module hooks into the server in two + possible places depending on the value of the + CacheQuickHandler directive: +

    + +
    +
    Quick handler phase
    +
    +

    This phase happens very early on during the request processing, + just after the request has been parsed. If the content is + found within the cache, it is served immediately and almost + all request processing is bypassed.

    + +

    In this scenario, the cache behaves as if it has been "bolted + on" to the front of the server.

    + +

    This mode offers the best performance, as the majority of + server processing is bypassed. This mode however also bypasses the + authentication and authorization phases of server processing, so + this mode should be chosen with care when this is important.

    + +

    Requests with an "Authorization" header (for example, HTTP Basic + Authentication) are neither cacheable nor served from the cache + when mod_cache is running in this phase.

    +
    +
    Normal handler phase
    +
    +

    This phase happens late in the request processing, after all + the request phases have completed.

    + +

    In this scenario, the cache behaves as if it has been "bolted + on" to the back of the server.

    + +

    This mode offers the most flexibility, as the potential exists + for caching to occur at a precisely controlled point in the filter + chain, and cached content can be filtered or personalized before + being sent to the client.

    +
    +
    + +

    If the URL is not found within the cache, mod_cache + will add a filter to the filter stack in order + to record the response to the cache, and then stand down, allowing normal + request processing to continue. If the content is determined to be + cacheable, the content will be saved to the cache for future serving, + otherwise the content will be ignored.

    + +

    If the content found within the cache is stale, the + mod_cache module converts the request into a + conditional request. If the origin server responds with + a normal response, the normal response is cached, replacing the content + already cached. If the origin server responds with a 304 Not Modified + response, the content is marked as fresh again, and the cached content + is served by the filter instead of saving it.

    + + +

    Improving Cache Hits

    + + +

    When a virtual host is known by one of many different server aliases, + ensuring that UseCanonicalName is + set to On can dramatically improve the ratio of cache hits. + This is because the hostname of the virtual-host serving the content is + used within the cache key. With the setting set to On + virtual-hosts with multiple server names or aliases will not produce + differently cached entities, and instead content will be cached as + per the canonical hostname.

    + + + +

    Freshness Lifetime

    + + +

    Well formed content that is intended to be cached should declare an + explicit freshness lifetime with the Cache-Control + header's max-age or s-maxage fields, or + by including an Expires header.

    + +

    At the same time, the origin server defined freshness lifetime can + be overridden by a client when the client presents their own + Cache-Control header within the request. In this case, + the lowest freshness lifetime between request and response wins.

    + +

    When this freshness lifetime is missing from the request or the + response, a default freshness lifetime is applied. The default + freshness lifetime for cached entities is one hour, however + this can be easily over-ridden by using the CacheDefaultExpire directive.

    + +

    If a response does not include an Expires header but does + include a Last-Modified header, mod_cache + can infer a freshness lifetime based on a heuristic, which can be + controlled through the use of the CacheLastModifiedFactor directive.

    + +

    For local content, or for remote content that does not define its own + Expires header, mod_expires may be used to + fine-tune the freshness lifetime by adding max-age and + Expires.

    + +

    The maximum freshness lifetime may also be controlled by using the + CacheMaxExpire.

    + + + +

    A Brief Guide to Conditional Requests

    + + +

    When content expires from the cache and becomes stale, rather than + pass on the original request, httpd will modify the request to make + it conditional instead.

    + +

    When an ETag header exists in the original cached + response, mod_cache will add an + If-None-Match header to the request to the origin server. + When a Last-Modified header exists in the original + cached response, mod_cache will add an + If-Modified-Since header to the request to the origin + server. Performing either of these actions makes the request + conditional.

    + +

    When a conditional request is received by an origin server, the + origin server should check whether the ETag or the Last-Modified + parameter has changed, as appropriate for the request. If not, the + origin should respond with a terse "304 Not Modified" response. This + signals to the cache that the stale content is still fresh should be + used for subsequent requests until the content's new freshness lifetime + is reached again.

    + +

    If the content has changed, then the content is served as if the + request were not conditional to begin with.

    + +

    Conditional requests offer two benefits. Firstly, when making such + a request to the origin server, if the content from the origin + matches the content in the cache, this can be determined easily and + without the overhead of transferring the entire resource.

    + +

    Secondly, a well designed origin server will be designed in such + a way that conditional requests will be significantly cheaper to + produce than a full response. For static files, typically all that is + involved is a call to stat() or similar system call, to + see if the file has changed in size or modification time. As such, even + local content may still be served faster from the cache if it has not + changed.

    + +

    Origin servers should make every effort to support conditional + requests as is practical, however if conditional requests are not + supported, the origin will respond as if the request was not + conditional, and the cache will respond as if the content had changed + and save the new content to the cache. In this case, the cache will + behave like a simple two state cache, where content is effectively + either fresh or deleted.

    + + +

    What Can be Cached?

    + + +

    The full definition of which responses can be cached by an HTTP + cache is defined in + + RFC2616 Section 13.4 Response Cacheability, and can be summed up as + follows:

    + +
      +
    1. Caching must be enabled for this URL. See the CacheEnable and CacheDisable directives.
    2. + +
    3. If the response has an HTTP status code other than 200, 203, 300, + 301 or 410 it must also specify an "Expires" or "Cache-Control" header. +
    4. + +
    5. The request must be a HTTP GET request.
    6. + +
    7. If the response contains an "Authorization:" header, it must + also contain an "s-maxage", "must-revalidate" or "public" option + in the "Cache-Control:" header, or it won't be cached.
    8. + +
    9. If the URL included a query string (e.g. from a HTML form GET + method) it will not be cached unless the response specifies an + explicit expiration by including an "Expires:" header or the max-age + or s-maxage directive of the "Cache-Control:" header, as per RFC2616 + sections 13.9 and 13.2.1.
    10. + +
    11. If the response has a status of 200 (OK), the response must + also include at least one of the "Etag", "Last-Modified" or + the "Expires" headers, or the max-age or s-maxage directive of + the "Cache-Control:" header, unless the + CacheIgnoreNoLastMod + directive has been used to require otherwise.
    12. + +
    13. If the response includes the "private" option in a "Cache-Control:" + header, it will not be stored unless the + CacheStorePrivate has been + used to require otherwise.
    14. + +
    15. Likewise, if the response includes the "no-store" option in a + "Cache-Control:" header, it will not be stored unless the + CacheStoreNoStore has been + used.
    16. + +
    17. A response will not be stored if it includes a "Vary:" header + containing the match-all "*".
    18. +
    + + +

    What Should Not be Cached?

    + + +

    It should be up to the client creating the request, or the origin + server constructing the response to decide whether or not the content + should be cacheable or not by correctly setting the + Cache-Control header, and mod_cache should + be left alone to honor the wishes of the client or server as appropriate. +

    + +

    Content that is time sensitive, or which varies depending on the + particulars of the request that are not covered by HTTP negotiation, + should not be cached. This content should declare itself uncacheable + using the Cache-Control header.

    + +

    If content changes often, expressed by a freshness lifetime of minutes + or seconds, the content can still be cached, however it is highly + desirable that the origin server supports + conditional requests correctly to ensure that + full responses do not have to be generated on a regular basis.

    + +

    Content that varies based on client provided request headers can be + cached through intelligent use of the Vary response + header.

    + + + +

    Variable/Negotiated Content

    + + +

    When the origin server is designed to respond with different content + based on the value of headers in the request, for example to serve + multiple languages at the same URL, HTTP's caching mechanism makes it + possible to cache multiple variants of the same page at the same URL.

    + +

    This is done by the origin server adding a Vary header + to indicate which headers must be taken into account by a cache when + determining whether two variants are different from one another.

    + +

    If for example, a response is received with a vary header such as;

    + +

    +Vary: negotiate,accept-language,accept-charset +

    + +

    mod_cache will only serve the cached content to + requesters with accept-language and accept-charset headers + matching those of the original request.

    + +

    Multiple variants of the content can be cached side by side, + mod_cache uses the Vary header and the + corresponding values of the request headers listed by Vary + to decide on which of many variants to return to the client.

    + + +
    top
    +
    +

    Cache Setup Examples

    + + + + + +

    Caching to Disk

    + + +

    The mod_cache module relies on specific backend store + implementations in order to manage the cache, and for caching to disk + mod_cache_disk is provided to support this.

    + +

    Typically the module will be configured as so;

    + +
    CacheRoot   "/var/cache/apache/"
    +CacheEnable disk /
    +CacheDirLevels 2
    +CacheDirLength 1
    + + +

    Importantly, as the cached files are locally stored, operating system + in-memory caching will typically be applied to their access also. So + although the files are stored on disk, if they are frequently accessed + it is likely the operating system will ensure that they are actually + served from memory.

    + + + +

    Understanding the Cache-Store

    + + +

    To store items in the cache, mod_cache_disk creates + a 22 character hash of the URL being requested. This hash incorporates + the hostname, protocol, port, path and any CGI arguments to the URL, + as well as elements defined by the Vary header to ensure that multiple + URLs do not collide with one another.

    + +

    Each character may be any one of 64-different characters, which mean + that overall there are 64^22 possible hashes. For example, a URL might + be hashed to xyTGxSMO2b68mBCykqkp1w. This hash is used + as a prefix for the naming of the files specific to that URL within + the cache, however first it is split up into directories as per + the CacheDirLevels and + CacheDirLength + directives.

    + +

    CacheDirLevels + specifies how many levels of subdirectory there should be, and + CacheDirLength + specifies how many characters should be in each directory. With + the example settings given above, the hash would be turned into + a filename prefix as + /var/cache/apache/x/y/TGxSMO2b68mBCykqkp1w.

    + +

    The overall aim of this technique is to reduce the number of + subdirectories or files that may be in a particular directory, + as most file-systems slow down as this number increases. With + setting of "1" for + CacheDirLength + there can at most be 64 subdirectories at any particular level. + With a setting of 2 there can be 64 * 64 subdirectories, and so on. + Unless you have a good reason not to, using a setting of "1" + for CacheDirLength + is recommended.

    + +

    Setting + CacheDirLevels + depends on how many files you anticipate to store in the cache. + With the setting of "2" used in the above example, a grand + total of 4096 subdirectories can ultimately be created. With + 1 million files cached, this works out at roughly 245 cached + URLs per directory.

    + +

    Each URL uses at least two files in the cache-store. Typically + there is a ".header" file, which includes meta-information about + the URL, such as when it is due to expire and a ".data" file + which is a verbatim copy of the content to be served.

    + +

    In the case of a content negotiated via the "Vary" header, a + ".vary" directory will be created for the URL in question. This + directory will have multiple ".data" files corresponding to the + differently negotiated content.

    + + +

    Maintaining the Disk Cache

    + + +

    The mod_cache_disk module makes no attempt to + regulate the amount of disk space used by the cache, although it + will gracefully stand down on any disk error and behave as if the + cache was never present.

    + +

    Instead, provided with httpd is the htcacheclean tool which allows you + to clean the cache periodically. Determining how frequently to run htcacheclean and what target size to + use for the cache is somewhat complex and trial and error may be needed to + select optimal values.

    + +

    htcacheclean has two modes of + operation. It can be run as persistent daemon, or periodically from + cron. htcacheclean can take up to an hour + or more to process very large (tens of gigabytes) caches and if you are + running it from cron it is recommended that you determine how long a typical + run takes, to avoid running more than one instance at a time.

    + +

    It is also recommended that an appropriate "nice" level is chosen for + htcacheclean so that the tool does not cause excessive disk io while the + server is running.

    + +

    +
    + Figure 1: Typical + cache growth / clean sequence.

    + +

    Because mod_cache_disk does not itself pay attention + to how much space is used you should ensure that + htcacheclean is configured to + leave enough "grow room" following a clean.

    + + +

    Caching to memcached

    + + +

    Using the mod_cache_socache module, mod_cache + can cache data from a variety of implementations (aka: "providers"). Using the + mod_socache_memcache module, for example, one can specify that + memcached is to be used as the + the backend storage mechanism.

    + +

    Typically the module will be configured as so:

    + +
    CacheEnable socache /
    +CacheSocache memcache:memcd.example.com:11211
    + + +

    Additional memcached servers can be specified by + appending them to the end of the CacheSocache memcache: + line separated by commas:

    + +
    CacheEnable socache /
    +CacheSocache memcache:mem1.example.com:11211,mem2.example.com:11212
    + + +

    This format is also used with the other various mod_cache_socache + providers. For example:

    + +
    CacheEnable socache /
    +CacheSocache shmcb:/path/to/datafile(512000)
    + + +
    CacheEnable socache /
    +CacheSocache dbm:/path/to/datafile
    + + + + +
    top
    +
    +

    General Two-state Key/Value Shared Object Caching

    + + + + + +

    The Apache HTTP server offers a low level shared object cache for + caching information such as SSL sessions, or authentication credentials, + within the socache interface.

    + +

    Additional modules are provided for each implementation, offering the + following backends:

    + +
    +
    mod_socache_dbm
    +
    DBM based shared object cache.
    +
    mod_socache_dc
    +
    Distcache based shared object cache.
    +
    mod_socache_memcache
    +
    Memcache based shared object cache.
    +
    mod_socache_shmcb
    +
    Shared memory based shared object cache.
    +
    + +

    Caching Authentication Credentials

    + + + + +

    The mod_authn_socache module allows the result of + authentication to be cached, relieving load on authentication backends.

    + + + +

    Caching SSL Sessions

    + + + + +

    The mod_ssl module uses the socache interface + to provide a session cache and a stapling cache.

    + + + +
    top
    +
    +

    Specialized File Caching

    + + + + + +

    On platforms where a filesystem might be slow, or where file + handles are expensive, the option exists to pre-load files into + memory on startup.

    + +

    On systems where opening files is slow, the option exists to + open the file on startup and cache the file handle. These + options can help on systems where access to static files is + slow.

    + +

    File-Handle Caching

    + + +

    The act of opening a file can itself be a source of delay, particularly + on network filesystems. By maintaining a cache of open file descriptors + for commonly served files, httpd can avoid this delay. Currently httpd + provides one implementation of File-Handle Caching.

    + +

    CacheFile

    + + +

    The most basic form of caching present in httpd is the file-handle + caching provided by mod_file_cache. Rather than caching + file-contents, this cache maintains a table of open file descriptors. Files + to be cached in this manner are specified in the configuration file using + the CacheFile + directive.

    + +

    The + CacheFile directive + instructs httpd to open the file when it is started and to re-use + this file-handle for all subsequent access to this file.

    + +
    CacheFile /usr/local/apache2/htdocs/index.html
    + + +

    If you intend to cache a large number of files in this manner, you + must ensure that your operating system's limit for the number of open + files is set appropriately.

    + +

    Although using CacheFile + does not cause the file-contents to be cached per-se, it does mean + that if the file changes while httpd is running these changes will + not be picked up. The file will be consistently served as it was + when httpd was started.

    + +

    If the file is removed while httpd is running, it will continue + to maintain an open file descriptor and serve the file as it was when + httpd was started. This usually also means that although the file + will have been deleted, and not show up on the filesystem, extra free + space will not be recovered until httpd is stopped and the file + descriptor closed.

    + + + + +

    In-Memory Caching

    + + +

    Serving directly from system memory is universally the fastest method + of serving content. Reading files from a disk controller or, even worse, + from a remote network is orders of magnitude slower. Disk controllers + usually involve physical processes, and network access is limited by + your available bandwidth. Memory access on the other hand can take mere + nano-seconds.

    + +

    System memory isn't cheap though, byte for byte it's by far the most + expensive type of storage and it's important to ensure that it is used + efficiently. By caching files in memory you decrease the amount of + memory available on the system. As we'll see, in the case of operating + system caching, this is not so much of an issue, but when using + httpd's own in-memory caching it is important to make sure that you + do not allocate too much memory to a cache. Otherwise the system + will be forced to swap out memory, which will likely degrade + performance.

    + +

    Operating System Caching

    + + +

    Almost all modern operating systems cache file-data in memory managed + directly by the kernel. This is a powerful feature, and for the most + part operating systems get it right. For example, on Linux, let's look at + the difference in the time it takes to read a file for the first time + and the second time;

    + +
    colm@coroebus:~$ time cat testfile > /dev/null
    +real    0m0.065s
    +user    0m0.000s
    +sys     0m0.001s
    +colm@coroebus:~$ time cat testfile > /dev/null
    +real    0m0.003s
    +user    0m0.003s
    +sys     0m0.000s
    + +

    Even for this small file, there is a huge difference in the amount + of time it takes to read the file. This is because the kernel has cached + the file contents in memory.

    + +

    By ensuring there is "spare" memory on your system, you can ensure + that more and more file-contents will be stored in this cache. This + can be a very efficient means of in-memory caching, and involves no + extra configuration of httpd at all.

    + +

    Additionally, because the operating system knows when files are + deleted or modified, it can automatically remove file contents from the + cache when necessary. This is a big advantage over httpd's in-memory + caching which has no way of knowing when a file has changed.

    + + +

    Despite the performance and advantages of automatic operating system + caching there are some circumstances in which in-memory caching may be + better performed by httpd.

    + +

    MMapFile Caching

    + + +

    mod_file_cache provides the + MMapFile directive, which + allows you to have httpd map a static file's contents into memory at + start time (using the mmap system call). httpd will use the in-memory + contents for all subsequent accesses to this file.

    + +
    MMapFile /usr/local/apache2/htdocs/index.html
    + + +

    As with the + CacheFile directive, any + changes in these files will not be picked up by httpd after it has + started.

    + +

    The MMapFile + directive does not keep track of how much memory it allocates, so + you must ensure not to over-use the directive. Each httpd child + process will replicate this memory, so it is critically important + to ensure that the files mapped are not so large as to cause the + system to swap memory.

    + + + +
    top
    +
    +

    Security Considerations

    + + +

    Authorization and Access Control

    + + +

    Using mod_cache in its default state where + CacheQuickHandler is set to + On is very much like having a caching reverse-proxy bolted + to the front of the server. Requests will be served by the caching module + unless it determines that the origin server should be queried just as an + external cache would, and this drastically changes the security model of + httpd.

    + +

    As traversing a filesystem hierarchy to examine potential + .htaccess files would be a very expensive operation, + partially defeating the point of caching (to speed up requests), + mod_cache makes no decision about whether a cached + entity is authorised for serving. In other words; if + mod_cache has cached some content, it will be served + from the cache as long as that content has not expired.

    + +

    If, for example, your configuration permits access to a resource by IP + address you should ensure that this content is not cached. You can do this + by using the CacheDisable + directive, or mod_expires. Left unchecked, + mod_cache - very much like a reverse proxy - would cache + the content when served and then serve it to any client, on any IP + address.

    + +

    When the CacheQuickHandler + directive is set to Off, the full set of request processing + phases are executed and the security model remains unchanged.

    + + +

    Local exploits

    + + +

    As requests to end-users can be served from the cache, the cache + itself can become a target for those wishing to deface or interfere with + content. It is important to bear in mind that the cache must at all + times be writable by the user which httpd is running as. This is in + stark contrast to the usually recommended situation of maintaining + all content unwritable by the Apache user.

    + +

    If the Apache user is compromised, for example through a flaw in + a CGI process, it is possible that the cache may be targeted. When + using mod_cache_disk, it is relatively easy to + insert or modify a cached entity.

    + +

    This presents a somewhat elevated risk in comparison to the other + types of attack it is possible to make as the Apache user. If you are + using mod_cache_disk you should bear this in mind - + ensure you upgrade httpd when security upgrades are announced and + run CGI processes as a non-Apache user using suEXEC if possible.

    + + + +

    Cache Poisoning

    + + +

    When running httpd as a caching proxy server, there is also the + potential for so-called cache poisoning. Cache Poisoning is a broad + term for attacks in which an attacker causes the proxy server to + retrieve incorrect (and usually undesirable) content from the origin + server.

    + +

    For example if the DNS servers used by your system running httpd + are vulnerable to DNS cache poisoning, an attacker may be able to control + where httpd connects to when requesting content from the origin server. + Another example is so-called HTTP request-smuggling attacks.

    + +

    This document is not the correct place for an in-depth discussion + of HTTP request smuggling (instead, try your favourite search engine) + however it is important to be aware that it is possible to make + a series of requests, and to exploit a vulnerability on an origin + webserver such that the attacker can entirely control the content + retrieved by the proxy.

    + + +

    Denial of Service / Cachebusting

    + + +

    The Vary mechanism allows multiple variants of the same URL to be + cached side by side. Depending on header values provided by the client, + the cache will select the correct variant to return to the client. This + mechanism can become a problem when an attempt is made to vary on a + header that is known to contain a wide range of possible values under + normal use, for example the User-Agent header. Depending + on the popularity of the particular web site thousands or millions of + duplicate cache entries could be created for the same URL, crowding + out other entries in the cache.

    + +

    In other cases, there may be a need to change the URL of a particular + resource on every request, usually by adding a "cachebuster" string to + the URL. If this content is declared cacheable by a server for a + significant freshness lifetime, these entries can crowd out + legitimate entries in a cache. While mod_cache + provides a + CacheIgnoreURLSessionIdentifiers + directive, this directive should be used with care to ensure that + downstream proxy or browser caches aren't subjected to the same denial + of service issue.

    + +
    +
    +

    Available Languages:  en  | + fr  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/caching.html.fr.utf8 b/docs/manual/caching.html.fr.utf8 new file mode 100644 index 0000000..2a49042 --- /dev/null +++ b/docs/manual/caching.html.fr.utf8 @@ -0,0 +1,999 @@ + + + + + +Guide de la mise en cache - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Guide de la mise en cache

    +
    +

    Langues Disponibles:  en  | + fr  | + tr 

    +
    + +

    Ce document complète la documentation de référence des modules + mod_cache, mod_cache_disk, + mod_file_cache et du programme htcacheclean. + Il décrit l'utilisation des fonctionnalités de mise en + cache du serveur HTTP Apache + pour accélérer les services web et mandataire, tout en évitant les problèmes + courants et les erreurs de configuration.

    +
    + +
    top
    +
    +

    Introduction

    + + +

    Le serveur HTTP Apache offre tout un ensemble de fonctionnalités + de mise en cache qui ont été conçues pour améliorer les performances + du serveur de différentes manières.

    + +
    +
    Mise en cache HTTP à trois états RFC2616
    +
    mod_cache et son module de fournisseur + mod_cache_disk proposent une mise en cache + intelligente de niveau HTTP. Le contenu proprement dit est + stocké dans le cache, et mod_cache vise à respecter tous les + en-têtes HTTP, ainsi que les options qui contrôlent la mise en + cache du contenu comme décrit dans la Section + 13 de la RFC2616. mod_cache peut gérer des + configurations de mise en cache simples, mais aussi complexes + comme dans les cas où vous avez à faire à des contenus mandatés, + à des contenus locaux dynamiques, ou lorsque vous avez besoin + d'accélérer l'accès aux fichiers locaux situés sur disque + supposé lent. +
    + +
    Mise en cache d'objets partagés de forme clé/valeur à deux + états
    +
    + L'API du cache d'objets partagés (socache) + et ses modules de fournisseurs + proposent une mise en cache d'objets partagés à base de + couples clé/valeur de niveau serveur. Ces modules sont + conçus pour la mise en cache de données de bas niveau comme + les sessions SSL et les données d'authentification. les + serveurs d'arrière-plan permettent le stockage des données + au niveau serveur en mémoire partagée, ou au niveau + datacenter dans un cache comme memcache ou distcache. +
    + +
    Mise en cache de fichiers spécialisée
    +
    + mod_file_cache offre la possibilité de + précharger des fichiers en mémoire au démarrage du serveur, + et peut améliorer les temps d'accès et sauvegarder les + gestionnaires de fichiers pour les fichiers qui font l'objet + d'accès fréquents, évitant ainsi d'avoir à accéder au disque + à chaque requête. +
    +
    + +

    Pour tirer parti efficacement de ce document, les bases de HTTP doivent + vous être familières, et vous devez avoir lu les sections + Mise en correspondance des + URLs avec le système de fichiers et + Négociation sur le contenu + du guide de l'utilisateur.

    + +
    top
    +
    +

    Mise en cache HTTP à trois états RFC2616

    + + + + + +

    Le module mod_cache permet de tirer avantage du + mécanisme de mise en cache en ligne faisant partie + intégrante du protocole HTTP, et décrit dans la section + 13 de la RFC2616.

    + +

    A la différence d'un cache simple clé/valeur à deux états où le + contenu est supprimé lorsqu'il est périmé, un cache HTTP comporte un + mécanisme permettant de conserver temporairement un contenu périmé, + de demander au serveur original si ce contenu périmé a été modifié, + et dans le cas contraire de le rendre à nouveau valable.

    + +

    Une entrée d'un cache HTTP peut se présenter sous un de ces trois + états :

    + +
    +
    Frais
    +
    + Si un contenu est suffisamment récent (plus jeune que sa + durée de fraîcheur), il est considéré comme + frais. Un cache HTTP peut servir un contenu + frais sans avoir à demander quoi que ce soit au serveur + d'origine. +
    +
    Périmé
    +
    +

    Si le contenu est trop ancien (plus vieux que sa + durée de fraîcheur), il est considéré comme + périmé. Un cache HTTP doit contacter le serveur + original pour vérifier si le contenu, même s'il est périmé, est + encore à jour avant de le servir au client. Soit le serveur + original va répondre en envoyant un contenu de remplacement si + le contenu périmé n'est plus à jour, soit dans le cas idéal il + renverra un code pour signaler au cache que le contenu est + encore à jour, et qu'il est inutile de le générer ou de + l'envoyer à nouveau. Le contenu repasse à l'état "frais" et le + cycle continue.

    + +

    Le protocole HTTP permet au cache de servir des données + périmées dans certaines circonstances, comme lorsqu'une + tentative de rafraîchir une entrée depuis un serveur original + se solde par un échec avec un code d'erreur 5xx, ou lorsqu'une + autre requête est déjà en train d'essayer de rafraîchir la même + entrée. Dans ces cas, un en-tête Warning est ajouté + à la réponse.

    +
    +
    Non Existent
    +
    + Si le cache est plein, il se réserve la possibilité de supprimer + des entrées pour faire de la place. Une entrée peut être + supprimée à tout moment, qu'elle soit fraîche ou périmée. + L'outil htcacheclean + peut être utilisé à la demande, ou lancé en tant que démon afin + de conserver la taille du cache ou le nombre d'inodes en deçà de + valeurs spécifiées. Cet outil essaie cependant de + supprimer les entrées périmées avant les entrées fraîches. +
    +
    + +

    Le fonctionnement détaillé d'un cache HTTP est décrit dans la Section + 13 de la RFC2616.

    + +

    Interaction avec le serveur

    + + +

    Le module mod_cache interagit avec le serveur + à deux niveaux possibles en fonction de la directive CacheQuickHandler : +

    + +
    +
    Phase de gestion rapide
    +
    +

    Cette phase se déroule très tôt au cours du traitement de + la requête, juste après l'interprétation de cette dernière. Si + le contenu se trouve dans le cache, il est servi immédiatement + et pratiquement tout le reste du traitement de la requête est + court-circuité.

    + +

    Dans ce scénario, le cache se comporte comme s'il avait + été "boulonné" à l'entrée du serveur.

    + +

    Ce mode possède les meilleures performances car la + majorité des traitements au niveau du serveur sont + court-circuités. Cependant, il court-circuite aussi les + phases d'authentification et d'autorisation du traitement + au niveau du serveur, et il doit donc être utilisé avec + prudence lorsque que ces phases sont importantes.

    + +

    Les requêtes comportant un en-tête "Authorization" + (comme par exemple l'authentification HTTP basique) ne + peuvent être ni mises en cache, ni servies depuis ce + dernier lorsque mod_cache s'exécute dans + cette phase.

    +
    +
    Phase de gestion normale
    +
    +

    Cette phase se déroule très tard au cours du traitement + de la requête, en fait après toutes les phases de ce + traitement.

    + +

    Dans ce scénario, le cache se comporte comme s'il avait + été "boulonné" à la sortie du serveur.

    + +

    Ce mode offre la plus grande souplesse, car il permet + de faire intervenir la mise en cache en un point + précisément spécifié de la chaîne de filtrage, et le + contenu issu du cache peut être filtré ou personnalisé + avant d'être servi au client.

    +
    +
    + +

    Si l'URL ne se trouve pas dans le cache, + mod_cache ajoutera un filtre à la chaîne de filtrage afin + d'enregistrer la réponse dans le cache, puis passera la main + pour permettre le déroulement normal de la suite du traitement + de la requête. Si la mise en cache du contenu est autorisée, il + sera enregistré dans le cache pour pouvoir être servi à nouveau + ; dans le cas contraire, le contenu sera ignoré.

    + +

    Si le contenu trouvé dans le cache est périmé, le module + mod_cache convertit la requête en + requête conditionnelle. Si le serveur original + renvoie une réponse normale, elle est enregistrée dans le cache + en lieu et place du contenu périmé. Si le serveur original + renvoie une réponse "304 Not Modified", le contenu repasse à + l'état "frais" et est servi par le filtre au lieu d'être + sauvegardé.

    + + +

    Amélioration du taux de présence dans le cache

    + + +

    Lorsqu'un serveur virtuel est connu sous la forme d'un des + nombreux alias du serveur, la définition de la directive + UseCanonicalName à + On peut augmenter de manière significative le nombre + de correspondances positives dans le cache. Cela est dû au fait + que la clé du cache contient le nom d'hôte du serveur virtuel. + Avec UseCanonicalName positionnée + à On, + les hôtes virtuels possédant plusieurs noms de serveur ou alias ne + généreront pas d'entités de cache différentes, et le contenu sera mis en + cache en faisant référence au nom d'hôte canonique.

    + + + +

    Durée de fraîcheur

    + + +

    Un contenu bien formé destiné à être mis en cache doit déclarer + explicitement une durée de fraîcheur à l'aide des champs + max-age ou s-maxage de l'en-tête + Cache-Control, ou en incluant un en-tête + Expires.

    + +

    De plus, un client peut passer outre la durée de fraîcheur + définie pour le serveur d'origine en ajoutant son propre en-tête + Cache-Control à la requête. Dans ce cas, c'est la + durée de fraîcheur la plus basse entre la requête et la réponse + qui l'emporte.

    + +

    Lorsque cette durée de fraîcheur est absente de la requête ou + de la réponse, une durée de fraîcheur par défaut s'applique. La + durée de fraîcheur par défaut des entrées du cache est d'une heure + ; elle peut cependant être facilement modifiée à l'aide de + la directive CacheDefaultExpire.

    + +

    Si une réponse ne contient pas d'en-tête Expires mais + inclut un en-tête Last-Modified, mod_cache + peut déduire une durée de fraîcheur en se basant sur une + heuristique, qui peut être contrôlée à l'aide de la directive CacheLastModifiedFactor.

    + +

    Pour les contenus locaux, ou les contenus distants qui ne + spécifient pas leur propre en-tête Expires, + mod_expires permet de régler finement la durée de + fraîcheur à l'aide des paramètres max-age et + Expires.

    + +

    On peut aussi contrôler la durée de fraîcheur maximale en utilisant + la directive CacheMaxExpire.

    + + + +

    Guide succinct des requêtes conditionnelles

    + + +

    Lorsqu'un contenu du cache est périmé, httpd modifie la requête + pour en faire une requête conditionnelle

    + +

    Lorsque la réponse originale du cache contient un en-tête + ETag, mod_cache ajoute un en-tête + If-None-Match à la requête envoyée au serveur + d'origine. Lorsque la réponse originale du cache contient un en-tête + Last-Modified, mod_cache ajoute un en-tête + If-Modified-Since à la requête envoyée au serveur + d'origine. Dans ces deux cas, la requête devient une requête + conditionnelle.

    + +

    Lorsqu'un serveur d'origine reçoit une requête conditionnelle, + il vérifie si le paramètre Etag ou Last-Modified a été modifié en + fonction des paramètres de la requête. Si ce n'est pas le cas, il + répondra avec le message lapidaire "304 Not Modified". Cela + informe le cache que le contenu est périmé mais encore à jour, et + peut être utilisé tel quel pour les prochaines requêtes jusqu'à ce + qu'il atteigne à nouveau sa date de péremption.

    + +

    Si le contenu a été modifié, il est servi comme s'il s'agissait + d'une requête normale et non conditionnelle.

    + +

    Les requêtes conditionnelles offrent deux avantages. D'une + part, il est facile de déterminer si le contenu du serveur + d'origine correspond à celui situé + dans le cache, et ainsi d'économiser la consommation de ressources + nécessaire au transfert du contenu dans son ensemble.

    + +

    D'autre part, un serveur d'origine bien conçu sera configuré de + telle manière que les requêtes conditionnelles nécessitent pour + leur production bien moins de ressources qu'une réponse complète. + Dans le cas des fichiers statiques, il suffit en général d'un + appel système de type stat() ou similaire pour + déterminer si la taille ou la date de modification du fichier a + été modifiée. Ainsi, même un contenu local pourra être servi plus + rapidement depuis le cache s'il n'a pas été modifié.

    + +

    Il serait souhaitable que tous les serveurs d'origine + supportent les requêtes conditionnelles, car dans le cas + contraire, ils répondent comme s'il s'agissait d'une requête + normale, et le cache répond comme si le contenu avait été + modifié et enregistre ce dernier. Le cache se comporte alors + comme un simple cache à deux état, où le contenu est servi s'il + est à jour, ou supprimé dans le cas contraire.

    + + +

    Que peut-on mettre en cache ?

    + + +

    La liste complète des conditions nécessaires pour qu'une + réponse puisse être enregistrée dans un cache HTTP est fournie + dans la section + 13.4 Response Cacheability de la RFC2616, et peut se résumer + ainsi :

    + +
      +
    1. La mise en cache doit être activée pour cette URL. Voir les + directives CacheEnable et CacheDisable.
    2. + +
    3. Si la reponse possède un code de statut HTTP autre que 200, 203, 300, 301 + ou 410, elle doit aussi comporter un en-tête "Expires" ou + "Cache-Control".
    4. + +
    5. La requête doit être de type HTTP GET.
    6. + +
    7. Si la réponse contient un en-tête "Authorization:", elle doit aussi + contenir une option "s-maxage", "must-revalidate" ou "public" dans l'en-tête + "Cache-Control:".
    8. + +
    9. Si l'URL contient une chaîne de requête + (provenant par exemple d'une méthode GET de formulaire HTML), elle ne + sera pas mise en cache, à moins que la réponse ne + spécifie explicitement un délai d'expiration à l'aide d'un + en-tête "Expires:" ou une directive max-age ou s-maxage de + l'en-tête "Cache-Control:" comme indiqué dans les + sections 13.2.1. et 13.9 de la RFC2616.
    10. + +
    11. Si la réponse a un statut de 200 (OK), elle doit aussi contenir + au moins un des en-têtes "Etag", "Last-Modified" ou + "Expires", ou une directive max-age ou s-maxage de + l'en-tête "Cache-Control:", à moins que la directive + CacheIgnoreNoLastMod + ne précise d'autres contraintes.
    12. + +
    13. Si la réponse contient l'option "private" dans un en-tête + "Cache-Control:", elle ne sera pas mise en cache à moins que la + directive + CacheStorePrivate + ne précise d'autres contraintes.
    14. + +
    15. De même, si la réponse contient l'option "no-store" dans un en-tête + "Cache-Control:", elle ne sera pas mise en cache à moins que la + directive + CacheStoreNoStore + n'ait été utilisée.
    16. + +
    17. Une réponse ne sera pas mise en cache si elle comporte un en-tête + "Vary:" contenant le caractère "*" qui correspond à toute + chaîne de caractères.
    18. +
    + + +

    Qu'est ce qui ne doit pas être mis en cache ?

    + + +

    Le client qui crée la requête ou le serveur d'origine qui + génère la réponse doit être à même de déterminer si le contenu + doit pouvoir être mis en cache ou non en définissant correctement + l'en-tête Cache-Control, et + mod_cache sera alors en mesure de satisfaire les + souhaits du client ou du serveur de manière appropriée. +

    + +

    Les contenus qui varient au cours du temps, ou en fonction de + particularités de la requête non prises en compte par la + négociation HTTP ne doivent pas être mis en cache. Ce type de + contenu doit se déclarer lui-même "à ne pas mettre en cache" à l'aide de + l'en-tête Cache-Control.

    + +

    Si le contenu change souvent, suite par exemple à une durée de + fraîcheur de l'ordre de la minute ou de la seconde, il peut tout + de même être mis en cache, mais il est alors fortement souhaitable + que le serveur d'origine supporte correctement les + requêtes conditionnelles afin que des réponses + complètes ne soient pas systématiquement générées.

    + +

    Un contenu qui varie en fonction d'en-têtes de requête fournis + par le client peut être mis en cache, sous réserve d'une + utilisation appropriée de l'en-tête de réponse Vary.

    + + +

    Contenu variable et/ou négocié

    + + +

    Lorsque le serveur d'origine est configuré pour servir des + contenus différents en fonction de la valeur de certains en-têtes + de la requête, par exemple pour servir une ressource en plusieurs + langages à partir d'une seule URL, le mécanisme de mise en cache + d'HTTP permet de mettre en cache plusieurs variantes de la même + page à partir d'une seule URL.

    + +

    Pour y parvenir, le serveur d'origine ajoute un en-tête + Vary pour indiquer quels en-têtes doivent être pris + en compte par un cache pour déterminer si deux variantes sont + différentes l'une de l'autre.

    + +

    Si par exemple, une réponse est reçue avec l'en-tête Vary suivant,

    + +

    +Vary: negotiate,accept-language,accept-charset +

    + +

    mod_cache ne servira aux demandeurs que le contenu + mis en cache qui correspond au contenu des en-têtes accept-language et + accept-charset de la requête originale.

    + +

    Plusieurs variantes d'un contenu peuvent être mises en cache + simultanément ; mod_cache utilise l'en-tête + Vary et les valeurs correspondantes des en-têtes de + la requête spécifiés dans ce dernier pour + déterminer quelle variante doit être servie au client.

    + + + +
    top
    +
    +

    Exemples de configuration du cache

    + + + + + +

    Mise en cache sur disque

    + + +

    Le module mod_cache s'appuie sur des + implémentations de stockage sous-jacentes spécifiques pour gérer + le cache ; à ce titre, mod_cache_disk fournit la + prise en charge de la mise en cache sur disque.

    + +

    En général, le module se configure comme suit :

    + +
    CacheRoot   "/var/cache/apache/"
    +CacheEnable disk /
    +CacheDirLevels 2
    +CacheDirLength 1
    + + +

    Il est important de savoir que, les fichiers mis en cache étant stockés + localement, la mise en cache par l'intermédiaire du système d'exploitation + sera en général aussi appliquée à leurs accès. Si bien que même si les + fichiers sont stockés sur disque, s'il font l'objet d'accès fréquents, + il est probable que le système d'exploitation s'appliquera à ce qu'ils + soient servis à partir de la mémoire.

    + + + +

    Comprendre le stockage dans le cache

    + + +

    Pour stocker des entités dans le cache, + le module mod_cache_disk crée une empreinte (hash) de 22 + caractères de l'URL qui a fait l'objet d'une requête. Cette empreinte + comprend le nom d'hôte, le protocole, le port, le chemin et tout argument + de type CGI associé à l'URL, ainsi que les éléments + spécifiés dans l'en-tête Vary afin d'être sûr que plusieurs URLs + n'interfèrent pas entre elles.

    + +

    Chaque position de l'empreinte peut contenir un caractère + choisi parmi 64 caractères différents, il y a donc + 64^22 possibilités pour une empreinte. Par exemple, une URL peut posséder + l'empreinte xyTGxSMO2b68mBCykqkp1w. Cette empreinte est + utilisée pour préfixer les noms de fichiers spécifiques à cette URL à + l'intérieur du cache ; cependant, elle est tout d'abord placée dans les + répertoires du cache selon les directives + CacheDirLevels et + CacheDirLength.

    + +

    La directive + CacheDirLevels + définit le nombre de niveaux de sous-répertoires, et + CacheDirLength + le nombre de caractères composant le nom des sous-répertoires. Dans + l'exemple donné plus haut, l'empreinte se trouvera à : + /var/cache/apache/x/y/TGxSMO2b68mBCykqkp1w.

    + +

    Cette technique a pour but principal de réduire le nombre de + sous-répertoires ou de fichiers contenus dans un répertoire particulier, + car le fonctionnement de la plupart des systèmes de fichiers est ralenti + quand ce nombre augmente. Avec la valeur "1" pour la directive + CacheDirLength, + il peut y avoir au plus 64 sous-répertoires à un niveau quelconque. + Avec la valeur "2", il peut y en avoir 64 * 64, etc... + A moins d'avoir une bonne raison pour ne pas le faire, l'utilisation de + la valeur "1" pour la directive + CacheDirLength + est recommandée.

    + +

    Le paramétrage de la directive + CacheDirLevels + dépend du nombre de fichiers que vous pensez stocker dans le cache. + Avec une valeur de "2" comme dans l'exemple donné plus haut, + 4096 sous-répertoires peuvent être créés au total. Avec 1 million de + fichiers dans le cache, cela équivaut à environ 245 URLs mises en cache + dans chaque répertoire.

    + +

    Chaque URL nécessite au moins deux fichiers dans le cache. Ce sont en + général un fichier ".header", qui contient des meta-informations à propos + de l'URL, comme la date de son arrivée à expiration, + et un fichier ".data" qui est la copie exacte du contenu à servir.

    + +

    Dans le cas d'un contenu négocié via l'en-tête "Vary", un répertoire + ".vary" sera créé pour l'URL en question. Ce répertoire contiendra de + multiples fichiers ".data" correspondant aux différents contenus + négociés.

    + + +

    Maintenance du cache sur disque

    + + +

    Le module mod_cache_disk n'effectue aucune + régulation de l'espace disque utilisé par le cache, bien qu'il + s'arrête en douceur en cas d'erreur disque et se comporte alors + comme si le cache n'avait jamais existé.

    + +

    Par contre, l'utilitaire + htcacheclean fourni avec + httpd + vous permet de nettoyer le cache périodiquement. + Déterminer la fréquence à laquelle lancer htcacheclean et la taille souhaitée + pour le cache est une tâche relativement complexe et il vous faudra de + nombreux essais et erreurs pour arriver à sélectionner des valeurs + optimales.

    + +

    htcacheclean opère selon deux + modes. Il peut s'exécuter comme démon résident, ou être lancé + périodiquement par cron. htcacheclean peut mettre une heure + ou plus pour traiter de très grands caches (plusieurs dizaines de + Gigaoctets) et si vous l'exécutez à partir de cron, il vous est + conseillé de déterminer la durée typique d'un traitement, afin d'éviter + d'exécuter plusieurs instances à la fois.

    + +

    Il est aussi conseillé d'attribuer un niveau de priorité "nice" + approprié à htcacheclean de façon à ce qu'il n'effectue pas trop + d'accès disque pendant le fonctionnement du serveur.

    + +

    +
    + Figure 1: Croissance + typique du cache / séquence de nettoyage.

    + +

    Comme mod_cache_disk ne tient pas compte de l'espace + utilisé, vous devez vous assurer que + htcacheclean est configuré de + façon à laisser suffisamment d'"espace de croissance" + à la suite d'un nettoyage.

    + + +

    Cache en mémoire

    + + +

    En utilisant le module mod_cache_socache, + mod_cache peut mettre en cache des données à partir de + diverses implémentations aussi nommées "fournisseurs". Par exemple, en + utilisant le module mod_socache_memcache, on peut + spécifier que c'est memcached qui doit + être utilisé comme mécanisme de stockage sous-jacent.

    + +

    Typiquement, le module sera configuré comme suit :

    + +
    CacheEnable socache /
    +CacheSocache memcache:memcd.example.com:11211
    + + +

    En outre, il est possible de spécifier plusieurs serveurs + memcached en les ajoutant à la fin de la ligne + CacheSocache memcache: et en les séparant par des virgules :

    + +
    CacheEnable socache /
    +CacheSocache memcache:mem1.example.com:11211,mem2.example.com:11212
    + + +

    Divers autres fournisseurs mod_cache_socache utilisent + aussi ce format. Par exemple :

    + +
    CacheEnable socache /
    +CacheSocache shmcb:/path/to/datafile(512000)
    + + +
    CacheEnable socache /
    +CacheSocache dbm:/path/to/datafile
    + + + + +
    top
    +
    +

    Mise en cache générale d'objets partagés à deux états de forme + clé/valeur

    + + + + + +

    Le serveur HTTP Apache fournit un cache d'objets partagés de bas + niveau pour la mise en cache d'informations comme les sessions SSL + ou les données d'authentification dans l'interface socache.

    + +

    Pour chaque implémentation, un module supplémentaire est fourni + qui offre les services d'arrière-plan suivants :

    + +
    +
    mod_socache_dbm
    +
    Cache d'objets partagés basé sur DBM.
    +
    mod_socache_dc
    +
    Cache d'objets partagés basé sur Distcache.
    +
    mod_socache_memcache
    +
    Cache d'objets partagés basé sur Memcache.
    +
    mod_socache_shmcb
    +
    Cache d'objets partagés basé sur la mémoire partagée.
    +
    + +

    Mise en cache des données d'authentification

    + + + + +

    Le module mod_authn_socache permet la mise en + cache des données issues d'une authentification, diminuant ainsi + la charge des serveurs d'authentification d'arrière-plan.

    + + + +

    Mise en cache des sessions SSL

    + + + + +

    Le module mod_ssl utilise l'interface + socache pour fournir un cache de session et un cache + de base.

    + + + +
    top
    +
    +

    Mise en cache à base de fichiers spécialisés

    + + + + + +

    Sur les plateformes où le système de fichiers peut être lent, ou + lorsque les descripteurs de fichiers sont gourmands en ressources, + il est possible de précharger des fichiers en mémoire au démarrage + du serveur.

    + +

    Sur les systèmes où l'ouverture des fichiers est lente, il est + possible d'ouvrir le fichier au démarrage du serveur et de mettre en + cache le descripteur de fichier. Ces options peuvent vous aider sur + les systèmes où l'accès aux fichiers statiques est lent.

    + +

    Mise en cache des descripteurs de fichier

    + + +

    Le processus d'ouverture d'un fichier peut être en soi une + source de ralentissement, en particulier sur les systèmes de + fichiers sur le réseau. httpd permet d'éviter ce ralentissement en + maintenant un cache des descripteurs de fichiers ouverts pour les + fichiers souvent servis. Actuellement, httpd fournit une seule + implémentation de mise en cache des descripteurs de fichiers.

    + +

    CacheFile

    + + +

    La forme la plus basique de mise en cache que propose httpd + est la mise en cache des descripteurs de fichiers fournie par le + module mod_file_cache. Plutôt que de mettre en + cache le contenu des fichiers, ce cache maintient une table des + descripteurs de fichiers ouverts. Les fichiers devant faire + l'objet d'une mise en cache de ce type sont spécifiés dans le + fichier de configuration via la directive CacheFile.

    + +

    La directive CacheFile informe httpd + qu'il doit ouvrir le fichier lors de son démarrage et qu'il doit + réutiliser le descripteur de fichier mis en cache pour tous les + accès futurs à ce fichier.

    + +
    CacheFile /usr/local/apache2/htdocs/index.html
    + + +

    Si vous désirez mettre en cache un grand nombre de fichiers + de cette manière, vous devez vous assurer que le nombre maximal + de fichiers ouverts pour votre système d'exploitation est défini + à une valeur suffisante.

    + +

    Bien que l'utilisation de la directive CacheFile n'entraîne pas de + mise en cache du contenu du fichier proprement dit, elle + implique que si le fichier est modifié pendant l'exécution du + serveur, ces modifications ne seront pas prises en compte. Le + fichier sera toujours servi dans l'état où il se trouvait au + moment du démarrage du serveur.

    + +

    Si le fichier est supprimé pendant l'exécution du serveur, ce + dernier conservera le descripteur de fichier ouvert associé et + servira le fichier dans l'état où il se trouvait au + moment du démarrage du serveur. Cela signifie aussi que même si + le fichier a été supprimé, et n'apparaît donc plus dans le + système de fichiers, l'espace disque libéré ne sera disponible + qu'une fois le serveur httpd arrêté et donc le descripteur de + fichier fermé.

    + + + + +

    In-Memory Caching

    + + +

    Servir un contenu directement depuis la mémoire système est + universellement reconnu comme la méthode la plus rapide. Lire des fichiers + depuis un contrôleur de disque ou pire, depuis un réseau distant est plus + lent de plusieurs ordres de grandeur. Les contrôleurs de disque réalisent + en général des opérations mécaniques, et l'accès au réseau est limité par la + bande passante dont vous disposez. Par contre, les temps d'accès à la + mémoire sont de l'ordre de la nano-seconde.

    + +

    Cependant la mémoire système n'est pas bon marché ; à capacité égale, + c'est de loin le type de stockage le plus coûteux et il est important de + s'assurer qu'elle est utilisée efficacement. Le fait de mettre en cache + des fichiers en mémoire diminue d'autant la quantité de mémoire système + disponible. Comme nous le verrons plus loin, ce n'est pas un problème en + soi dans le cas de la mise en cache par l'intermédiaire du système + d'exploitation, mais si l'on utilise la mise en cache en mémoire propre à + httpd, il faut prendre garde à ne pas allouer trop de mémoire au cache. + Sinon le système sera contraint d'utiliser le swap, ce qui dégradera + sensiblement les performances.

    + +

    Mise en cache par l'intermédiaire du système d'exploitation

    + + +

    Dans la plupart des systèmes d'exploitation modernes, c'est le noyau + qui gère directement la mise en cache en mémoire des données relatives + aux fichiers. C'est une fonctionnalité puissante, et les systèmes + d'exploitation s'en acquittent fort bien pour la plus grande partie. + Considérons par exemple, dans le cas de Linux, la différence entre le + temps nécessaire à la première lecture d'un fichier et le temps + nécessaire à sa deuxième lecture;

    + +
    colm@coroebus:~$ time cat testfile > /dev/null
    +real    0m0.065s
    +user    0m0.000s
    +sys     0m0.001s
    +colm@coroebus:~$ time cat testfile > /dev/null
    +real    0m0.003s
    +user    0m0.003s
    +sys     0m0.000s
    + +

    Même pour ce petit fichier, il y a une grande différence entre les + temps nécessaires pour lire le fichier. Cela est dû au fait que le + noyau a mis en cache le contenu du fichier en mémoire.

    + +

    En s'assurant de toujours pouvoir disposer de mémoire système, vous + pouvez être assuré qu'il y aura de plus en plus de contenus de fichiers + stockés dans ce cache. Cela peut s'avérer une méthode de mise en cache en + mémoire très efficace, et ne nécessite aucune configuration supplémentaire + de httpd.

    + +

    De plus, comme le système d'exploitation sait si des fichiers ont été + supprimés ou modifiés, il peut effacer automatiquement des contenus de + fichiers du cache lorsque cela s'avère nécessaire. Cela constitue un gros + avantage par rapport à la mise en cache en mémoire de httpd qui n'a aucune + possibilité de savoir si un fichier a été modifié.

    + + +

    En dépit des performances et des avantages de la mise en cache + automatique par le système d'exploitation, la mise en cache en mémoire + peut être effectuée plus efficacement par httpd dans certaines + circonstances.

    + +

    Mise en cache à l'aide de la directive MMapFile

    + + +

    La directive MMapFile + fournie par le module mod_file_cache vous permet de + demander à httpd de charger un contenu de fichier statique en mémoire lors + de son démarrage (à l'aide de l'appel système mmap). httpd utilisera le + contenu chargé en mémoire pour satisfaire ultérieurement toutes les + demandes d'accès à ce fichier.

    + +
    MMapFile /usr/local/apache2/htdocs/index.html
    + + +

    Comme dans le cas de la directive + CacheFile, toute + modification du fichier ne sera plus prise en compte par httpd une fois + ce dernier démarré.

    + +

    La directive + MMapFile ne gardant + pas la trace de la quantité de mémoire qu'elle alloue, vous devez prendre + garde de ne pas en abuser. Chaque processus enfant de httpd utilisant + sa propre réplique de la mémoire allouée, il est donc d'une importance + critique de s'assurer que les fichiers chargés ne sont pas d'une taille + trop importante afin d'épargner au système l'utilisation du swap.

    + + + +
    top
    +
    +

    Considérations sur la sécurité

    + + +

    Autorisation et contrôle d'accès

    + + +

    Utiliser mod_cache revient sensiblement à la même + chose qu'avoir un mandataire inverse intégré (reverse-proxy). Les requêtes + seront servies par le module de mise en cache sauf si ce dernier + détermine qu'un processus d'arrière-plan doit être appelé. La mise en + cache de ressources locales modifie considérablement le modèle de + sécurité de httpd.

    + +

    Comme le parcours de la hiérarchie d'un système de fichiers pour + examiner le contenu d'éventuels fichiers + .htaccess serait une opération très coûteuse en ressources, + annulant partiellement de ce fait l'intérêt de la mise en cache + (accélérer le traitement des requêtes), + mod_cache ne se préoccupe pas de savoir s'il a + l'autorisation de servir une entité mise en cache. En d'autres termes, + si mod_cache a mis en cache un certain contenu, ce + dernier sera servi à partir du cache tant qu'il ne sera pas arrivé à + expiration.

    + +

    Si par exemple, votre configuration autorise l'accès à une ressource + en fonction de l'adresse IP, vous devez vous assurer que ce contenu n'est + pas mis en cache. Ceci est possible en utilisant la directive + CacheDisable, ou le module + mod_expires. Livré à lui-même, + mod_cache - pratiquement comme un mandataire inverse - + mettrait en cache le contenu lors de sa mise à dispisotion, et le servirait ensuite + à tout client, vers n'importe quelle adresse IP.

    + +

    Lorsque la directive CacheQuickHandler est définie à + Off, toutes les phases du traitement de la requête + sont exécutées et le modèle de sécurité reste le même.

    + + + +

    Piratages locaux

    + + +

    Etant donné que les réponses vers les utilisateurs finaux peuvent être + servies depuis le cache, ce dernier est une cible potentielle pour ceux + qui veulent défigurer un contenu ou interférer avec lui. Il est important + de garder à l'esprit que l'utilisateur sous lequel tourne + httpd doit + toujours avoir l'accès en écriture dans le cache. Ceci est en contraste + total avec la recommandation usuelle d'interdire à l'utilisateur sous + lequel tourne Apache + l'accès en écriture à tout contenu.

    + +

    Si l'utilisateur sous lequel tourne Apache est compromis, + par exemple à cause d'une + faille de sécurité dans un processus CGI, il est possible que le cache + fasse l'objet d'une attaque. Il est relativement aisé d'insérer ou de + modifier une entité dans le cache en utilisant le module + mod_cache_disk.

    + +

    Cela représente un risque relativement élevé par rapport aux autres + types d'attaques qu'il est possible de mener sous l'utilisateur apache. + Si vous utilisez mod_cache_disk, vous devez garder ceci à + l'esprit : effectuez toujours les mises à jour de httpd quand des + correctifs de sécurité sont annoncés et exécutez les processus CGI sous un + utilisateur autre qu'apache en utilisant suEXEC + dans la mesure du possible.

    + + + +

    Empoisonnement du cache (Cache Poisoning)

    + + +

    Si vous utilisez httpd comme serveur mandataire avec mise en cache, + vous vous exposez aussi à un éventuel "Empoisonnement du + cache" (Cache poisoning). L'empoisonnement du cache est un terme général + pour désigner les attaques au cours desquelles l'attaquant fait en sorte + que le serveur mandataire renvoie à un contenu incorrect (et souvent + indésirable) en provenance du serveur d'origine. +

    + +

    Par exemple, si les serveur DNS qu'utilise votre système où tourne + httpd sont vulnérables à l'empoisonnement du cache des DNS, un attaquant + pourra contrôler vers où httpd se connecte lorsqu'il demande un contenu + depuis le serveur d'origine. + Un autre exemple est constitué par les attaques ainsi nommées + "Dissimulation de requêtes HTTP" (HTTP request-smuggling).

    + +

    Ce document n'est pas le bon endroit pour une discussion approfondie + à propos de la Dissimulation de requêtes HTTP (utilisez plutôt votre + moteur de recherche favori) ; il est cependant important de savoir qu'il + est possible d'élaborer une série de requêtes, et d'exploiter une + vulnérabilité d'un serveur web d'origine de façon que l'attaquant + puisse contrôler entièrement le contenu renvoyé par le mandataire.

    + + +

    Déni de Service / Cachebusting

    + + +

    Le mécanisme utilisé via l'en-tête Vary permet de mettre en + cache simultanément plusieurs variantes d'une ressource avec la + même URL. Le cache sélectionne la variante correcte à envoyer au + client en fonction des valeurs d'en-tête fournies par ce dernier. + Ce mécanisme peut devenir un problème lorsqu'on tente d'appliquer + le mécanisme des variantes à un en-tête connu pour pouvoir + posséder un grand nombre de valeurs + possibles en utilisation normal, comme par exemple l'en-tête + User-Agent. En fonction de la popularité du site web, + des milliers ou même des millions d'entrées de cache dupliquées + peuvent être créées pour la même URL, submergeant les autres + entrées du cache.

    + +

    Dans d'autres cas, il peut être nécessaire de modifier l'URL + d'une ressource particulière à chaque requête, en général en lui + ajoutant une chaîne "cachebuster". Si ce contenu est déclaré comme + pouvant être mis en cache par un serveur avec une durée de + fraîcheur significative, ces entrées peuvent submerger les entrées + légitimes du cache. Alors que mod_cache fournit + une directive CacheIgnoreURLSessionIdentifiers, + cette dernière doit être utilisée avec prudence pour s'assurer que + les caches du navigateur ou du mandataire le plus proche + (downstream proxy) ne sont pas victimes du même problème de Déni de + service.

    + +
    +
    +

    Langues Disponibles:  en  | + fr  | + tr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/caching.html.tr.utf8 b/docs/manual/caching.html.tr.utf8 new file mode 100644 index 0000000..211e04d --- /dev/null +++ b/docs/manual/caching.html.tr.utf8 @@ -0,0 +1,889 @@ + + + + + +Önbellek Kullanım Kılavuzu - Apache HTTP Sunucusu Sürüm 2.4 + + + + + + + +
    <-
    +

    Önbellek Kullanım Kılavuzu

    +
    +

    Mevcut Diller:  en  | + fr  | + tr 

    +
    + +

    Bu belge mod_cache, + mod_cache_disk, mod_file_cache + modülleri ve htcacheclean + için bir başvuru kılavuzu niteliğindedir. HTTP sunucusu ve vekil + olarak çalışmada işlemleri hızlandırmak için bilinen sorunlar ve + yanlış yapılandırmalardan kaçınarak Apache HTTPD sunucusunun önbellekleme + özelliklerinin nasıl kullanılacağı açıklanmıştır.

    +
    + +
    top
    +
    +

    GiriÅŸ

    + + +

    Apache HTTP sunucusu, sunucunun başarımını çeşitli yollarla arttırmak + üzere tasarlanmış bir dizi önbellekleme özelliğine sahiptir.

    + +
    +
    Üç durumlu RFC2616 HTTP önbelleklemesi
    +
    + mod_cache ve destek modülü + mod_cache_disk akılcı ve HTTP'ye uygun + önbellekleme sağlar. İçeriğin kendisi önbellekte saklanır ve + mod_cache, RFC2616'nın 13. bölümünde açıklandığı gibi, içeriğin + önbelleklenebilirliğini denetleyen çeşitli HTTP başlıklarının ve + seçeneklerinin tümünü onurlandırmayı hedefler. + Devingen yerel içerik veya vekalet edilen içerik ile ilgilendiğiniz + durumda veya muhtemel bir yavaş disk üzerinde yerel dosyalara + erişimi hızlandırmak ihtiyacında olduğunuz durumda + mod_cache hem basit hem de karmaşık önbellekleme + yapılandırmalarını hedefler. +
    +
    İki durumlu anahtar/değer paylaşımlı nesne önbellekleme
    +
    + Paylaşımlı nesne önbellek API'si + (socache) ve destek modülleri sunucu taraflı bir anahtar/değer + paylaşımlı nesne önbelleklemesi sağlar. Bu modüller SSL oturumları + ve kimlik doğrulama bilgileri gibi düşük seviyeli verileri + önbelleklemek için tasarlanmıştır. Destek modülleri verinin sunucu + tarafı bir paylaşımlı bellekte veya veri merkezi tarafı memcache + veya distcache gibi bir önbellekte saklanmasını mümkün kılar. +
    +
    Uzmanlaşmış dosya önbellekleme
    +
    + mod_file_cache dosyaların sunucunun başlatılması + sırasında belleğe yüklenmesi ile ilgilenir. Böylece dosyalara + erişim zamanını kısaltabilir, sıkça erişilen dosyaların dosya + tanıtıcılarını kaydedebilir, her istekte diske gitme ihtiyacını + ortadan kaldırır. +
    +
    + +

    Bu belgeden azami yararı sağlayabilmek için temel bir HTTP bilginizin + olması ve URL’lerin Dosya Sistemine + Eşlenmesi ile İçerik Uzlaşımı + belgelerini okumuş olmanız gerekir.

    + +
    top
    +
    +

    Üç durumlu RFC2616 HTTP önbelleklemesi

    + + + + + +

    HTTP protokolü + RFC2616'nın 13. bölümünde açıklanan satıriçi önbellekleme + mekanizması için yerleşik bir destek içerir ve bunun getirilerinden + yararlanmak için mod_cache modülü kullanılabilir.

    + +

    İçeriğin taze olmadığı durumda içeriğin kaybolmasına sebep olan basit + iki durumlu anahtar/değer önbelleklemesinin tersine, HTTP önbelleği + eskimiş içeriği tutan ve bu eski içeriğin değişip değişmediğini özgün + sunucuya soran ve duruma göre onu tekrar taze duruma getiren bir + mekanizma içerir.

    + +

    HTTP önbelleğinde bulunan bir girdi şu üç durumdan birinde olabilir:

    + +
    +
    Taze
    +
    + İçerik yeteri kadar yeni (tazelik ömründen daha genç) + ise taze sayılır. Bir HTTP önbelleği böyle bir içeriği + özgün sunucuya birşey sormadan sunabilir. +
    +
    Bayat
    +
    +

    İçerik çok eski (tazelik ömründen daha yaşlı) + ise bayat sayılır. Bir HTTP önbelleği böyle bir + içeriği istemciye sunmadan önce özgün sunucuya bağlanıp bayat içeriğin + hala yeterince taze olup olmadığına bakmalıdır. Özgün sunucu, içerik + geçersizse yenisini gönderecektir, aksi takdirde, (ideal olanı budur) + içeriğin hala geçerli olduğunu belirten bir kod ile yanıt verecektir. + İçerik tekrar taze hale gelince süreç kaldığı yerden devam eder.

    + +

    HTTP protokolü belli koşullar altında önbelleğin bayat içeriği + sunmasına izin vermez. Örneğin, bir içeriği özgün sunucuda tazeleme + çabasının bir 5xx hatasıyla başarısız olması veya başka bir tazeleme + isteğinin henüz sonuçlanmamış olması bu çeşit koşullardandır. Bu + durumlarda yanıta bir Warning başlığı eklenir.

    +
    +
    Yok
    +
    + Önbellekte yer kalmazsa yer açmak için içeriğin silinmesi seçenek + dahilindedir. İçerik taze olsun olmasın her zaman silinebilir. Önlem + olarak htcacheclean elle veya bir artalan süreci + olarak çalıştırılabilir. Böylece önbelleğin boyutunun belirtilen + boyutta veya belirtilen dosya düğümü sayısında kalması sağlanabilir. + Araç içeriği silerken bayat içeriğe öncelik verir. +
    +
    + +

    HTTP önbelleklemesinin çalışması ile ilgili bütün ayrıntılar + RFC2616'nın 13. bölümünde bulunabilir.

    + +

    Sunucu ile etkileÅŸim

    + + +

    mod_cache modülü + CacheQuickHandler yönergesinin + değerine bağlı olarak iki olası yerde sunucuya bağlanır: +

    + +
    +
    Çabuk eylem aşaması
    +
    +

    Bu aşama çok erken gerçekleşen bir aşama olup isteğin işlenmesi + sırasında isteğin çözümlenmesinin hemen sonrasıdır. İçerik + önbellekte mevcutsa hemen sunulur ve geri kalan istek işleme işlemi + iptal edilir.

    + +

    Bu senaryoda önbellek sunucunun önüne vidalanmış gibi + davranır.

    + +

    Sunucuda gerçekleşecek bir dizi işlemin büyük çoğunluğunun + yapılmadan geçilmesi nedeniyle bu en yüksek başarımlı kiptir. + Bu kip ayrıca, sunucu işlemlerinin kimlik doğrulama ve yetkilendirme + aşamalarının da yapılmadan geçilmesini sağlar. Bu bakımdan bu kip + seçilirken bu durum dikkate alınmalıdır.

    + +

    "Authorization" başlığı içeren istekler (örneğin, HTTP Temel + Kimlik Kanıtlaması gibi) mod_cache bu kipte + çalışırken önbelleğe alınmadıkları gibi önbellekten bir işleme de + sokulmazlar.

    +
    +
    Normal eylem aşaması
    +
    +

    Bu aşama geç bir aşama olup, isteğin tamamen işlenmesinin + sonrasıdır.

    + +

    Bu senaryoda önbellek sunucunun arkasına vidalanmış gibi + davranır.

    + +

    Bu kip en esneğidir. Önbelleğin, süzme zincirinin hassas olarak + denetlenen bir noktasında oluşması sağlanabilir ve önbelleklenen + içerik istemciye gönderilmeden önce süzülüp + kişiselleştirilebilir.

    +
    +
    + +

    URL önbellekte yoksa mod_cache modülü yanıtı + önbelleğe kaydetme aşamasında süzgeç yığıtına bir + süzgeç ekler ve geri çekilerek normal istek + işlemlerinin devam etmesine izin verir. İçeriğin önbelleklenebilir + olduğu saptanırsa içerik gelecekte sunulmak üzere önbelleğe + kaydedilir, aksi takdirde içerik yok sayılır.

    + +

    Önbellekteki içerik bayatsa, mod_cache modülü + isteği bir koşullu istek haline getirir. Özgün + sunucu normal bir yanıt verirse bu yanıt mevcut içeriğin yerine + önbelleklenir. Özgün sunucu bir 304 Not Modified yanıtı + verirse içerik tekrar taze olarak imlenir ve önbellekteki içerik + süzgeç tarafından kaydedilmeden sunulur.

    + + +

    Önbelleğin Hızlandırılması

    + + +

    Bir sanal konak birçok farklı sunucu takma adından biri olarak + bilindiği takdirde UseCanonicalName yönergesine On + değeri atanmışsa önbellekten sunulan sayfa sayısında büyük bir artış + olduğu görülür. Bunun sebebi içeriği sunan sanal konağın isminin + önbellek anahtarının içinde kullanılmasıdır. Yönergeye + On değerini atamak suretiyle çok isimli ve rumuzlu sanal + konaklar için farklı önbellek girdileri oluşturulmaz, bunun yerine her + meşru sanal konak için ayrı bir önbellek tutulur.

    + + +

    Tazelik Ömrü

    + + +

    Önbelleklenmek üzere tasarlanmış iyi biçimli bir içerik tazelik ömrünü + Cache-Control başlığının max-age veya + s-maxage alanlarıyla ya da bir Expires + başlığını içererek bildirmelidir.

    + +

    Aynı zamanda, özgün sunucunun tanımladığı tazelik ömrü, bir istemci + tarafından istekte bir Cache-Control başlığı kullanılarak + geçersiz kılınmak istenebilir. Bu durumda hangi tazelik ömrü daha + kısaysa o geçerli olur.

    + +

    Tazelik ömrü istekte veya yanıtta mevcut değilse öntanımlı bir tazelik + ömrü kullanılır. Öntanımlı tazelik ömrü önbellekli içerik için bir saat + olmakla birlikte CacheDefaultExpire yönergesi + kullanılarak kolayca değiştirilebilir.

    + +

    Bir yanıt Expires başlığını değil de + Last-Modified başlığını içeriyorsa + mod_cache tazelik ömrünü CacheLastModifiedFactor yönergesine + bakarak saptar.

    + +

    Yerel içerik için, ya da kendi Expires başlığını + tanımlamayan uzak içerik için tazelik ömrünü max-age ve + Expires ekleyerek hassas olarak ayarlamak + için mod_expires kullanılabilir.

    + +

    Tazelik ömrünün üst sınırı CacheMaxExpire yönergesi ile + belirlenebilir.

    + + +

    Şartlı İstekler için Özlü Kılavuz

    + + +

    Önbellekteki içeriğin zaman aşımına uğrayıp bayat hale gelmesi, + httpd’nin özgün isteği aktarmak yerine isteği değişikliğe uğratarak + şartlı bir istek yapması sonucunu doğurur.

    + +

    Özgün önbellekli yanıtta bir ETag başlığı mevcutsa, + mod_cache modülü özgün sunucuya yapılan isteğe + bir If-None-Match başlığı ekler. + Özgün önbellekli yanıtta bir Last-Modified başlığı + mevcutsa, mod_cache modülü özgün sunucuya yapılan + isteğe bir If-Modified-Since başlığı ekler. Bunlardan + birinin varlığı isteği koşullu yapar.

    + +

    Bir koşullu istek özgün sunucu tarafından alındığında, özgün sunucu + ETag veya Last-Modified başlığının isteğe + uygun olarak değişip değişmediğine bakmalıdır. Değişmemişse, özgün + sunucu kısa ve öz bir "304 Not Modified" yanıtı ile yanıt vermelidir. + Bunun önbellekteki anlamı şudur: Eskimiş içerik hala tazedir ve içerik + yeni tazelik ömrüne ulaşıncaya kadar sonraki isteklerde + kullanılmalıdır.

    + +

    İçerik değişmişse, bir şartlı istek yapılmamış gibi içeriğin kendisi + sunulur.

    + +

    Şartlı istekler çifte yarar sağlar. Birinci olarak, böyle bir istek + özgün sunucuya yapılıyorsa ve iki içerik de aynıysa bunu saptamak kolay + olur ve özkaynağın tamamını aktarma külfetinden kurtulunur.

    + +

    İkinci olarak, iyi tasarlanmış bir özgün sunucu, koşullu istekler tam + bir yanıt üretmekten önemli ölçüde ucuz olacak şekilde tasarlanmış + olacaktır. Durağan dosyalar için bu genellikle + stat() veya benzeri bir sistem çağrısıyla dosya + boyutları ve değişiklik zamanına bakmak şeklinde gerçekleşir. + Böylelikle, yerel içeriği bir değişiklik olmadığı takdirde önbellekten + sunmak daha hızlı olacaktır.

    + +

    Özgün sunucular koşullu istekleri desteklemek için her türlü çabayı + göstermelidir. Ancak, koşullu istekler desteklenmiyorsa, özgün sunucu + istek koşullu değilmiş gibi yanıt vermeli, önbellek ise, içerik + değişmiş ve yani içerik önbelleğe kaydedilmiş gibi yanıt vermelidir. Bu + durumda, önbellek basit bir iki durumlu (içerik ya tazedir ya da + silinmiş) önbellek gibi davranacaktır.

    + + +

    Neler Önbelleklenebilir?

    + + +

    HTTP önbelleğin tarafından önbelleklenebilecek içerik + + RFC2616 Section 13.4 Response Cacheability belgesinde tanımlanmış + olup, bunlar şöyle özetlenebilir:

    + +
      +
    1. Önbellekleme bu URL ile etkin kılınabilmelidir. CacheEnable ve CacheDisable yönergelerine bakınız.
    2. + +
    3. Yanıtın HTTP durum kodu 200, 203, 300, 301 veya 410 olmalıdır.
    4. + +
    5. Yanıtın HTTP durum kodu 200, 203, 300, 301 veya 410 değilse + yanıtın ayrıca, "Expires" veya "Cache-Control" başlığı da içermesi + gerekir.
    6. + +
    7. İstek bir HTTP GET isteği olmalıdır.
    8. + +
    9. Eğer yanıt bir "Authorization:" başlığı içeriyorsa ayrıca + "Cache-Control:" başlığında da "s-maxage", "must-revalidate" veya + "public" değerlerinden birini içermelidir, aksi takdirde + önbelleklenmez.
    10. + +
    11. Eğer URL (GET yöntemi kullanan bir HTML formunun yaptığı gibi) bir + sorgu dizgesi içeriyorsa yanıt, RFC2616’nın 13.9. bölümünde + açıklandığı gibi bir "Expires:" başlığı içermedikçe veya + "Cache-Control:" başlığının max-age veya max-age yönergesini + içermedikçe yanıt içeriği önbelleğe alınmayacaktır.
    12. + +
    13. CacheIgnoreNoLastMod + yönergesinin kullanımını gerektiren bir durum olmadıkça 200 durum + koduna sahip bir yanıtın "Etag", "Last-Modified" ve "Expires" + başlıklarından birini veya "Cache-Control:" başlığının "max-age" veya + "s-maxage" yönergelerinden birini (en azından) içermesi gerekir.
    14. + +
    15. CacheStorePrivate + yönergesinin kullanımını gerektiren bir durum olmadıkça yanıt + "private" değerli bir "Cache-Control:" başlığı içerdiği takdirde + yanıtın içeriği önbelleğe alınmayacaktır.
    16. + +
    17. Benzer şekilde, CacheStoreNoStore yönergesi kullanılmamışsa yanıt + "no-store" değerli bir "Cache-Control:" başlığı içeriyorsa yanıt + içeriği önbelleğe alınmayacaktır.
    18. + +
    19. Herşeyle eşleşen "*" değerli bir "Vary:" başlığı içeren bir + yanıtın içeriği önbelleğe alınmaz.
    20. +
    + + +

    Neler Önbelleklenmemeli?

    + + +

    İçerik zamana bağımlıysa ya da istek kısmen bile olsa HTTP uzlaşımıyla + bağdaşmıyorsa önbelleğe alınmamalıdır. Bu içerik önbelleklenemeyeceğini + Cache-Control başlığını kullanarak sunucuya + bildirmelidir.

    + +

    İçerik sıkça değişiyorsa, tazelik ömrü dakikalar veya saniyelerle + ifade ediliyorsa, içerik yine de önbelleklenebilir. Ancak, tam + yanıtların düzenli olarak üretilmemesinin temini için özgün sunucunun + koşullu istekleri doğru olarak desteklemesi + sağlanmalıdır.

    + +

    İstemcinin sağladığı istek başlıklarına dayanarak değişen içerik, + Vary yanıt başlığının akıllıca kullanımıyla + önbelleklenebilir.

    + + +

    Değişken/Uzlaşımlı İçerik

    + + +

    Özgün sunucu, istekteki başlık değerlerine dayanarak farklı + içeriklerle yanıt vermeye ayarlandığı takdirde, örneğin aynı URL'de + farklı dillerde içerik sunmak gibi, HTTP'nin önbellekleme mekanizması + aynı URL'de aynı sayfanın değişik sürümlerini önbelleklemeyi mümkün + kılar.

    + +

    Bu özgün sunucu tarafından bir Vary başlığı eklenerek + yapılır. Bir sayfanın farklı sürümleri arasındaki farkları saptarken + önbellek tarafından hangi başlıkların hesaba katılacağını + Vary başlığı belirler.

    + +

    Örneğin, bir yanıt şöyle bir başlık ile alınmışsa,

    + +

    + Vary: negotiate,accept-language,accept-charset +

    + +

    mod_cache sadece accept-language ve accept-charset + başlıkları özgün istekle eşleşen önbellekli içeriği sunacaktır.

    + +

    İçeriğin farklı sürümleri yan yana önbelleklenebilir. + mod_cache modülü Vary başlığını + kullanarak başlıkta listelenmiş istek başlıklarının uygun değerlerini + saptar ve istemciye hangi sürümle yanıt verileceğine karar verir.

    + + +
    top
    +
    +

    Önbellek Ayarlama Örnekleri

    + + + + + +

    Disk Üzerinde Önbellekleme

    + + +

    mod_cache modülü önbelleği yönetmek için çeşitli + depolama ortamlarına özgü gerçeklenimleri kullanır. Diske önbellekleme + desteğini mod_cache_disk sağlar.

    + +

    Tipik olarak modül şöyle yapılandırılır:

    + +
    CacheRoot   "/var/cache/apache/"
    +CacheEnable disk /
    +CacheDirLevels 2
    +CacheDirLength 1
    + + +

    En önemlisi önbelleklenen dosyaların yerel olarak saklanması olup + işletim sisteminin sağladığı bellekiçi önbelleklemeden de ayrıca + faydalanılmış olur. Bu bakımdan, dosyalar disk üzerinde saklansa bile + sıkça erişilen dosyalar işletim sistemi sayesinde aslında bellekten + sunulmuş olacaklardır.

    + + +

    Önbellekte Saklamanın Anlamı

    + + +

    mod_cache_disk öğeleri önbellekte saklamak için + istek yapılan URL’nin 22 karakterlik özetini oluşturur. Bu özet, çok + sayıda URL’nin aynı özeti oluşturmaması için konak ismi, protokol, + port ve varsa CGI argümanlarından başka Vary başlığında + tanımlı elemanlardan oluşur.

    + +

    Özeti oluşturan karakterler 64 karakterlik bir karakter kümesinden + seçildiğinden oluşturulması olası farklı özet sayısı 64^22’dir. + Örneğin, bir URL’nin xyTGxSMO2b68mBCykqkp1w gibi bir + özeti olabilir. Bu özet, bu URL ile erişilen dosyalar önbellek içinde + saklanırken dosya ismi öneki olarak kullanılır. Ancak bununla + yetinilmez ve içerik CacheDirLevels ve CacheDirLength yönergelerinin + değerlerine göre önce dizinlere ayrılır.

    + +

    CacheDirLevels + yönergesi kaç alt seviye dizin olacağını ve CacheDirLength her dizinde kaç + karakter olacağını belirler. Örneğin, yukarıdaki + özete sahip bir dosyanın isminin başına yukarıdaki yapılandırma + örneğine uygun olarak + /var/cache/apache/x/y/TGxSMO2b68mBCykqkp1w gibi bir önek + getirilebilirdi.

    + +

    Bu tekniğin asıl amacı belli bir dizin içinde bulunabilecek + dosyaların ve alt dizinlerin sayısını düşük tutmaktır. Bu sayının + büyük olması çoğu işletim sisteminde başarımın düşmesine sebep olur. + CacheDirLength + yönergesi "1" değeriyle kullanıldığında her dizin altında en fazla 64 + alt dizin veya dosya açılabilir. "2" değeriyle kullanıldığında ise bu + sayı 64^2’ye yükselir ve böyle artarak gider. İyi bir sebebiniz + olmadıkça CacheDirLength için değer olarak + "1" belirtmenizi öneririz.

    + +

    CacheDirLevels + yönergesine atanacak değer önbellekte saklamayı düşündüğünüz olası + dosya sayısı ile ilgilidir. Yukarıdaki örnekte olduğu gibi "2" + değerini belirtirseniz, toplamda en fazla 4096 dizin oluşturulabilir. + 1 milyon dosyanın önbelleklendiği bir durumda bu, her dizinde yaklaşık + olarak 245 önbelleklenmiş URL demektir.

    + +

    Her URL için önbellekte en az iki dosya saklanır. Biri genellikle URL + hakkındaki temel verilerden oluşan ".header" dosyasıdır, diğeri ise + sunulacak içeriğin bire bir kopyası olan ".data" dosyasıdır.

    + +

    "Vary" başlığı üzerinden içeriğin uzlaşıldığı durumda URL için bir + ".vary" dizini oluşturulur. Bu dizin her biri farklı bir uzlaşıma ait + çok sayıda ".data" dosyası içerebilir.

    + + +

    Disk Önbelleğinin Bakımı

    + + +

    mod_cache_disk zaman aşımına uğrayan önbellekli + içeriği silse de önbelleğin toplam boyu ve ne kadar boş bellek kaldığı + hakkında bilgi vermez.

    + +

    Bunun yerine httpd önbellek içeriğini düzenli aralıklarla + temizleyebilmeniz için htcacheclean adında bir araç + içerir. Önbellek için azami ne kadar yer kullanılacağının ve bunun + üzerinde htcacheclean’i hangi sıklıkta + çalıştırılacağının tespiti biraz karmaşık bir işlem olup uygun değerler + genellikle deneme yanılma yoluyla bulunur.

    + +

    htcacheclean iki işlem kipine sahiptir. Kalıcı bir + artalan süreci olarak çalışabileceği gibi cron üzerinden belli + aralıklarla da çalıştırılabilir. Çok büyük (onlarca GB) önbelleklerde + htcacheclean’in işini bitirmesi 1 saatten fazla + sürebileceğinden, cron ile çalıştırma durumunda aynı anda birden fazla + kopyanın çalışıyor durumda olmaması için + htcacheclean’in çalıştırılma aralığını iyi + belirlemek gerekir.

    + +

    Ayrıca, htcacheclean için uygun bir "nice" seviyesi + seçilmesi önerilr. Böylece, sunucu çalışırken aracın ölçüsüz disk g/ç + yapmasına sebebiyet verilmemiş olur.

    + +

    +
    + Şekil 1: + Önbelleğin büyümesi ve düzenli aralıklarla temizlenmesi.

    + +

    mod_cache_disk ne kadar bellek kullanıldığı hakkında + bilgi vermediğinden, htcacheclean'in bir temizliğin + ardından yeterli bir büyüme alanı kalacak şekilde yapılandırılması + temin edilmelidir.

    + + +

    memcached ile önbellekleme

    + + +

    mod_cache_socache modülünü kullanarak, + mod_cache çeşitli gerçeklenimlerden (diğer adıyla: + "sağlayıcılar"dan) gelen veriyi önbellekleyebilir. + mod_socache_memcache modülü kullanılarak, örneğin, + artalan saklama mekanizması olarak + memcached kullanıldığı + söylenebilir.

    + +

    Genelde modül şöyle yapılandırılır:

    + +
    CacheEnable socache /
    +CacheSocache memcache:memcd.example.com:11211
    + + +

    İlave memcached sunucular + CacheSocache memcache: satırının ardına virgüllerle + ayrılarak eklenebilir:

    + +
    CacheEnable socache /
    +CacheSocache memcache:mem1.example.com:11211,mem2.example.com:11212
    + + +

    Bu biçim diğer mod_cache_socache sağlayıcıları için de kullanılabilir:

    + +
    CacheEnable socache /
    +CacheSocache shmcb:/path/to/datafile(512000)
    + + +
    CacheEnable socache /
    +CacheSocache dbm:/path/to/datafile
    + + + + +
    top
    +
    +

    Genel İki durumlu Anahtar/Değer Paylaşımlı Nesne Önbellekleme

    + + + + +

    Apache HTTP sunucusu, SSL oturumları, kimlik doğrulama bilgileri gibi + önbelleklenebilen özel bilgiler için socache + arayüzü içinde düşük seviyeli bir paylaşımlı nesne önbelleğine + sahiptir.

    + +

    Her gerçeklenime uygun ek modüller de sağlanmıştır:

    + +
    +
    mod_socache_dbm
    +
    DBM tabanlı paylaşımlı nesne önbelleklemesi.
    +
    mod_socache_dc
    +
    Distcache tabanlı paylaşımlı nesne önbelleklemesi.
    +
    mod_socache_memcache
    +
    Memcache tabanlı paylaşımlı nesne önbelleklemesi.
    +
    mod_socache_shmcb
    +
    Paylaşımlı belleğe dayalı paylaşımlı nesne önbelleklemesi.
    +
    + +

    Kimlik Doğrulama Bilgilerinin Önbelleklenmesi

    + + + + +

    mod_authn_socache modülü kimlik doğrulama araçlarının + yükünün hafifletilmesini, kimlik doğrulama sonucunun önbelleklenmesini + sağlar.

    + + +

    SSL Oturumlarının Önbelleklenmesi

    + + + + +

    mod_ssl modülü, oturum önbelleği ve önbellek + zımbalaması sağlamak için socache arayüzünü kullanır.

    + +
    top
    +
    +

    Uzmanlaşmış Dosya Önbellekleme

    + + + + +

    Dosya sisteminin yavaş olabildiği veya dosya tanıtıcılarının + kullanımının pahalıya mal olduğu sistemlerde, sunucunun başlatılması + sırasında dosyaların belleğe yüklenmesi seçeneği vardır.

    + +

    Dosyaların açılmasının yavaş olduğu sistemlerde, dosyaların sunucunun + başlatılması sırasında açılması ve dosya tanıtıcısını önbelleklenmesi + seçeneği vardır. Bu seçeneklerin duruk dosyalara erişimin yavaş olduğu + sistemlere de bir yardımı olabilir.

    + +

    Dosya Tanıtıcı Önbelleklemesi

    + + +

    Bir dosyanın açılması işlemi, özellikle de ağ dosya sistemlerinde + bulunan dosyalar için önemli bir gecikme kaynağı olabilir. Önbellekte, + çok sunulan dosyaların kendilerinin değil, açık dosya tanıtıcılarının + saklanması httpd’yi bu tür gecikmelerden koruyabilir. httpd’de tek + türde dosya tanıtıcı önbelleklemesi yapılabilmektedir.

    + +

    CacheFile yönergesi ile

    + + +

    httpd’de mevcut önbelleklemenin en temel şekli + mod_file_cache tarafından sağlanan dosya tanıtıcı + önbelleklemesidir. Bu önbellek türü dosyaların kendilerini değil açık + dosya tanıtıcılarının bir listesini saklar. Dosyaların bu anlamda + önbelleklenmesi, CacheFile yönergesi yapılandırma dosyasında belirtilerek + sağlanabilir.

    + +

    CacheFile yönergesi + belirtilen dosyanın httpd başlatıldığında açılmasını ve dosya için + yapılan sonraki her istekte bu dosya tanıtıcısının kullanılmasını + sağlar.

    + +
    CacheFile /usr/local/apache2/htdocs/index.html
    + + +

    Büyük miktarda dosyayı bu anlamda önbelleklemeyi tasarlıyorsanız + işletim sisteminizin açık dosya tanıtıcılarının sayısı ile ilgili + sınırlamasını uygun bir değere ayarlamanız gerekebilir.

    + +

    CacheFile yönergesini + kullandığınız takdirde dosya içeriğindeki değişiklikleri anında + isteğe yansıtamazsınız. httpd dosyayı ilk başlatıldığındaki haliyle + sunar.

    + +

    Eğer httpd çalışırken dosya silinmişse httpd ilk başlatıldığındaki + haline ilişkin dosya tanıtıcıyı sağlamaya ve dolayısıyla dosya + içeriğini sunmaya devam edecektir. Yani, dosya silinmiş ve artık + dosya sisteminde görünmüyor olsa bile httpd durdurulup dosya + tanıtıcıları kapanmadıkça dosyaların silinmesiyle açılan yer serbest + kalmayacaktır.

    + + + + +

    Sistem Belleğinde Önbellekleme

    + + +

    İçeriğin sistem belleğinden sunulması içerik sunmanın evrensel olarak + en hızlı yoludur. Dosyaların bir disk denetleyiciden okunması ya da daha + kötüsü uzak bir ağdan okunması bellekten okumayla karşılaştırılamayacak + ölçüde yavaş işlemlerdir. Disk denetleyiciler genellikle fiziksel + süreçleri denetlerler. Ağ erişimi ise band genişliği sınırlamalarından + etkilenir. Halbuki bellek erişimi sadece nano saniyeler mertebesinde + gerçekleşir.

    + +

    Sistem belleği en pahalı saklama ortamı olması sebebiyle en verimli + şekilde kullanımı önemlidir. Dosyaları sistem belleğinde saklamakla + sistemin kullanabileceği bellek miktarını azaltmış olursunuz. İşletim + sistemi önbelleklemesinde göreceğiniz gibi bu öyle basit bir konu + değildir. httpd’nin kendi kullandığı belleğin bir kısmını önbellek + olarak ayırırken çok fazla bellek kullanmamak önemlidir. Aksi takdirde + işletim sistemi belleğin yetmediği noktada belleği diske + takaslayacağından istenen başarım artışı sağlanamayacaktır.

    + +

    İşletim Sistemi Önbelleklemesi

    + + +

    Günümüz iştetim sistemlerinin hemen hemen tamamında bellek içi + dosya/veri saklama işlemlerini çekirdek yönetir. Bu güçlü bir + özelliktir ve işletim sistemlerinin büyük çoğunluğu bunu böyle yapar. + Örneğin, Linux’ta bir dosyanın ilk defa okunduğunda ve ikinci kez + okunduğunda işlemcinin ne kadar meşgul edildiğine bakalım:

    + +

    + colm@coroebus:~$ time cat testfile > /dev/null
    + real 0m0.065s
    + user 0m0.000s
    + sys 0m0.001s
    + colm@coroebus:~$ time cat testfile > /dev/null
    + real 0m0.003s
    + user 0m0.003s
    + sys 0m0.000s +

    + +

    Küçük bir dosya için bile okuma süresi bakımından büyük fark ortaya + çıkmaktadır. Bunun sebebi çekirdeğin dosya içeriğini bellek daha + güncel amaçlar için lazım olana dek bellek içinde saklamasıdır.

    + +

    Sisteminizde yeterince yedek bellek olduğundan eminseniz, bu + önbellekte daha fazla dosya saklanacağından emin olabilirsiniz. + Bundan, önbelleğin sistem belleğinde verimli biçimde tutulması için + httpd’de ek bir yapılandırmaya gidilmesinin gerekmediği sonucu + çıkarılabilir.

    + +

    Bundan başka, işletim sistemi dosyaların değiştiği ve silindiği + zamanları bildiğinden bu tür dosyaların içerikleri gerektiğinde + önbellekten kendiliğinden silinmiş olur. Bellek içinde dosya + saklarken dosyaların değiştirilme zamanlarını bilme olanağı + olmadığından bu durum httpd’ye büyük yarar sağlar.

    + + +

    İşletim sisteminin dosyaların önbelleklenmesi için sağladığı bunca + yarara ve başarım artışına karşın bellek içinde dosya önbelleklemenin + httpd tarafından yerine getirilmesinin daha iyi olacağı bazı durumlar + vardır.

    + +

    MMapFile yönergesi ile

    + + +

    mod_file_cache modülü, bir durağan dosyanın + içeriğini sunucunun başlatılması sırasında (mmap sistem çağrısıyla) + belleğe eşlenmesini mümkün kılmak için MMapFile yönergesini sağlar. + httpd bu dosyaya gelecek sonraki istekler için dosyanın bellekiçi + içeriğini kullanacaktır.

    + +
    MMapFile /usr/local/apache2/htdocs/index.html
    + + +

    CacheFile + yönergesinde olduğu gibi bu dosyalarda httpd başlatıldıktan sonra + yapılacak bir değişiklikten httpd’nin haberi olmayacaktır.

    + +

    MMapFile yönergesi + ayırdığı belleğin toplam miktarı ile ilgilenmez, dolayısıyla + yönergenin aşırı kullanımından kaçınmalısınız. httpd’nin çocuk + süreçlerinin her biri bu belleğin kendilerine ait birer kopyasını + yapacağından belleğe eşlenen dosyaların çok yer kaplamaması büyük + önem taşımaktadır; aksi takdirde işletim sistemi belleği diske + takaslayacağından beklenen fayda sağlanamayacaktır.

    + + +
    top
    +
    +

    Güvenlik Kaygıları

    + + +

    EriÅŸim Denetimi ve Yetkilendirme

    + + +

    CacheQuickHandler + yönergesine On değerinin atandığı öntanımlı durumda + mod_cache kullanımı, daha çok sunucunun önüne + vidalanmış önbelleklemeli bir karşı vekile sahip olmak gibidir. Özgün + sunucunun bir harici önbellekmiş gibi sorgulanmasını gerektirmeyen tüm + istekler önbellekleme modülü tarafından karşılanacaktır. Bu durum + httpd'nin güvenlik modelini büyük ölçüde değiştirir.

    + +

    Olası .htaccess dosyalarının dosya sisteminin tamamında + taranması çok pahalı bir işlem olduğundan mod_cache, + (işlemi hızlandırmak için) önbelleğe almanın temel amacını kısmen + gözardı ederek, önbellekteki içeriğin sunumu için gerekli + yetkilendirmenin olup olmadığı konusunda bir karar üretmez. Başka bir + deyişle, eğer mod_cache bir kısım içeriği önbelleğe + almışsa içerik zaman aşımına uğramadığı sürece bu içerik önbellekten + sunulacaktır.

    + +

    Örneğin, yapılandırmanız bir özkaynağa IP adresine göre erişime izin + veriyorsa bu içeriğin önbelleğe alınmayacağından emin olmalısınız. + Bunu CacheDisable + yönergesini veya mod_expires modülünü kullanarak + yapabilirsiniz. Bunu yapmaz, olayı kendi haline bırakırsanız + mod_cache bir karşı vekil gibi çalışarak sunulan her + içeriği önbelleğe alacak ve hangi IP adresinden gelirse gelsin her + istemciye bunu sunacaktır.

    + +

    CacheQuickHandler + yönergesine Off atandığı takdirde, istek işleme + aşamalarının tamamı yerine getirilir ve güvenlik modeli değişmeden + kalır.

    + + +

    Yerel İstismarcılar

    + + +

    Son kullanıcılarıın isteklerine önbellekten hizmet sunulduğundan + önbelleğin kendisi içerikle etkileşime geçmek isteyenlerin veya + içeriği tahrif etmek isteyenlerin hedefi haline gelebilir. httpd’yi + çalıştıran kullanıcı tarafından her zaman önbelleğe yazılabileceğini + akıldan çıkarmamak önemlidir. Bu durumda alışılmışın tersine tüm + içeriğin Apache kullanıcısı tarafından yazılamamasının sağlanması + önerilir.

    + +

    Eğer Apache kullanıcısı, örneğin bir CGI sürecindeki açık nedeniyle + tehlikeye atılırsa, önbellek hedef alınabilir. + mod_cache_disk kullanılırken önbellekteki bir öğeyi + değiştirmek veya önbelleğe yeni bir öğe eklemek görece daha + kolaydır.

    + +

    Bu risk, Apache kullanıcısını kullanan diğer saldırı türleriyle + karşılaştırıldığında daha yüksektir. mod_cache_disk + kullanıyorsanız şunları aklınızdan çıkarmayın: (1) httpd güvenlik + güncellemelerini takip edin ve sunucunuzu buna göre güncelleyin. (2) + Mümkünse suEXEC kullanarak CGI süreçlerini + Apache kullanıcısı olmayan bir kullanıcının aidiyetinde çalıştırın.

    + + +

    Önbellek Zehirlenmeleri

    + + +

    httpd bir önbellekli vekil sunucu olarak çalıştığında önbellek + zehirlenmesi adı verilen sorunla karşılaşılma olasılığı vardır. + Önbellek zehirlenmesi, vekil sunucunun özgün sunucudan yanlış (ve + genellikle istenmeyen) içerik almasına sebep olan bir saldırı türünü + betimlemek için yaygın olarak kullanılan bir terimdir.

    + +

    Örneğin httpd’nin çalıştığı sistemin kullandığı DNS sunucuları DNS + önbellek zehirlenmesinden etkilenebilecek durumdaysa, bir saldırgan + httpd’nin istekleri almak için başvuracağı kaynak sunucunun yerini + değiştirebilir. Diğer bir örnek, HTTP istek kaçakçılığı adı verilen + bir saldırı türüdür.

    + +

    Bu belge HTTP istek kaçakçılığını derinliğine incelenmesi için uygun + yer değildir (böyle kaynaklara arama motorunuzla erişebilirsiniz). + Bununla birlikte, vekil tarafından kaynak sunucudan alınan içeriği + tamamen denetim altına almak amacıyla kaynak sunucudaki bir açığı + istismar etmeye yönelik bir dizi istek yapılabileceğinin olasılık + dahilinde olduğunu bilmenizde yarar vardır.

    + + +

    Hizmet Reddi / Önbelleğin Engellenmesi

    + + +

    Vary mekanizması aynı URL'nin çok sayıda sürümünün yan yana + önbelleklenmesini mümkün kılar. İstemci tarafından sağlanan başlık + değerlerine bağlı olarak, önbellek istemciye gönderilecek doğru yanıtı + bulacaktır. Normal kullanımda olası değerlerin çok geniş olduğunun + bilindiği durumda bir başlığı (örn, User-Agent) + değişikliğe uğratma çabası bu mekanizmayı bir sorun haline getirebilir. + Sitenin tanınırlığına bağlı olarak aynı URL'nin binlerce hatta + milyonlarca önbellek girdisi oluşabilir ve bunlar önbellekteki diğer + girdilerin yerini alabilir.

    + +

    Diğer yandan, belli bir özkaynağın URL'sinin her istekte + değiştirilmesi ihtiyacı ortaya çıkabilir. Bu normalde URL dizgesine bir + "cachebuster" dizgesi eklenerek yapılır. Bu içerik sunucu tarafından + anlamlı bir tazelik ömrüyle önbelleklenebilir olarak imlenmişse bu + girdiler kısa zamanda önbellekteki meşru girdilerin yerini alabilir. + mod_cache modülü bunun önlenmesi için CacheIgnoreURLSessionIdentifiers + yönergesine sahipse de bu yönerge, yoldaki vekillerin veya tarayıcı + önbelleklerinin aynı hizmet reddi saldırısına maruz kalmamaları için + dikkatle kullanılmalıdır.

    + +
    +
    +

    Mevcut Diller:  en  | + fr  | + tr 

    +
    top

    Yorumlar

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/configuring.html b/docs/manual/configuring.html new file mode 100644 index 0000000..7019240 --- /dev/null +++ b/docs/manual/configuring.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: configuring.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: configuring.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: configuring.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: configuring.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: configuring.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: configuring.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/configuring.html.de b/docs/manual/configuring.html.de new file mode 100644 index 0000000..5e3d4b2 --- /dev/null +++ b/docs/manual/configuring.html.de @@ -0,0 +1,216 @@ + + + + + +Konfigurationsdateien - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Konfigurationsdateien

    +
    +

    Verfügbare Sprachen:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    Diese Übersetzung ist möglicherweise + nicht mehr aktuell. Bitte prüfen Sie die englische Version auf + die neuesten Änderungen.
    + +

    Dieses Dokument beschreibt die Dateien, die zur Konfiguration des Apache + HTTP Servers verwendet werden.

    +
    + +
    top
    +
    +

    Hauptkonfigurationsdateien

    + + + +

    Der Apache wird konfiguriert, indem Direktiven in einfache Textdateien + eingetragen werden. Die Hauptkonfigurationsdatei heißt + üblicherweise httpd.conf. Der Ablageort dieser Datei + wird bei der Kompilierung festgelegt, kann jedoch mit der + Befehlszeilenoption -f überschrieben werden. Durch + Verwendung der Direktive Include + können außerdem weitere Konfigurationsdateien hinzugefügt + werden. Zum Einfügen von mehreren Konfigurationsdateien können + Platzhalter verwendet werden. Jede Direktive darf in jeder dieser + Konfigurationsdateien angegeben werden. Änderungen in den + Hauptkonfigurationsdateien werden vom Apache nur beim Start oder Neustart + erkannt.

    + +

    Der Server liest auch eine Datei mit MIME-Dokumenttypen ein. Der + Name dieser Datei wird durch die Direktive TypesConfig bestimmt. Die Voreinstellung + ist mime.types.

    +
    top
    +
    +

    Syntax der Konfigurationsdateien

    + + +

    Die Konfigurationsdateien des Apache enthalten eine Direktive pro Zeile. + Der Backslash "\" läßt sich als letztes Zeichen in einer Zeile + dazu verwenden, die Fortsetzung der Direktive in der nächsten Zeile + anzuzeigen. Es darf kein weiteres Zeichen oder Whitespace zwischen dem + Backslash und dem Zeilenende folgen.

    + +

    In den Konfigurationsdateien wird bei den Direktiven nicht zwischen + Groß- und Kleinschreibung unterschieden. Bei den Argumenten der + Direktiven wird dagegen oftmals zwischen Groß- und Kleinschreibung + differenziert. Zeilen, die mit dem Doppelkreuz "#" beginnen, werden als + Kommentare betrachtet und ignoriert. Kommentare dürfen + nicht am Ende einer Zeile nach der Direktive + eingefügt werden. Leerzeilen und Whitespaces vor einer Direktive + werden ignoriert. Dadurch lassen sich Direktiven zur besseren Lesbarbeit + einrücken.

    + +

    Sie können die Syntax Ihrer Konfigurationsdateien auf Fehler + prüfen, ohne den Server zu starten, indem Sie apachectl + configtest oder die Befehlszeilenoption -t + verwenden.

    +
    top
    +
    +

    Module

    + + + + +

    Der Apache ist ein modularer Server. Das bedeutet, dass nur die abolute + Grundfunktionalität im Kernserver enthalten ist. Weitergehende + Fähigkeiten sind mittels Modulen verfügbar, + die in den Apache geladen werden können. Standardmäßig + wird bei der Kompilierung ein Satz von Basismodulen (Anm.d.Ü.: die so + genannten Base-Module) in den Server eingebunden. Wenn der + Server für die Verwendung von dynamisch + ladbaren Modulen kompiliert wurde, dann können Module separat + kompiliert und jederzeit mittels der Direktive LoadModule hinzugefügt werden. + Andernfalls muss der Apache neu kompiliert werden, um Module + hinzuzufügen oder zu entfernen. Konfigurationsanweisungen können + abhängig vom Vorhandensein eines bestimmten Moduls eingesetzt werden, + indem sie in einen <IfModule>-Block eingeschlossen werden.

    + +

    Um zu sehen, welche Module momentan in den Server einkompiliert sind, + kann die Befehlszeilenoption -l verwendet werden.

    +
    top
    +
    +

    Der Gültigkeitsbereich von Direktiven

    + + + + +

    Direktiven in den Hauptkonfigurationsdateien gelten für den + gesamten Server. Wenn Sie die Konfiguration nur für einen Teil des + Servers verändern möchten, können Sie den + Gültigkeitsbereich der Direktiven beschränken, indem Sie diese + in <Directory>-, + <DirectoryMatch>-, + <Files>-, + <FilesMatch>-, + <Location>- oder + <LocationMatch>-Abschnitte eingefügen. + Diese Abschnitte begrenzen die Anwendung der umschlossenen Direktiven + auf bestimmte Pfade des Dateisystems oder auf + bestimmte URLs. Sie können für eine fein abgestimmte + Konfiguration auch ineinander verschachtelt werden.

    + + +

    Der Apache besitzt die Fähigkeit, mehrere verschiedene Websites + gleichzeitig zu bedienen. Dies wird virtuelles + Hosten genannt. Direktiven können auch in ihrem + Gültigkeitsgereich eingeschränkt werden, indem sie innerhalb + eines <VirtualHost>-Abschnittes angegeben werden. + Sie werden dann nur auf Anfragen für eine bestimmte Website + angewendet.

    + +

    Obwohl die meisten Direktiven in jedem dieser Abschnitte platziert + werden können, ergeben einige Direktiven in manchen Kontexten + keinen Sinn. Direktiven zur Prozesssteuerung beispielsweise + dürfen nur im Kontext des Hauptservers angegeben werden. Prüfen + Sie den Kontext der + Direktive, um herauszufinden, welche Direktiven in welche Abschnitte + eingefügt werden können. Weitere Informationen finden Sie unter + "Wie Directory-, Location- und Files-Abschnitte + arbeiten".

    + +
    top
    +
    +

    .htaccess-Dateien

    + + + + +

    Der Apache ermöglicht die dezentrale Verwaltung der + Konfiguration mittes spezieller Dateien innerhalb des + Web-Verzeichnisbaums. Diese speziellen Dateien heißen + gewöhnlich .htaccess, mit der Direktive AccessFileName kann jedoch auch ein anderer + Name festgelegt werden. In .htaccess-Dateien angegebene + Direktiven werden auf das Verzeichnis und dessen Unterverzeichnisse + angewendet, in dem die Datei abgelegt ist. .htaccess-Dateien + folgen der gleichen Syntax wie die Hauptkonfigurationsdateien. Da + .htaccess-Dateien bei jeder Anfrage eingelesen werden, + werden Änderungen in diesen Dateien sofort wirksam.

    + +

    Prüfen Sie den Kontext der Direktive, um + herauszufinden, welche Direktiven in .htaccess-Dateien + angegeben werden können. Darüber hinaus steuert der + Serveradministrator mit der Einstellung der Direktive AllowOverride in den + Hauptkonfigurationsdateien welche Direktiven in + .htaccess-Dateien verwendet werden dürfen.

    + +

    Weitere Informationen über .htaccess-Dateien finden + Sie in der .htaccess-Einführung.

    +
    +
    +

    Verfügbare Sprachen:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Kommentare

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/configuring.html.en b/docs/manual/configuring.html.en new file mode 100644 index 0000000..ff6d2dd --- /dev/null +++ b/docs/manual/configuring.html.en @@ -0,0 +1,235 @@ + + + + + +Configuration Files - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Configuration Files

    +
    +

    Available Languages:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    This document describes the files used to configure Apache HTTP +Server.

    +
    + +
    top
    +
    +

    Main Configuration Files

    + + + +

    Apache HTTP Server is configured by placing directives in plain text + configuration files. The main configuration file is usually called + httpd.conf. The location of this file is set at + compile-time, but may be overridden with the -f + command line flag. In addition, other configuration files may be + added using the Include + directive, and wildcards can be used to include many configuration + files. Any directive may be placed in any of these configuration + files. Changes to the main configuration files are only + recognized by httpd when it is started or restarted.

    + +

    The server also reads a file containing mime document types; + the filename is set by the TypesConfig directive, + and is mime.types by default.

    +
    top
    +
    +

    Syntax of the Configuration Files

    + + +

    httpd configuration files contain one directive per line. + The backslash "\" may be used as the last character on a line + to indicate that the directive continues onto the next line. + There must be no other characters or white space between the + backslash and the end of the line.

    + +

    Arguments to directives are separated by whitespace. If an + argument contains spaces, you must enclose that argument in quotes.

    + +

    Directives in the configuration files are case-insensitive, + but arguments to directives are often case sensitive. Lines + that begin with the hash character "#" are considered + comments, and are ignored. Comments may not be + included on the same line as a configuration directive. + White space occurring before a directive is ignored, so + you may indent directives for clarity. Blank lines are also ignored.

    + +

    The values of variables defined with the Define of or shell environment variables can + be used in configuration file lines using the syntax ${VAR}. + If "VAR" is the name of a valid variable, the value of that variable is + substituted into that spot in the configuration file line, and processing + continues as if that text were found directly in the configuration file. + Variables defined with Define take + precedence over shell environment variables. + If the "VAR" variable is not found, the characters ${VAR} + are left unchanged, and a warning is logged. + Variable names may not contain colon ":" characters, to avoid clashes with + RewriteMap's syntax.

    + +

    Only shell environment variables defined before the server is started + can be used in expansions. Environment variables defined in the + configuration file itself, for example with SetEnv, take effect too late to be used for + expansions in the configuration file.

    + +

    The maximum length of a line in normal configuration files, after + variable substitution and joining any continued lines, is approximately + 16 MiB. In .htaccess files, the + maximum length is 8190 characters.

    + +

    You can check your configuration files for syntax errors + without starting the server by using apachectl + configtest or the -t command line + option.

    + +

    You can use mod_info's -DDUMP_CONFIG to + dump the configuration with all included files and environment + variables resolved and all comments and non-matching + <IfDefine> and + <IfModule> sections + removed. However, the output does not reflect the merging or overriding + that may happen for repeated directives.

    +
    top
    +
    +

    Modules

    + + + + +

    httpd is a modular server. This implies that only the most + basic functionality is included in the core server. Extended + features are available through modules which can be loaded + into httpd. By default, a base set of modules is + included in the server at compile-time. If the server is + compiled to use dynamically loaded + modules, then modules can be compiled separately and added at + any time using the LoadModule + directive. + Otherwise, httpd must be recompiled to add or remove modules. + Configuration directives may be included conditional on a + presence of a particular module by enclosing them in an <IfModule> block. However, + <IfModule> blocks are not + required, and in some cases may mask the fact that you're missing an + important module.

    + +

    To see which modules are currently compiled into the server, + you can use the -l command line option. You can also + see what modules are loaded dynamically using the -M + command line option.

    +
    top
    +
    +

    Scope of Directives

    + + + + +

    Directives placed in the main configuration files apply to + the entire server. If you wish to change the configuration for + only a part of the server, you can scope your directives by + placing them in <Directory>, <DirectoryMatch>, <Files>, <FilesMatch>, <Location>, and <LocationMatch> + sections. These sections limit the application of the + directives which they enclose to particular filesystem + locations or URLs. They can also be nested, allowing for very + fine grained configuration.

    + +

    httpd has the capability to serve many different websites + simultaneously. This is called Virtual + Hosting. Directives can also be scoped by placing them + inside <VirtualHost> + sections, so that they will only apply to requests for a + particular website.

    + +

    Although most directives can be placed in any of these + sections, some directives do not make sense in some contexts. + For example, directives controlling process creation can only + be placed in the main server context. To find which directives + can be placed in which sections, check the Context of the + directive. For further information, we provide details on How Directory, Location and Files sections + work.

    +
    top
    +
    +

    .htaccess Files

    + + + + +

    httpd allows for decentralized management of configuration + via special files placed inside the web tree. The special files + are usually called .htaccess, but any name can be + specified in the AccessFileName + directive. Directives placed in .htaccess files + apply to the directory where you place the file, and all + sub-directories. The .htaccess files follow the + same syntax as the main configuration files. Since + .htaccess files are read on every request, changes + made in these files take immediate effect.

    + +

    To find which directives can be placed in + .htaccess files, check the Context of the + directive. The server administrator further controls what + directives may be placed in .htaccess files by + configuring the AllowOverride + directive in the main configuration files.

    + +

    For more information on .htaccess files, see + the .htaccess tutorial.

    +
    +
    +

    Available Languages:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/configuring.html.fr.utf8 b/docs/manual/configuring.html.fr.utf8 new file mode 100644 index 0000000..9f4c157 --- /dev/null +++ b/docs/manual/configuring.html.fr.utf8 @@ -0,0 +1,249 @@ + + + + + +Fichiers de configuration - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Fichiers de configuration

    +
    +

    Langues Disponibles:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Ce document décrit les fichiers utilisés pour configurer +le Serveur HTTP Apache.

    +
    + +
    top
    +
    +

    Fichiers de configuration principaux

    + + + +

    La configuration du serveur HTTP Apache est effectuée en plaçant des directives dans des fichiers de + configuration au format texte. Le fichier de configuration principal se nomme + en général + httpd.conf. La localisation de ce fichier est définie + à la compilation, mais peut être redéfinie à l'aide de l'option + de ligne de commande -f. En outre, d'autres fichiers de + configuration peuvent être ajoutés à l'aide de la directive + Include, et des caractères de + remplacement + peuvent être utilisés pour inclure de nombreux fichiers de configuration. + Des directives de tous types peuvent être placées dans chacun de ces fichiers + de configuration. Les modifications dans les fichiers de configuration + principaux ne sont prises en compte par httpd que lorsque le serveur + est démarré ou redémarré.

    + +

    Le serveur lit aussi un fichier contenant les types de document mime ; + ce fichier est défini par la directive TypesConfig, + et se nomme mime.types par défaut.

    +
    top
    +
    +

    Syntaxe des fichiers de configuration

    + + +

    Les fichiers de configuration de httpd contiennent une directive + par ligne. + On peut utiliser l'anti-slash "\" comme dernier caractère d'une ligne + pour indiquer que la directive continue à la ligne suivante. + Il ne doit y avoir aucun caractère ni espace entre l'anti-slash et + la fin de la ligne.

    + +

    Les arguments des directives sont séparés les uns des autres par + des espaces. Si un argument contient des espaces, il doit être + entouré de guillemets.

    + +

    Les directives dans les fichiers de configuration ne sont pas + sensibles à la casse, mais leurs arguments le sont souvent. Les lignes + qui débutent par le caractère "#" sont interprétées comme des + commentaires, et sont ignorées. Les commentaires ne doivent + pas apparaître sur la même ligne qu'une directive + de configuration. Les espaces précédant une directive + sont ignorés ; vous pouvez par conséquent indenter les directives + afin d'améliorer la lisibilité. Les lignes vides sont + aussi ignorées.

    + +

    Les valeurs des variables d'environnement ou des variables définies via + la directive Define peuvent être + utilisées dans le fichier de configuration en utilisant la syntaxe + ${VAR}. Si "VAR" est le nom d'une variable valable, la valeur + de la variable est alors substituée à la chaîne ${VAR}, et le + processus de lecture du fichier de configuration continue comme si la + chaîne correspondant à la valeur de la variable s'y était trouvée + littéralement. Les variables définies via la directive Define l'emportent sur les autres variables + d'environnement de l'interpréteur de commande. Si la variable "VAR" n'est + pas trouvée, la chaîne ${VAR} n'est pas modifiée, et un + avertissement est enregistré dans le journal. Le caractère ":" est interdit + dans les noms de variables afin d'éviter tout conflit avec la syntaxe de la + directive RewriteMap.

    + +

    Seules les variables d'environnement de l'interpréteur de commande + définies avant le démarrage du serveur peuvent être utilisées en extension. + Les variables d'environnement définies dans le fichier de configuration + lui-même, par exemple avec SetEnv, + prennent effet trop tard pour pouvoir être utilisées en extension au sein + du fichier de configuration.

    + +

    La longueur maximale d'une ligne dans un fichier de configuration + normal, après substitution des variables et fusion des lignes + interrompues, est approximativement de 16 Mo. Dans les fichiers .htaccess, la longueur + maximale est de 8190 caractères.

    + +

    Vous pouvez vérifier l'absence d'erreurs de syntaxe dans vos fichiers + de configuration sans démarrer le serveur à l'aide de la commande + apachectl configtest ou de l'option de ligne de commande + -t.

    + +

    Vous pouvez utiliser la définition -DDUMP_CONFIG de + mod_info pour afficher la configuration avec tous + les fichiers inclus et les variables d'environnement évaluées, tous + les commentaires et les sections <IfDefine> et <IfModule> non actives ayant + été supprimés. Cependant, la sortie ne reflète + pas les fusions ou écrasements pouvant intervenir en cas de + définitions multiples de directives.

    +
    top
    +
    +

    Modules

    + + + + +

    httpd est un serveur modulaire. Ceci implique que seules les + fonctionnalités les plus courantes sont incluses dans le serveur de base. + Les fonctionnalités étendues sont fournies à l'aide de modules qui peuvent être chargés dans httpd. + Par défaut, un jeu de modules de base est inclus dans le + serveur à la compilation. Si le serveur est compilé de façon à utiliser + les modules chargés dynamiquement, + alors les modules peuvent être compilés séparément et chargés à + n'importe quel moment à l'aide de la directive + LoadModule. + Dans le cas contraire, httpd doit être recompilé pour ajouter ou + supprimer des modules. + Les directives de configuration peuvent être incluses de manière + conditionnelle selon la présence ou l'absence d'un module particulier + en les plaçant dans un bloc <IfModule>.

    + +

    Pour voir quels modules ont été compilés avec le serveur, + vous pouvez utiliser l'option de ligne de commande -l.

    +
    top
    +
    +

    Portée des directives

    + + + + +

    Les directives placées dans les fichiers de configuration principaux + s'appliquent au serveur dans son ensemble. Si vous souhaitez modifier la + configuration d'une partie du serveur seulement, vous pouvez limiter la + portée de vos directives en les plaçant dans une section + <Directory>, <DirectoryMatch>, <Files>, <FilesMatch>, <Location> ou <LocationMatch>. + Ces sections limitent le champ d'application des directives qu'elles + contiennent à des URls ou des portions du système de fichiers particulières. + Elles peuvent aussi être imbriquées, ce qui permet + une configuration très fine.

    + +

    httpd peut servir simultanément de nombreux sites web au travers des Serveurs Virtuels. La portée des directives peut ainsi + être limitée en les plaçant dans des sections <VirtualHost>, afin qu'elles ne s'appliquent + qu'aux requêtes pour un site web particulier.

    + +

    Bien que la plupart des directives puissent être placées dans + chacune de ces sections, certaines d'entre elles n'ont aucun sens + dans certains contextes. + Par exemple, les directives qui contrôlent la création des processus + n'ont de sens que dans le contexte du serveur global. Pour déterminer + quelles directives peuvent être placées dans quelles sections, consultez + le Contexte de la + directive. Pour plus d'informations, nous fournissons des détails dans + Comment fonctionnent les sections Directory, + Location et Files.

    +
    top
    +
    +

    Fichiers .htaccess

    + + + + +

    httpd permet la gestion décentralisée de la configuration + à l'aide de fichiers spéciaux placés dans l'arborescence du site web. + Ces fichiers spéciaux se nomment en général .htaccess, + mais tout autre nom peut être spécifié à l'aide de la directive + AccessFileName. + Les directives placées dans les fichiers .htaccess + s'appliquent au répertoire dans lequel vous avez placé le fichier, + ainsi qu'à tous ses sous-répertoires. + La syntaxe des fichiers .htaccess est la même que celle + des fichiers de configuration principaux. Comme les fichiers + .htaccess sont lus à chaque requête, les modifications de + ces fichiers prennent effet immédiatement.

    + +

    Pour déterminer quelles directives peuvent être placées + dans les fichiers .htaccess, consultez le + Contexte de la + directive. L'administrateur du serveur peut contrôler quelles + directives peuvent être placées dans les fichiers + .htaccess en définissant la directive + AllowOverride + dans les fichiers de configuration principaux.

    + +

    Pour plus d'informations sur les fichiers .htaccess, + se référer au tutoriel .htaccess.

    +
    +
    +

    Langues Disponibles:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/configuring.html.ja.utf8 b/docs/manual/configuring.html.ja.utf8 new file mode 100644 index 0000000..92af22f --- /dev/null +++ b/docs/manual/configuring.html.ja.utf8 @@ -0,0 +1,205 @@ + + + + + +設定ファイル - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    設定ファイル

    +
    +

    翻訳済ã¿è¨€èªž:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + +

    ã“ã®æ–‡æ›¸ã§ã¯ã€Apache HTTP サーãƒã‚’設定ã™ã‚‹ã®ã«ä½¿ç”¨ã™ã‚‹ãƒ•ァイルã«ã¤ã„㦠+記述ã—ã¦ã„ã¾ã™ã€‚

    +
    + +
    top
    +
    +

    メインã®è¨­å®šãƒ•ァイル

    + + + +

    Apache 㯠ディレクティブ を設定ファイルã«å¹³æ–‡ã§æ›¸ãã“ã¨ã«ã‚ˆã‚Šè¨­å®šã—ã¾ã™ã€‚ + メインã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã¯æ™®é€šã¯ httpd.conf ã¨ã„ã†åå‰ã§ã™ã€‚ + ã“ã®ãƒ•ァイルã®ä½ç½®ã¯ã‚³ãƒ³ãƒ‘イル時ã«è¨­å®šã•れã¾ã™ãŒã€ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã® + -f フラグã«ã‚ˆã‚Šä¸Šæ›¸ãã§ãã¾ã™ã€‚ + ã¾ãŸã€ä»–ã®è¨­å®šãƒ•ァイルを Include + ディレクティブã«ã‚ˆã£ã¦è¿½åŠ ã§ãã€ãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰ã‚’使用ã—ã¦å¤šæ•°ã® + 設定ファイルを追加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã©ã‚“ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã‚‚ã€ã“れらã®è¨­å®šãƒ•ァイルã©ã‚Œã«ã§ã‚‚入れるã“ã¨ãŒã§ãã¾ã™ã€‚ + Apache ã¯èµ·å‹•時ã‹å†èµ·å‹•時ã®ã¿ãƒ¡ã‚¤ãƒ³è¨­å®šãƒ•ァイルã®å¤‰æ›´ã‚’èªè­˜ã—ã¾ã™ã€‚

    + +

    サーãƒã¯ MIME + ドキュメントタイプをå«ã‚“ã§ã„るファイルも読ã¿è¾¼ã¿ã¾ã™ã€‚ファイルå㯠+ TypesConfig + ã§è¨­å®šã•れã€ãƒ‡ãƒ•ォルトã§ã¯ mime.types + ã«ãªã£ã¦ã„ã¾ã™ã€‚

    +
    top
    +
    +

    è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã®æ§‹æ–‡

    + + +

    Apache ã®è¨­å®šãƒ•ァイル㯠1 行㫠1 ã¤ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã‹ã‚‰ãªã‚Šã¾ã™ã€‚ + ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ "\" ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ãŒæ¬¡ã®è¡Œã«ç¶™ç¶šã—ã¦ã„ã‚‹ã“ã¨ã‚’ + 示ã™ãŸã‚ã«è¡Œã®æœ€å¾Œã®æ–‡å­—ã¨ã—ã¦ä½¿ã‚れã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 + è¡Œã®æœ€å¾Œã¨ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã®é–“ã«ä»–ã®æ–‡å­—や空白ãŒã‚ã£ã¦ã¯ã„ã‘ã¾ã›ã‚“。 +

    + +

    設定ファイルã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã¯å¤§æ–‡å­—å°æ–‡å­—を区別ã—ã¾ã›ã‚“ãŒã€ + 引数ã«ã¯ã—ã°ã—ã°åŒºåˆ¥ã™ã‚‹ã‚‚ã®ãŒã‚りã¾ã™ã€‚ãƒãƒƒã‚·ãƒ¥æ–‡å­— "#" + ã§å§‹ã¾ã‚‹è¡Œã¯ã‚³ãƒ¡ãƒ³ãƒˆã¨è¦‹ãªã•れã¦ç„¡è¦–ã•れã¾ã™ã€‚ + 設定ディレクティブã¨åŒä¸€è¡Œã®æœ«å°¾ã«ã‚³ãƒ¡ãƒ³ãƒˆãŒå«ã¾ã‚Œã¦ã„ã¦ã¯ã„ã‘ã¾ã›ã‚“。ディレクティブã®å‰ã®ç©ºè¡Œã¨ç©ºç™½ã¯ç„¡è¦–ã•れã¾ã™ã®ã§ã€ + ã‚ã‹ã‚Šã‚„ã™ãã™ã‚‹ãŸã‚ã«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–をインデントã—ã¦ã‚‚æ§‹ã„ã¾ã›ã‚“。 +

    + +

    è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã®æ§‹æ–‡ã‚¨ãƒ©ãƒ¼ã¯ã€ + apachectl configtest + ã‹ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‚ªãƒ—ション + -t を使ã£ã¦èª¿ã¹ã‚‰ã‚Œã¾ã™ã€‚

    +
    top
    +
    +

    モジュール

    + + + + +

    Apache ã¯ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«åŒ–ã•れãŸã‚µãƒ¼ãƒã§ã™ã€‚ + コアサーãƒã«ã¯æœ€ã‚‚åŸºæœ¬çš„ãªæ©Ÿèƒ½ã ã‘ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚拡張機能㯠+ Apache ã«ãƒ­ãƒ¼ãƒ‰ã•れるモジュールã¨ã—ã¦åˆ©ç”¨å¯èƒ½ã§ã™ã€‚デフォルトã§ã¯ã€ã‚³ãƒ³ãƒ‘イル時ã«ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã® + Base セット (基本セット) ㌠+ サーãƒã«å«ã¾ã‚Œã¾ã™ã€‚サーãƒãŒå‹•的ロードモジュールを使ã†ã‚ˆã†ã«ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã‚‹å ´åˆã¯ã€ + モジュールを別ã«ã‚³ãƒ³ãƒ‘イルã—ã¦ã€ã„ã¤ã§ã‚‚ + LoadModule + ディレクティブを使ã£ã¦è¿½åŠ ã§ãã¾ã™ã€‚ + ãã†ã§ãªã„å ´åˆã¯ã€ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®è¿½åŠ ã‚„å‰Šé™¤ã‚’ã™ã‚‹ãŸã‚ã«ã¯ Apache + ã‚’å†ã‚³ãƒ³ãƒ‘イルã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚設定ディレクティブ㯠<IfModule> + ブロックã«å…¥ã‚Œã‚‹ã“ã¨ã§ç‰¹å®šã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãŒå­˜åœ¨ã™ã‚‹ã¨ãã ã‘ + 設定ファイルã«å«ã¾ã‚Œã‚‹ã‚ˆã†ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    コマンドラインオプション -l を使ã£ã¦ç¾æ™‚点㧠+ ã©ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãŒã‚µãƒ¼ãƒã«ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã‚‹ã‹ã‚’知るã“ã¨ãŒã§ãã¾ã™ã€‚

    +
    top
    +
    +

    ディレクティブã®é©ç”¨ç¯„囲

    + + + + +

    メイン設定ファイルã«ã‚るディレクティブã¯ã‚µãƒ¼ãƒå…¨ä½“ã«é©ç”¨ã•れã¾ã™ã€‚ + サーãƒã®ä¸€éƒ¨åˆ†ã®è¨­å®šã ã‘を変更ã—ãŸã„å ´åˆã¯ <Directory>, <DirectoryMatch>, <Files>, <FilesMatch>, <Location>, <LocationMatch> + セクションã®ä¸­ã«ç½®ãã“ã¨ã§é©ç”¨ç¯„囲を決ã‚られã¾ã™ã€‚ + ã“れらã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã¯ãã®ä¸­ã«ã‚るディレクティブã®é©ç”¨ç¯„囲を + 特定ã®ãƒ•ァイルシステムã®ä½ç½®ã‚„ URL ã«é™å®šã—ã¾ã™ã€‚ + éžå¸¸ã«ç´°ç²’度ã®è¨­å®šã‚’å¯èƒ½ã«ã™ã‚‹ãŸã‚ã«ã€ + セクションを入れå­ã«ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚

    + +

    Apache ã¯åŒæ™‚ã«å¤šãã®é•ã†ã‚¦ã‚§ãƒ–サイトを扱ã†èƒ½åŠ›ãŒã‚りã¾ã™ã€‚ + ã“れ㯠ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆ ã¨å‘¼ã°ã‚Œã¦ã„ã¾ã™ã€‚ + 特定ã®ã‚¦ã‚§ãƒ–サイトã«ã®ã¿é©ç”¨ã•れるよã†ã«ã™ã‚‹ãŸã‚ã«ã€ + ディレクティブ㯠+ <VirtualHost> + セクションã®ä¸­ã«ç½®ãã“ã¨ã§ã‚‚é©ç”¨ç¯„囲を変ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    ã»ã¨ã‚“ã©ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã¯ã©ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ã§ã‚‚書ã‘ã¾ã™ãŒã€ + 中ã«ã¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«ã‚ˆã£ã¦ã¯æ„味をãªã•ãªã„ã‚‚ã®ã‚‚ã‚りã¾ã™ã€‚ + 例ãˆã°ã€ãƒ—ロセスã®ä½œæˆã‚’制御ã—ã¦ã„るディレクティブã¯ãƒ¡ã‚¤ãƒ³ã‚µãƒ¼ãƒã® + コンテキストã«ã®ã¿æ›¸ãã“ã¨ãŒã§ãã¾ã™ã€‚ + ã©ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã‚’ã©ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«æ›¸ãã“ã¨ãŒã§ãã‚‹ã‹ã‚’知るãŸã‚ã«ã¯ + ディレクティブ㮠コンテキスト を調ã¹ã¦ãã ã•ã„。詳ã—ã„æƒ…å ±ã¯ã€ + Directory, Location, Files + セクションã®å‹•作法ã«ã‚りã¾ã™ã€‚

    +
    top
    +
    +

    .htaccess ファイル

    + + + + +

    Apache ã§ã¯ã‚¦ã‚§ãƒ–ツリーã®ä¸­ã«ç½®ã‹ã‚ŒãŸç‰¹åˆ¥ãªãƒ•ァイルを使ã£ã¦ + éžä¸­å¤®é›†æ¨©çš„ãªè¨­å®šç®¡ç†ã‚’ã§ãã¾ã™ã€‚ãã®ç‰¹åˆ¥ãªãƒ•ã‚¡ã‚¤ãƒ«ã¯æ™®é€šã¯ + .htaccess ã¨ã„ã†åå‰ã§ã€ + AccessFileName + ディレクティブã§ã©ã‚“ãªåå‰ã«ã§ã‚‚指定ã§ãã¾ã™ã€‚ + .htaccess + ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã‹ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã¯ãƒ•ァイルを置ã„㟠+ ディレクトリã¨ãã®å…¨ã¦ã®ã‚µãƒ–ディレクトリã«é©ç”¨ã•れã¾ã™ã€‚ + .htaccess ファイルã¯ã€ãƒ¡ã‚¤ãƒ³ã®è¨­å®šãƒ•ァイルã¨åŒã˜ + 構文を使ã„ã¾ã™ã€‚ + .htaccess + ファイルã¯ã™ã¹ã¦ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã§èª­ã¿è¾¼ã¾ã‚Œã‚‹ãŸã‚〠+ 変更ã¯ã™ãã«å映ã•れã¾ã™ã€‚

    + +

    ã©ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–㌠.htaccess + ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã‘ã‚‹ã‹ã‚’調ã¹ã‚‹ã«ã¯ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ + を調ã¹ã¦ãã ã•ã„。サーãƒç®¡ç†è€…ã¯ã•らã«ãƒ¡ã‚¤ãƒ³è¨­å®šãƒ•ァイル㮠+ AllowOverride + を設定ã™ã‚‹ã“ã¨ã§ã©ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã‚’ .htaccess + ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã‘るよã†ã«ã™ã‚‹ã‹ã‚’制御ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    .htaccess ファイルã«é–¢ã™ã‚‹è©³ã—ã„æƒ…報㯠+ .htaccess ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ« + ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

    +
    +
    +

    翻訳済ã¿è¨€èªž:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/configuring.html.ko.euc-kr b/docs/manual/configuring.html.ko.euc-kr new file mode 100644 index 0000000..5d64b42 --- /dev/null +++ b/docs/manual/configuring.html.ko.euc-kr @@ -0,0 +1,182 @@ + + + + + +¼³Á¤ÆÄÀÏ - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    ¼³Á¤ÆÄÀÏ

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + +

    ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡ À¥¼­¹ö¸¦ ¼³Á¤ÇÏ´Â ÆÄÀϵéÀ» ¼³¸íÇÑ´Ù.

    +
    + +
    top
    +
    +

    ÁÖ¼³Á¤ÆÄÀÏ

    + + + +

    ÀÏ¹Ý ¹®¼­ ÆÄÀÏÀÎ ¼³Á¤ÆÄÀÏ¿¡ Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ¾ÆÆÄÄ¡¸¦ + ¼³Á¤ÇÑ´Ù. ÁÖ¼³Á¤ÆÄÀÏÀ» º¸Åë httpd.conf¶ó°í + ºÎ¸¥´Ù. ÀÌ ÆÄÀÏÀÇ À§Ä¡´Â ÄÄÆÄÀϽà Á¤ÇØÁö³ª, -f + ¸í·ÉÇà ¿É¼ÇÀ¸·Î ÁöÁ¤ÇØÁÙ ¼ö ÀÖ´Ù. ¶Ç ´Ù¸¥ ¼³Á¤ÆÄÀÏÀ» Include Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© Æ÷ÇÔÇÒ + ¼ö ÀÖ°í, ¿ÍÀϵåÄ«µå¸¦ »ç¿ëÇÏ¿© ¸¹Àº ¼³Á¤ÆÄÀÏÀ» Æ÷ÇÔÇÒ ¼öµµ + ÀÖ´Ù. ÀÌ °æ¿ì Áö½Ã¾î¸¦ ¾î¶² ¼³Á¤ÆÄÀÏ¿¡³ª »ç¿ëÇØµµ µÈ´Ù. + ÁÖ¼³Á¤ÆÄÀÏÀ» ¼öÁ¤ÇÏ¸é ¾ÆÆÄÄ¡¸¦ ½ÃÀÛÇϰųª Àç½ÃÀÛÇÑ ÀÌÈÄ¿¡ + ¹Ý¿µµÈ´Ù.

    + +

    ¼­¹ö´Â mime ¹®¼­Å¸ÀÔÀ» ´ãÀº ÆÄÀϵµ Àд´Ù. ÆÄÀϸíÀº + TypesConfig Áö½Ã¾î·Î + ¼³Á¤Çϰí, ±âº»°ªÀº mime.typesÀÌ´Ù.

    +
    top
    +
    +

    ¼³Á¤ÆÄÀÏ ¹®¹ý

    + + +

    ¾ÆÆÄÄ¡ ¼³Á¤ÆÄÀÏÀº ÇÑÁÙ¿¡ ÇÑ Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù. ÁÙ ¸¶Áö¸· + ¹®ÀÚ°¡ ¹é½½·¡½¬ "\"À̸é Áö½Ã¾î°¡ ´ÙÀ½ ÁÙ¿¡¼­ °è¼ÓµÊÀ» ¶æÇÑ´Ù. + ÀÌ °æ¿ì ¹é½½·¡½¬ µÚ¿¡ ¾î¶² ¹®ÀÚ³ª °ø¹éµµ ³ª¿À¸é ¾ÈµÈ´Ù.

    + +

    ¼³Á¤ÆÄÀÏÀÇ Áö½Ã¾î´Â ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö ¾ÊÁö¸¸, Áö½Ã¾îÀÇ + ¾Æ±Ô¸ÕÆ®´Â ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏ´Â °æ¿ì°¡ ÀÖ´Ù. ÇØ½¬¹®ÀÚ "#"·Î + ½ÃÀÛÇÏ´Â ÁÙÀº ÁÖ¼®À¸·Î ¹«½ÃÇÑ´Ù. ÁÖ¼®À» ¼³Á¤ Áö½Ã¾î¿Í °°Àº + ÁÙ¿¡ »ç¿ëÇÒ ¼ö ¾ø´Ù. ºóÁÙ°ú Áö½Ã¾î ¾Õ¿¡ ³ª¿À´Â + °ø¹éÀº ¹«½ÃÇϹǷÎ, °£°áÇÏ°Ô º¸À̵µ·Ï Áö½Ã¾î¸¦ ÁÙµéÀÓÇÒ(indent) + ¼ö ÀÖ´Ù.

    + +

    apachectl configtest³ª -t ¸í·ÉÇà + ¿É¼ÇÀ» »ç¿ëÇÏ¿© ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÏÁö ¾Ê°íµµ ¼³Á¤ÆÄÀÏÀÇ ¹®¹ý + ¿À·ù¸¦ °Ë»çÇÒ ¼ö ÀÖ´Ù.

    +
    top
    +
    +

    ¸ðµâ

    + + + + +

    ¾ÆÆÄÄ¡´Â ¸ðµâÈ­µÈ ¼­¹ö´Ù. ÀÌ´Â ¸Å¿ì ±âº»ÀûÀÎ ±â´É¸¸ÀÌ + ¼­¹ö Çٽɿ¡ Æ÷ÇÔµÇÀÖÀ½À» ¶æÇÑ´Ù. ¾ÆÆÄÄ¡´Â ¸ðµâÀ» Àоîµé¿©¼­ ±â´ÉÀ» + È®ÀåÇÑ´Ù. ±âº»ÀûÀ¸·Î ÄÄÆÄÀÏÇÏ¸é ¼­¹ö¿¡ base ¸ðµâµéÀÌ Æ÷ÇԵȴÙ. + ¼­¹ö¸¦ µ¿ÀûÀ¸·Î ÀоîµéÀÌ´Â ¸ðµâÀ» + »ç¿ëÇÒ ¼ö ÀÖ°Ô ÄÄÆÄÀÏÇÏ¿´´Ù¸é ¸ðµâÀ» µû·Î ÄÄÆÄÀÏÇÏ¿© ¾Æ¹«¶§³ª + LoadModule Áö½Ã¾î·Î + Ãß°¡ÇÒ ¼ö ÀÖ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ¸ðµâÀ» Ãß°¡Çϰųª »©±âÀ§ÇØ + ¾ÆÆÄÄ¡¸¦ ´Ù½Ã ÄÄÆÄÀÏÇØ¾ß ÇÑ´Ù. ¼³Á¤ Áö½Ã¾î¸¦ IfModule ºí·ÏÀ¸·Î °¨½Î¼­ ƯÁ¤ + ¸ðµâÀÌ ÀÖ´Â °æ¿ì¿¡¸¸ ¼±ÅÃÀûÀ¸·Î ó¸®ÇÒ ¼ö ÀÖ´Ù.

    + +

    ÇöÀç ¼­¹ö¿¡ ¾î¶² ¸ðµâÀÌ ÄÄÆÄÀϵÇÀÖ´ÂÁö º¸·Á¸é -l + ¸í·ÉÇà ¿É¼ÇÀ» »ç¿ëÇÑ´Ù.

    +
    top
    +
    +

    Áö½Ã¾î Àû¿ë¹üÀ§

    + + + + +

    ÁÖ¼³Á¤ÆÄÀÏ¿¡ ÀÖ´Â Áö½Ã¾î´Â ¼­¹ö Àüü¿¡ Àû¿ëµÈ´Ù. Áö½Ã¾î°¡ + ¼­¹öÀÇ ÀϺο¡¸¸ Àû¿ëµÇ°Ô ÇÏ·Á¸é Áö½Ã¾î¸¦ <Directory>, <DirectoryMatch>, <Files>, <FilesMatch>, <Location>, <LocationMatch> ¼½¼Ç ¾È¿¡ µÎ¾î¾ßÇÑ´Ù. + ÀÌ ¼½¼ÇµéÀº ±×µéÀÌ °¨½Î´Â Áö½Ã¾îÀÇ Àû¿ë¹üÀ§¸¦ ÆÄÀϽýºÅÛÀ̳ª + URLÀÇ Æ¯Á¤ À§Ä¡·Î ÇÑÁ¤ÇÑ´Ù. ¶Ç, ¼­·Î °ãÃļ­ »ç¿ëÇÒ ¼ö Àֱ⶧¹®¿¡ + ¸Å¿ì ¼¼¹ÐÇÑ ¼³Á¤ÀÌ °¡´ÉÇÏ´Ù.

    + +

    ¾ÆÆÄÄ¡´Â ¿©·¯ ´Ù¸¥ À¥»çÀÌÆ®¸¦ µ¿½Ã¿¡ ¼­ºñ½ºÇÏ´Â + ´É·ÂÀÌ ÀÖ´Ù. À̸¦ °¡»óÈ£½ºÆ®¶ó°í ÇÑ´Ù. + Áö½Ã¾î¸¦ + <VirtualHost> + ¼½¼Ç ¾È¿¡ µÎ¾î ƯÁ¤ À¥»çÀÌÆ®¿¡¸¸ Áö½Ã¾î¸¦ Àû¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    Áö½Ã¾î´Â ´ëºÎºÐ ¾î¶² ¼½¼Ç¿¡ ³ª¿Íµµ µÇÁö¸¸, ¾î¶² Áö½Ã¾î´Â + ƯÁ¤ Àå¼Ò¿¡¼­ Àǹ̰¡ ¾ø´Ù. ¿¹¸¦ µé¾î ÇÁ·Î¼¼½º »ý¼ºÀ» Á¶ÀýÇÏ´Â + Áö½Ã¾î´Â ÁÖ¼­¹ö¼³Á¤ Àå¼Ò¿¡¼­¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Áö½Ã¾î°¡ + ¾î¶² ¼½¼Ç¿¡ À§Ä¡ÇÒ ¼ö ÀÖ´ÂÁö ¾Ë·Á¸é Áö½Ã¾îÀÇ »ç¿ëÀå¼Ò¸¦ È®ÀÎÇ϶ó. + ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â ¾î¶»°Ô Directory, + Location, Files ¼½¼ÇÀÌ µ¿ÀÛÇϳª¸¦ Âü°íÇ϶ó.

    +
    top
    +
    +

    .htaccess ÆÄÀÏ

    + + + + +

    ¾ÆÆÄÄ¡´Â Ưº°ÇÑ ÆÄÀÏÀ» »ç¿ëÇÏ¿© ¼³Á¤À» + ³ª´²¼­(ºÐ±ÇÀûÀ¸·Î) °ü¸®ÇÒ ¼ö ÀÖ´Ù. ÀÌ Æ¯º°ÇÑ ÆÄÀÏÀ» º¸Åë + .htaccess¶ó°í ºÎ¸£Áö¸¸, À̸§Àº AccessFileName Áö½Ã¾î·Î + ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. .htaccess ÆÄÀÏ¿¡ ÀÖ´Â Áö½Ã¾î´Â + ÆÄÀÏÀÌ ÀÖ´Â µð·ºÅ丮¿Í ¸ðµç ÇÏÀ§µð·ºÅ丮¿¡ Àû¿ëµÈ´Ù. + .htaccess ÆÄÀÏÀº ÁÖ¼³Á¤ÆÄÀϰú °°Àº ¹®¹ýÀ» + µû¸¥´Ù. .htaccess ÆÄÀÏÀº ¸Å ¿äû¶§¸¶´Ù Àб⶧¹®¿¡ + ÆÄÀÏÀ» ¼öÁ¤Çϸé Áï½Ã È¿°ú¸¦ º¼ ¼ö ÀÖ´Ù.

    + +

    ¾î¶² Áö½Ã¾î¸¦ .htaccess ÆÄÀÏ¿¡ »ç¿ëÇÒ ¼ö + ÀÖ´ÂÁö ¾Ë·Á¸é Áö½Ã¾îÀÇ »ç¿ëÀå¼Ò¸¦ + È®ÀÎÇ϶ó. ¼­¹ö °ü¸®ÀÚ´Â ÁÖ¼³Á¤ÆÄÀÏÀÇ AllowOverride Áö½Ã¾î·Î + .htaccess ÆÄÀÏ¿¡ ¾î¶² Áö½Ã¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö + Á¶ÀýÇÒ ¼ö ÀÖ´Ù.

    + +

    .htaccess ÆÄÀÏ¿¡ ´ëÇÑ ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â + .htaccess ÅõÅ丮¾óÀ» + Âü°íÇ϶ó.

    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/configuring.html.tr.utf8 b/docs/manual/configuring.html.tr.utf8 new file mode 100644 index 0000000..cea2502 --- /dev/null +++ b/docs/manual/configuring.html.tr.utf8 @@ -0,0 +1,233 @@ + + + + + +Yapılandırma Dosyaları - Apache HTTP Sunucusu Sürüm 2.4 + + + + + + + +
    <-
    +

    Yapılandırma Dosyaları

    +
    +

    Mevcut Diller:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Bu belgede Apache HTTP Sunucusunu yapılandırmakta kullanılan dosyalar +açıklanmıştır.

    +
    + +
    top
    +
    +

    Ana Yapılandırma Dosyaları

    + + + +

    Apache HTTP Sunucusu düz metin yapılandırma dosyalarına yönergeler yerleştirilerek yapılandırılır. + Ana yapılandırma dosyasının ismi normalde httpd.conf’tur. + Bu dosyanın yeri derleme sırasında belirlenir, ancak çalıştırma + sırasında -f komut satırı seçeneği ile başka bir yer + belirtilebilir. Ayrıca, Include + yönergesi kullanılarak başka yapılandırma dosyaları da eklenebilir + ve bu dosyaların isimleri belirtilirken dosya ismi şablonları + kullanılabilir. Bu dosyaların içine de ana yapılandırma dosyasında + olduğu gibi her türlü yönerge yerleştirilebilir. Ana yapılandırma + dosyalarındaki değişiklikler httpd tarafından sadece başlatma veya + yeniden başlatma sırasında etkin kılınır.

    + +

    Sunucu ayrıca MIME belge türlerini içeren bir dosya daha okur; + dosya ismi öntanımlı olarak mime.types olup TypesConfig yönergesi ile başka bir dosya + belirtilebilir.

    +
    top
    +
    +

    Yapılandırma Dosyalarının Sözdizimi

    + + +

    httpd yapılandırma dosyalarının her satırında sadece bir yönerge + bulunur ve bir yönergenin birden fazla satıra yayılması daha iyi + olacaksa satır katlanabilir; devamı bir alt satırda olan her satırın + son karakteri “\†(tersbölü) olmalı, satırsonu karakteri ile bu tersbölü + karakteri arasında başka karakter bulunmamalıdır.

    + +

    Yönergelerdeki değiştirgeler boşluklarla ayrılır. Eğer bir değiştirge + kendi içinde boşluklar içeriyorsa tırnak içine alınır.

    + +

    Yapılandırma dosyalarındaki yönergelerin isimleri harf büyüklüğüne + duyarlı olduÄŸu halde argümanları genellikle harf büyüklüğüne duyarlı + deÄŸildir. Diyez (“#â€) karakteri ile baÅŸlayan satırlar açıklama olarak + ele alınır ve yok sayılırlar. Yapılandırma yönergesi içeren satırlara + açıklama yerleÅŸtirilemez. Yönerge isminden önce yer alan boÅŸluklar + yoksayılır; bu özellik, okunabilirliÄŸi saÄŸlamak için yönergelerin + girintilenebilmesi olanağını verir. Ayrıca, boÅŸ satırlar da + yoksayılır.

    + + +

    Define ile veya kabuğun ortam + değişkenleri ile tanımlanmış değişkenlerin değerleri, yapılandırma + dosyasının satırlarında ${VAR} sözdizimi ile kullanılabilir. + "VAR" geçerli bir değişkenin adı olduğu takdirde, bu değişkenin değeri + yapılandırma dosyasının bu noktasında yerine konacak ve orada zaten + değişken yerine değeri varmış gibi işlem kaldığı yerden devam edecektir. + Define ile tanımlanmış değişkenler + kabuğun ortam değişkenlerinden önceliklidir. "VAR" diye bir değişken yoksa + ${VAR} içindeki karakterler değişmeden kalır ve günlüğe bir + uyarı çıktılanır. RewriteMap + sözdizimi ile olası bir karışıklığı önlemek için, değişken isimleri iki + nokta imini (":") içeremez.

    + +

    Kabuğun ortam değişkenlerinin, sadece, sunucu başlatılmadan önce + tanımlanmış değerleri kullanılabilir. Yapılandırma dosyasının kendisinde + tanımlanmış ortam değişkenleri (örneğin, + SetEnv ile), yapılandırma + dosyasındaki işlemlerde çok daha sonra yer alır.

    + +

    Yapılandırma dosyasındaki bir satırın uzunluğu, değişken ikamesi + yapıldıkta, devam satırları eklenditen sonra en fazla 16MiB olabilir. .htaccess dosyalarında azami uzunluk + 8190 karakterdir.

    + +

    Sunucuyu başlatmadan önce apachectl configtest ile veya + -t komut satırı seçeneği ile yapılandırma dosyalarınızı + sözdizimi hatalarına karşı sınayabilirsiniz.

    + +

    Eşleşmeyen <IfDefine> + ve <IfModule> bölümleri + kaldırılmış, tüm açıklamalar, çözümlenmiş ortam değişkenleri ve içerilmiş + tüm dosyalar dahil yapılandırmanın bir dökümünü almak için + mod_info'nun -DDUMP_CONFIG seçeneğini + kullanabilirsiniz. Ancak, çıktı yinelenen yönergeler için katıştırılan veya + geçersiz kılınanları yansıtmayacaktır.

    +
    top
    +
    +

    Modüller

    + + + + +

    httpd modüler yapıda bir sunucudur. Bu, çekirdek sunucunun sadece en + temel işlevselliği içermesi demektir. Ek özellikler, httpd’ye modüller halinde yüklenebilir. Öntanımlı olarak, derleme + sırasında sunucunun temel bir + modül kümesi içermesi sağlanır. Eğer sunucu devingen + yüklenen modülleri kullanmak üzere yapılandırılarak derlenirse modüller + ayrı olarak derlenip gerektiği zaman + LoadModule yönergesi kullanılarak yüklenebilir. Aksi takdirde, + ek modülleri yükleyebilmek veya kaldırabilmek için httpd’nin yeniden + derlenmesi gerekir. Yapılandırma yönergeleri belli bir modülün varlığına + dayalı olarak bir <IfModule> + bloku içine alınmak suretiyle sunucuya koşullu olarak eklenebilir. Ancak, + <IfModule> yönergeleri + gerekli değildir, önemli bir modülün yokluğu gibi durumlarda + maskelenebilir.

    + +

    Sunucunun içinde derlenmiş modüllerin listesini görmek için + -l komut satırı seçeneğini kullanabilirsiniz. Ayrıca, + -M komut satırı seçeneği ile hangi modüllerin devingen olarak + yüklendiğini görebilirsiniz.

    +
    top
    +
    +

    Yönergelerin Etki Alanı

    + + + + +

    Ana yapılandırma dosyasına yerleştirilen yönergeler sunucunun tamamına + uygulanır. Yapılandırmanızı sunucunun belli bir parçası için değiştirmek + isterseniz yönergelerinizi <Directory>, <DirectoryMatch>, <Files>, <FilesMatch>, <Location> ve <LocationMatch> bölümleri içine yerleştirerek etki + alanlarını değiştirebilirsiniz. Bu bölümler yönergelerin etkilediği + alanları dosya sistemininin belli yerleri veya belli URL’lerle sınırlar. + Yerine göre daha hassas ayarlamalar yapmak için bu bölgeler iç içe de + kullanılabilir.

    + +

    httpd, çok sayıda farklı siteyi aynı anda sunabilecek yetenektedir. + Buna Sanal Konaklık adı verilir. Yönergelerin etki + alanları ayrıca <VirtualHost> + bölümleri içine konarak da değiştirilebilir. Böylece belli bir siteye gelen + isteklere farklı bir uygulama yapılabilir.

    + +

    Yönergelerin çoğu bu bölümlere yerleştirilebilirse de bazı yönergelerin + bazı bağlamlarda bir etkisi olmaz. Örneğin, süreç oluşturmayı denetleyen + yönergeler sadece ana sunucu bağlamına yerleştirilebilir. Hangi yönergenin + hangi bağlama yerleştirilebileceğini bulmak için yönergenin bağlamına bakınız. Bu konuda daha + ayrıntılı bilgi edinmek için: Directory, Location ve + Files Bölümleri Nasıl Çalışır.

    +
    top
    +
    +

    .htaccess Dosyaları

    + + + + +

    httpd yapılandırma sorumluluğunu dağıtmak için site ağaçları içine özel + dosyalar yerleştirilmesine izin verir. Bu özel dosyalar normalde + .htaccess dosyaları olmakla birlikte AccessFileName yönergesi kullanılarak rasgele bir isim + belirtilebilir. .htaccess dosyalarına yerleştirilen yönergeler + sadece dosyanın bulunduğu dizine ve alt dizinlerine uygulanır. + .htaccess dosyalarında da ana yapılandırma dosyalarında geçerli + sözdizimi kullanılır. .htaccess dosyaları her istek gelişinde + yeniden okunduğundan bu dosyalarda yapılan değişiklikler hemen etkisini + gösterir.

    + +

    .htaccess dosyalarına hangi yönergelerin + yerleştirilebileceğini bulmak için yönerge bağlamına bakınız. + Sunucunun yöneticisi .htaccess dosyalarına hangi yönergelerin + yerleştirilebileceğini ana yapılandırma dosyalarında + AllowOverride yönergesini kullanarak + belirleyebilir.

    + +

    .htaccess dosyaları hakkında daha ayrıntılı bilgi edinmek + için .htaccess öğreticisine bakabilirsiniz.

    +
    +
    +

    Mevcut Diller:  de  | + en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Yorumlar

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/content-negotiation.html b/docs/manual/content-negotiation.html new file mode 100644 index 0000000..38e61c2 --- /dev/null +++ b/docs/manual/content-negotiation.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: content-negotiation.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: content-negotiation.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: content-negotiation.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: content-negotiation.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: content-negotiation.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/content-negotiation.html.en b/docs/manual/content-negotiation.html.en new file mode 100644 index 0000000..253d6b2 --- /dev/null +++ b/docs/manual/content-negotiation.html.en @@ -0,0 +1,711 @@ + + + + + +Content Negotiation - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Content Negotiation

    +
    +

    Available Languages:  en  | + fr  | + ja  | + ko  | + tr 

    +
    + + +

    Apache HTTPD supports content negotiation as described in + the HTTP/1.1 specification. It can choose the best + representation of a resource based on the browser-supplied + preferences for media type, languages, character set and + encoding. It also implements a couple of features to give + more intelligent handling of requests from browsers that send + incomplete negotiation information.

    + +

    Content negotiation is provided by the + mod_negotiation module, which is compiled in + by default.

    +
    + +
    top
    +
    +

    About Content Negotiation

    + +

    A resource may be available in several different + representations. For example, it might be available in + different languages or different media types, or a combination. + One way of selecting the most appropriate choice is to give the + user an index page, and let them select. However it is often + possible for the server to choose automatically. This works + because browsers can send, as part of each request, information + about what representations they prefer. For example, a browser + could indicate that it would like to see information in French, + if possible, else English will do. Browsers indicate their + preferences by headers in the request. To request only French + representations, the browser would send

    + +

    Accept-Language: fr

    + +

    Note that this preference will only be applied when there is + a choice of representations and they vary by language.

    + +

    As an example of a more complex request, this browser has + been configured to accept French and English, but prefer + French, and to accept various media types, preferring HTML over + plain text or other text types, and preferring GIF or JPEG over + other media types, but also allowing any other media type as a + last resort:

    + +

    + Accept-Language: fr; q=1.0, en; q=0.5
    + Accept: text/html; q=1.0, text/*; q=0.8, image/gif; q=0.6, image/jpeg; q=0.6, image/*; q=0.5, */*; q=0.1 +

    + +

    httpd supports 'server driven' content negotiation, as + defined in the HTTP/1.1 specification. It fully supports the + Accept, Accept-Language, + Accept-Charset and Accept-Encoding + request headers. httpd also supports 'transparent' + content negotiation, which is an experimental negotiation + protocol defined in RFC 2295 and RFC 2296. It does not offer + support for 'feature negotiation' as defined in these RFCs.

    + +

    A resource is a conceptual entity + identified by a URI (RFC 2396). An HTTP server like Apache HTTP Server + provides access to representations of the + resource(s) within its namespace, with each representation in + the form of a sequence of bytes with a defined media type, + character set, encoding, etc. Each resource may be associated + with zero, one, or more than one representation at any given + time. If multiple representations are available, the resource + is referred to as negotiable and each of its + representations is termed a variant. The ways + in which the variants for a negotiable resource vary are called + the dimensions of negotiation.

    +
    top
    +
    +

    Negotiation in httpd

    + +

    In order to negotiate a resource, the server needs to be + given information about each of the variants. This is done in + one of two ways:

    + +
      +
    • Using a type map (i.e., a *.var + file) which names the files containing the variants + explicitly, or
    • + +
    • Using a 'MultiViews' search, where the server does an + implicit filename pattern match and chooses from among the + results.
    • +
    + +

    Using a type-map file

    + +

    A type map is a document which is associated with the handler + named type-map (or, for backwards-compatibility with + older httpd configurations, the MIME-type + application/x-type-map). Note that to use this + feature, you must have a handler set in the configuration that + defines a file suffix as type-map; this is best done + with

    + +
    AddHandler type-map .var
    + + +

    in the server configuration file.

    + +

    Type map files should have the same name as the resource + which they are describing, followed by the extension + .var. In the examples shown below, the resource is + named foo, so the type map file is named + foo.var.

    + +

    This file should have an entry for each available + variant; these entries consist of contiguous HTTP-format header + lines. Entries for different variants are separated by blank + lines. Blank lines are illegal within an entry. It is + conventional to begin a map file with an entry for the combined + entity as a whole (although this is not required, and if + present will be ignored). An example map file is shown below.

    + +

    URIs in this file are relative to the location of the type map + file. Usually, these files will be located in the same directory as + the type map file, but this is not required. You may provide + absolute or relative URIs for any file located on the same server as + the map file.

    + +

    + URI: foo
    +
    + URI: foo.en.html
    + Content-type: text/html
    + Content-language: en
    +
    + URI: foo.fr.de.html
    + Content-type: text/html;charset=iso-8859-2
    + Content-language: fr, de
    +

    + +

    Note also that a typemap file will take precedence over the + filename's extension, even when Multiviews is on. If the + variants have different source qualities, that may be indicated + by the "qs" parameter to the media type, as in this picture + (available as JPEG, GIF, or ASCII-art):

    + +

    + URI: foo
    +
    + URI: foo.jpeg
    + Content-type: image/jpeg; qs=0.8
    +
    + URI: foo.gif
    + Content-type: image/gif; qs=0.5
    +
    + URI: foo.txt
    + Content-type: text/plain; qs=0.01
    +

    + +

    qs values can vary in the range 0.000 to 1.000. Note that + any variant with a qs value of 0.000 will never be chosen. + Variants with no 'qs' parameter value are given a qs factor of + 1.0. The qs parameter indicates the relative 'quality' of this + variant compared to the other available variants, independent + of the client's capabilities. For example, a JPEG file is + usually of higher source quality than an ASCII file if it is + attempting to represent a photograph. However, if the resource + being represented is an original ASCII art, then an ASCII + representation would have a higher source quality than a JPEG + representation. A qs value is therefore specific to a given + variant depending on the nature of the resource it + represents.

    + +

    The full list of headers recognized is available in the mod_negotiation + typemap documentation.

    + + +

    Multiviews

    + +

    MultiViews is a per-directory option, meaning it + can be set with an Options + directive within a <Directory>, <Location> or <Files> section in + httpd.conf, or (if AllowOverride is properly set) in + .htaccess files. Note that Options All + does not set MultiViews; you have to ask for it by + name.

    + +

    The effect of MultiViews is as follows: if the + server receives a request for /some/dir/foo, if + /some/dir has MultiViews enabled, and + /some/dir/foo does not exist, then the + server reads the directory looking for files named foo.*, and + effectively fakes up a type map which names all those files, + assigning them the same media types and content-encodings it + would have if the client had asked for one of them by name. It + then chooses the best match to the client's requirements.

    + +

    MultiViews may also apply to searches for the file + named by the DirectoryIndex directive, if the + server is trying to index a directory. If the configuration files + specify

    +
    DirectoryIndex index
    + +

    then the server will arbitrate between index.html + and index.html3 if both are present. If neither + are present, and index.cgi is there, the server + will run it.

    + +

    If one of the files found when reading the directory does not + have an extension recognized by mod_mime to designate + its Charset, Content-Type, Language, or Encoding, then the result + depends on the setting of the MultiViewsMatch directive. This + directive determines whether handlers, filters, and other + extension types can participate in MultiViews negotiation.

    + +
    top
    +
    +

    The Negotiation Methods

    + +

    After httpd has obtained a list of the variants for a given + resource, either from a type-map file or from the filenames in + the directory, it invokes one of two methods to decide on the + 'best' variant to return, if any. It is not necessary to know + any of the details of how negotiation actually takes place in + order to use httpd's content negotiation features. However the + rest of this document explains the methods used for those + interested.

    + +

    There are two negotiation methods:

    + +
      +
    1. Server driven negotiation with the httpd + algorithm is used in the normal case. The httpd + algorithm is explained in more detail below. When this + algorithm is used, httpd can sometimes 'fiddle' the quality + factor of a particular dimension to achieve a better result. + The ways httpd can fiddle quality factors is explained in + more detail below.
    2. + +
    3. Transparent content negotiation is used + when the browser specifically requests this through the + mechanism defined in RFC 2295. This negotiation method gives + the browser full control over deciding on the 'best' variant, + the result is therefore dependent on the specific algorithms + used by the browser. As part of the transparent negotiation + process, the browser can ask httpd to run the 'remote + variant selection algorithm' defined in RFC 2296.
    4. +
    + +

    Dimensions of Negotiation

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DimensionNotes
    Media TypeBrowser indicates preferences with the Accept + header field. Each item can have an associated quality factor. + Variant description can also have a quality factor (the "qs" + parameter).
    LanguageBrowser indicates preferences with the + Accept-Language header field. Each item can have + a quality factor. Variants can be associated with none, one or + more than one language.
    EncodingBrowser indicates preference with the + Accept-Encoding header field. Each item can have + a quality factor.
    CharsetBrowser indicates preference with the + Accept-Charset header field. Each item can have a + quality factor. Variants can indicate a charset as a parameter + of the media type.
    + + +

    httpd Negotiation Algorithm

    + +

    httpd can use the following algorithm to select the 'best' + variant (if any) to return to the browser. This algorithm is + not further configurable. It operates as follows:

    + +
      +
    1. First, for each dimension of the negotiation, check the + appropriate Accept* header field and assign a + quality to each variant. If the Accept* header for + any dimension implies that this variant is not acceptable, + eliminate it. If no variants remain, go to step 4.
    2. + +
    3. + Select the 'best' variant by a process of elimination. Each + of the following tests is applied in order. Any variants + not selected at each test are eliminated. After each test, + if only one variant remains, select it as the best match + and proceed to step 3. If more than one variant remains, + move on to the next test. + +
        +
      1. Multiply the quality factor from the Accept + header with the quality-of-source factor for this variants + media type, and select the variants with the highest + value.
      2. + +
      3. Select the variants with the highest language quality + factor.
      4. + +
      5. Select the variants with the best language match, + using either the order of languages in the + Accept-Language header (if present), or else + the order of languages in the LanguagePriority + directive (if present).
      6. + +
      7. Select the variants with the highest 'level' media + parameter (used to give the version of text/html media + types).
      8. + +
      9. Select variants with the best charset media + parameters, as given on the Accept-Charset + header line. Charset ISO-8859-1 is acceptable unless + explicitly excluded. Variants with a text/* + media type but not explicitly associated with a particular + charset are assumed to be in ISO-8859-1.
      10. + +
      11. Select those variants which have associated charset + media parameters that are not ISO-8859-1. If + there are no such variants, select all variants + instead.
      12. + +
      13. Select the variants with the best encoding. If there + are variants with an encoding that is acceptable to the + user-agent, select only these variants. Otherwise if + there is a mix of encoded and non-encoded variants, + select only the unencoded variants. If either all + variants are encoded or all variants are not encoded, + select all variants.
      14. + +
      15. Select the variants with the smallest content + length.
      16. + +
      17. Select the first variant of those remaining. This + will be either the first listed in the type-map file, or + when variants are read from the directory, the one whose + file name comes first when sorted using ASCII code + order.
      18. +
      +
    4. + +
    5. The algorithm has now selected one 'best' variant, so + return it as the response. The HTTP response header + Vary is set to indicate the dimensions of + negotiation (browsers and caches can use this information when + caching the resource). End.
    6. + +
    7. To get here means no variant was selected (because none + are acceptable to the browser). Return a 406 status (meaning + "No acceptable representation") with a response body + consisting of an HTML document listing the available + variants. Also set the HTTP Vary header to + indicate the dimensions of variance.
    8. +
    + +
    top
    +
    +

    Fiddling with Quality + Values

    + +

    httpd sometimes changes the quality values from what would + be expected by a strict interpretation of the httpd + negotiation algorithm above. This is to get a better result + from the algorithm for browsers which do not send full or + accurate information. Some of the most popular browsers send + Accept header information which would otherwise + result in the selection of the wrong variant in many cases. If a + browser sends full and correct information these fiddles will not + be applied.

    + +

    Media Types and Wildcards

    + +

    The Accept: request header indicates preferences + for media types. It can also include 'wildcard' media types, such + as "image/*" or "*/*" where the * matches any string. So a request + including:

    + +

    Accept: image/*, */*

    + +

    would indicate that any type starting "image/" is acceptable, + as is any other type. + Some browsers routinely send wildcards in addition to explicit + types they can handle. For example:

    + +

    + Accept: text/html, text/plain, image/gif, image/jpeg, */* +

    +

    The intention of this is to indicate that the explicitly listed + types are preferred, but if a different representation is + available, that is ok too. Using explicit quality values, + what the browser really wants is something like:

    +

    + Accept: text/html, text/plain, image/gif, image/jpeg, */*; q=0.01 +

    +

    The explicit types have no quality factor, so they default to a + preference of 1.0 (the highest). The wildcard */* is given a + low preference of 0.01, so other types will only be returned if + no variant matches an explicitly listed type.

    + +

    If the Accept: header contains no q + factors at all, httpd sets the q value of "*/*", if present, to + 0.01 to emulate the desired behavior. It also sets the q value of + wildcards of the format "type/*" to 0.02 (so these are preferred + over matches against "*/*". If any media type on the + Accept: header contains a q factor, these special + values are not applied, so requests from browsers which + send the explicit information to start with work as expected.

    + + +

    Language Negotiation Exceptions

    + +

    New in httpd 2.0, some exceptions have been added to the + negotiation algorithm to allow graceful fallback when language + negotiation fails to find a match.

    + +

    When a client requests a page on your server, but the server + cannot find a single page that matches the + Accept-language sent by + the browser, the server will return either a "No Acceptable + Variant" or "Multiple Choices" response to the client. To avoid + these error messages, it is possible to configure httpd to ignore + the Accept-language in these cases and provide a + document that does not explicitly match the client's request. The + ForceLanguagePriority + directive can be used to override one or both of these error + messages and substitute the servers judgement in the form of the + LanguagePriority + directive.

    + +

    The server will also attempt to match language-subsets when no + other match can be found. For example, if a client requests + documents with the language en-GB for British + English, the server is not normally allowed by the HTTP/1.1 + standard to match that against a document that is marked as simply + en. (Note that it is almost surely a configuration + error to include en-GB and not en in the + Accept-Language header, since it is very unlikely + that a reader understands British English, but doesn't understand + English in general. Unfortunately, many current clients have + default configurations that resemble this.) However, if no other + language match is possible and the server is about to return a "No + Acceptable Variants" error or fallback to the LanguagePriority, the server + will ignore the subset specification and match en-GB + against en documents. Implicitly, httpd will add + the parent language to the client's acceptable language list with + a very low quality value. But note that if the client requests + "en-GB; q=0.9, fr; q=0.8", and the server has documents + designated "en" and "fr", then the "fr" document will be returned. + This is necessary to maintain compliance with the HTTP/1.1 + specification and to work effectively with properly configured + clients.

    + +

    In order to support advanced techniques (such as cookies or + special URL-paths) to determine the user's preferred language, + since httpd 2.0.47 mod_negotiation recognizes + the environment variable + prefer-language. If it exists and contains an + appropriate language tag, mod_negotiation will + try to select a matching variant. If there's no such variant, + the normal negotiation process applies.

    + +

    Example

    SetEnvIf Cookie "language=(.+)" prefer-language=$1
    +Header append Vary cookie
    +
    + +
    top
    +
    +

    Extensions to Transparent Content +Negotiation

    + +

    httpd extends the transparent content negotiation protocol (RFC +2295) as follows. A new {encoding ..} element is used in +variant lists to label variants which are available with a specific +content-encoding only. The implementation of the RVSA/1.0 algorithm +(RFC 2296) is extended to recognize encoded variants in the list, and +to use them as candidate variants whenever their encodings are +acceptable according to the Accept-Encoding request +header. The RVSA/1.0 implementation does not round computed quality +factors to 5 decimal places before choosing the best variant.

    +
    top
    +
    +

    Note on hyperlinks and naming conventions

    + +

    If you are using language negotiation you can choose between + different naming conventions, because files can have more than + one extension, and the order of the extensions is normally + irrelevant (see the mod_mime documentation + for details).

    + +

    A typical file has a MIME-type extension (e.g., + html), maybe an encoding extension (e.g., + gz), and of course a language extension + (e.g., en) when we have different + language variants of this file.

    + +

    Examples:

    + +
      +
    • foo.en.html
    • + +
    • foo.html.en
    • + +
    • foo.en.html.gz
    • +
    + +

    Here some more examples of filenames together with valid and + invalid hyperlinks:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FilenameValid hyperlinkInvalid hyperlink
    foo.html.enfoo
    + foo.html
    -
    foo.en.htmlfoofoo.html
    foo.html.en.gzfoo
    + foo.html
    foo.gz
    + foo.html.gz
    foo.en.html.gzfoofoo.html
    + foo.html.gz
    + foo.gz
    foo.gz.html.enfoo
    + foo.gz
    + foo.gz.html
    foo.html
    foo.html.gz.enfoo
    + foo.html
    + foo.html.gz
    foo.gz
    + +

    Looking at the table above, you will notice that it is always + possible to use the name without any extensions in a hyperlink + (e.g., foo). The advantage is that you + can hide the actual type of a document rsp. file and can change + it later, e.g., from html to + shtml or cgi without changing any + hyperlink references.

    + +

    If you want to continue to use a MIME-type in your + hyperlinks (e.g. foo.html) the language + extension (including an encoding extension if there is one) + must be on the right hand side of the MIME-type extension + (e.g., foo.html.en).

    +
    top
    +
    +

    Note on Caching

    + +

    When a cache stores a representation, it associates it with + the request URL. The next time that URL is requested, the cache + can use the stored representation. But, if the resource is + negotiable at the server, this might result in only the first + requested variant being cached and subsequent cache hits might + return the wrong response. To prevent this, httpd normally + marks all responses that are returned after content negotiation + as non-cacheable by HTTP/1.0 clients. httpd also supports the + HTTP/1.1 protocol features to allow caching of negotiated + responses.

    + +

    For requests which come from a HTTP/1.0 compliant client + (either a browser or a cache), the directive CacheNegotiatedDocs can be + used to allow caching of responses which were subject to + negotiation. This directive can be given in the server config or + virtual host, and takes no arguments. It has no effect on requests + from HTTP/1.1 clients.

    + +

    For HTTP/1.1 clients, httpd sends a Vary HTTP + response header to indicate the negotiation dimensions for the + response. Caches can use this information to determine whether a + subsequent request can be served from the local copy. To + encourage a cache to use the local copy regardless of the + negotiation dimensions, set the force-no-vary environment variable.

    + +
    +
    +

    Available Languages:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/content-negotiation.html.fr.utf8 b/docs/manual/content-negotiation.html.fr.utf8 new file mode 100644 index 0000000..8526e73 --- /dev/null +++ b/docs/manual/content-negotiation.html.fr.utf8 @@ -0,0 +1,743 @@ + + + + + +Négociation de contenu - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Négociation de contenu

    +
    +

    Langues Disponibles:  en  | + fr  | + ja  | + ko  | + tr 

    +
    + + +

    Apache HTTPD prend en charge la négociation de + contenu telle qu'elle est décrite + dans la spécification HTTP/1.1. Il peut choisir la meilleure représentation + d'une ressource en fonction des préférences du navigateur pour ce qui + concerne le type de media, les langages, le jeu de caractères et son + encodage. Il implémente aussi quelques fonctionnalités pour traiter de + manière plus intelligente les requêtes en provenance de navigateurs qui + envoient des informations de négociation incomplètes.

    + +

    La négociation de contenu est assurée par le module + mod_negotiation qui est compilé par défaut + dans le serveur.

    +
    + +
    top
    +
    +

    À propos de la négociation de contenu

    + +

    Une ressource peut être disponible selon différentes représentations. + Par exemple, elle peut être disponible en différents langages ou pour + différents types de média, ou une combinaison des deux. + Pour faire le meilleur choix, on peut fournir à l'utilisateur une page + d'index, et le laisser choisir. Cependant, le serveur peut souvent faire + ce choix automatiquement. Cela est possible car les navigateurs peuvent + envoyer des informations sur les + représentations qu'ils préfèrent à l'intérieur de chaque requête. + Par exemple, un navigateur peut indiquer + qu'il préfère voir les informations en français, mais qu'en cas + d'impossibilité l'anglais peut convenir. Les navigateurs indiquent leurs + préférences à l'aide d'en-têtes dans la requête. Pour ne demander que des + représentations en français, le navigateur peut utiliser l'en-tête :

    + +

    Accept-Language: fr

    + +

    Notez qu'il ne sera tenu compte de cette préférence que s'il existe un + choix de représentations et que ces dernières varient en fonction + du langage.

    + +

    À titre d'exemple d'une requête plus complexe, ce navigateur a été + configuré pour accepter le français et l'anglais, avec une préférence pour + le français, et accepter différents types de média, avec une préférence + pour HTML par rapport à au texte plat (« plain text Â») ou autres types de fichiers texte, et + avec une préférence pour GIF ou JPEG par rapport à tout autre type de + média, mais autorisant tout autre type de média en dernier ressort :

    + +

    + Accept-Language: fr; q=1.0, en; q=0.5
    + Accept: text/html; q=1.0, text/*; q=0.8, image/gif; q=0.6, image/jpeg; q=0.6, image/*; q=0.5, */*; q=0.1 +

    + +

    httpd prend en charge la négociation de contenu « server driven Â» (telle qu'elle + est définie dans la spécification HTTP/1.1), où c'est le serveur qui + décide quelle est la meilleure représentation à renvoyer pour la ressource + demandée. Il prend entièrement en charge les en-têtes de requête + Accept, Accept-Language, + Accept-Charset et Accept-Encoding. + httpd prend aussi en charge la négociation de contenu transparente, qui est un + protocole de négociation expérimental défini dans les RFC 2295 et 2296. + Il ne prend pas en charge la négociation de fonctionnalité (feature negotiation) + telle qu'elle est définie dans ces RFCs.

    + +

    Une ressource est une entité conceptuelle identifiée + par un URI (RFC 2396). Un serveur HTTP comme le serveur HTTP Apache + propose l'accès à des + représentations de la ressource à l'intérieur de son + espace de nommage, chaque représentation étant composée d'une séquence + d'octets avec la définition d'un type de media, d'un jeu de caractères, + d'un encodage, etc. À un instant donné, chaque ressource peut être + associée avec zéro, une ou plusieurs représentations. Si plusieurs + représentations sont disponibles, la ressource est qualifiée de + négociable et chacune de ses représentations se nomme + variante. Les différences entre les + variantes disponibles d'une ressource négociable constituent les + dimensions de la négociation.

    +
    top
    +
    +

    La négociation avec httpd

    + +

    Pour négocier une ressource, on doit fournir au serveur des + informations à propos de chacune des variantes. Il y a deux manières + d'y parvenir :

    + +
      +
    • Utiliser une liste de correspondances de type (« type-map Â») (c'est à dire + un fichier *.var) qui nomme explicitement les fichiers + contenant les variantes, ou
    • + +
    • Utiliser une recherche « multivues Â», où le serveur effectue une + recherche de correspondance sur un motif de nom de fichier implicite et + fait son choix parmi les différents résultats.
    • +
    + +

    Utilisation d'un fichier de + correspondances de types (type-map)

    + +

    Une liste de correspondances de types est un document associé au + gestionnaire type-map (ou, dans un souci de compatibilité + ascendante avec des configurations de httpd plus anciennes, le + type MIME + application/x-type-map). Notez que pour utiliser cette + fonctionnalité, vous devez, dans le fichier de configuration, définir un + gestionnaire qui associe un suffixe de fichier à une type-map, + ce qui se fait simplement en ajoutant

    + +
    AddHandler type-map .var
    + + +

    dans le fichier de configuration du serveur.

    + +

    Les fichiers de correspondances de types doivent posséder le même nom que + la ressource qu'ils décrivent, avec pour extension + .var. Dans l'exemple ci-dessous, la ressource a pour + nom foo, et le fichier de correspondances se nomme donc + foo.var.

    + +

    Ce fichier doit comporter une entrée pour chaque variante + disponible ; chaque entrée consiste en une ligne contiguë d'en-têtes au + format HTTP. Les entrées sont séparées par des lignes vides. Les lignes + vides à l'intérieur d'une entrée sont interdites. Par convention, le + fichier de correspondances de types débute par une entrée concernant l'entité + considérée dans son ensemble (bien que ce ne soit pas obligatoire, et + ignoré si présent). Un exemple de fichier de + correspondances de types est fourni + ci-dessous.

    + +

    Les URIs de ce fichier sont relatifs à la localisation du fichier + de correspondances de types. En général, ces fichiers se trouveront dans le + même répertoire que le fichier de correspondances de types, mais ce + n'est pas obligatoire. Vous pouvez utiliser des URIs absolus ou + relatifs pour tout fichier situé sur le même serveur que le fichier + de correspondances.

    + +

    + URI: foo
    +
    + URI: foo.en.html
    + Content-type: text/html
    + Content-language: en
    +
    + URI: foo.fr.de.html
    + Content-type: text/html;charset=iso-8859-2
    + Content-language: fr, de
    +

    + +

    Notez aussi qu'un fichier de correspondances de types prend le pas sur + les extensions de noms de fichiers, même si les Multivues sont activées. + Si les variantes sont de qualités différentes, on doit l'indiquer + à l'aide du paramètre « qs Â» à la suite du type de média, comme pour cette + image + (disponible aux formats JPEG, GIF, ou ASCII-art) :

    + +

    + URI: foo
    +
    + URI: foo.jpeg
    + Content-type: image/jpeg; qs=0.8
    +
    + URI: foo.gif
    + Content-type: image/gif; qs=0.5
    +
    + URI: foo.txt
    + Content-type: text/plain; qs=0.01
    +

    + +

    Les valeurs de qs peuvent varier de 0.000 à 1.000. Notez que toute + variante possédant une valeur de qs de 0.000 ne sera jamais choisie. + Les variantes qui n'ont pas de paramètre qs défini se voient attribuer + une valeur de 1.0. Le paramètre qs indique la qualité relative de la + variante comparée à celle des autres variantes disponibles, sans tenir + compte des capacités du client. Par exemple, un fichier JPEG possède + en général une qualité supérieure à celle d'un fichier ASCII s'il + représente une photographie. Cependant, si la ressource représentée est + un ASCII art original, la représentation ASCII sera de meilleure qualité + que la représentation JPEG. Ainsi une valeur de qs est associée à une + variante en fonction de la nature de la ressource qu'elle représente.

    + +

    La liste complète des en-têtes reconnus est disponible dans la + documentation sur les correspondances de types du + module mod_negotiation.

    + + +

    Multivues (option Multiviews)

    + +

    MultiViews est une option qui s'applique à un répertoire, + ce qui signifie qu'elle peut être activée à l'aide d'une directive + Options à l'intérieur d'une section + <Directory>, <Location> ou <Files> dans + httpd.conf, ou (si AllowOverride est correctement positionnée) dans + des fichiers + .htaccess. Notez que Options All + n'active pas MultiViews ; vous devez activer cette option en + la nommant explicitement.

    + +

    L'effet de MultiViews est le suivant : si le serveur reçoit + une requête pour /tel/répertoire/foo, si + MultiViews est activée pour + /tel/répertoire et si + /tel/répertoire/foo n'existe pas, le serveur parcourt + le répertoire à la recherche de fichiers nommés foo.*, et simule + littéralement une correspondance de types (type map) qui liste tous ces + fichiers, en leur associant les mêmes types de média et encodages de + contenu qu'ils auraient eu si le client avait demandé l'accès à l'un + d'entre eux par son nom. Il choisit ensuite ce qui correspond le mieux + aux besoins du client.

    + +

    MultiViews peut aussi s'appliquer à la recherche du fichier + nommé par la directive DirectoryIndex, si le serveur tente d'indexer + un répertoire. Si les fichiers de configuration spécifient

    +
    DirectoryIndex index
    + +

    le serveur va choisir entre index.html + et index.html3 si les deux fichiers sont présents. Si aucun + n'est présent, alors qu’index.cgi existe, + le serveur l'exécutera.

    + +

    Si, parcequ'elle n'est pas reconnue par mod_mime, + l'extension d'un des fichiers du répertoire ne permet pas de + déterminer son jeu de caractères, son type de contenu, son langage, ou son + encodage, + le résultat dépendra de la définition de la directive MultiViewsMatch. Cette directive détermine + si les gestionnaires (handlers), les filtres et autres types d'extensions + peuvent participer à la négociation MultiVues.

    + +
    top
    +
    +

    Les méthodes de négociation

    + +

    Une fois obtenue la liste des variantes pour une ressource donnée, + httpd dispose de deux méthodes pour choisir la meilleure variante à + renvoyer, s'il y a lieu, soit à partir d'un fichier de + correspondances de types, soit en se basant sur les noms de fichier du + répertoire. Il n'est pas nécessaire de connaître en détails comment la + négociation fonctionne réellement pour pouvoir utiliser les fonctionnalités + de négociation de contenu de httpd. La suite de ce document explique + cependant les méthodes utilisées pour ceux ou celles qui sont + intéressés(ées).

    + +

    Il existe deux méthodes de négociation :

    + +
      +
    1. La négociation effectuée par le serveur selon l'algorithme + de httpd est utilisée par défaut. L'algorithme de + httpd est + expliqué plus en détails ci-dessous. Quand cet algorithme est utilisé, + httpd peut parfois « bricoler Â» le facteur de qualité (qs) d'une dimension + particulière afin d'obtenir un meilleur résultat. + La manière dont httpd peut modifier les facteurs de qualité est + expliquée plus en détails ci-dessous.
    2. + +
    3. La négociation de contenu transparente est utilisée + quand le navigateur le demande explicitement selon le mécanisme défini + dans la RFC 2295. Cette méthode de négociation donne au navigateur le + contrôle total du choix de la meilleure variante ; le résultat dépend + cependant de la spécificité des algorithmes utilisés par le navigateur. + Au cours du processus de négociation transparente, le navigateur peut + demander à httpd d'exécuter l'« algorithme de sélection de variante à + distance Â» défini dans la RFC 2296.
    4. +
    + +

    Les dimensions de la négociation

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DimensionNotes
    Type de médiaLe navigateur affiche ses préférences à l'aide du champ d'en-tête + Accept. Chaque type de média peut se voir associé un facteur de + qualité. La description de la variante peut aussi avoir un facteur de + qualité (le paramètre « qs Â»).
    LangageLe navigateur affiche ses préférences à l'aide du champ d'en-tête + Accept-Language. Chaque langue peut se voir associé un facteur de + qualité. Les variantes peuvent être associées avec zéro, un ou + plusieurs langages.
    EncodageLe navigateur affiche ses préférences à l'aide du champ d'en-tête + Accept-Encoding. Chaque encodage peut se voir associé un facteur de + qualité.
    Jeu de caractèresLe navigateur affiche ses préférences à l'aide du champ d'en-tête + Accept-Charset. Chaque jeu de caractère peut se voir associé un facteur de + qualité. Les variantes peuvent préciser un jeu de caractères comme + paramètre du type de média.
    + + +

    L'algorithme de négociation de +httpd

    + +

    httpd peut utiliser l'algorithme suivant pour choisir la « meilleure Â» + variante (s'il y en a une) à renvoyer au navigateur. Cet algorithme n'est pas + configurable. Il fonctionne comme suit :

    + +
      +
    1. En premier lieu, pour chaque dimension de la négociation, consulter + le champ d'en-tête Accept* approprié et assigner une qualité à + chaque variante. Si l'en-tête Accept* pour toute dimension + implique que la variante n'est pas acceptable, éliminer cette dernière. + S'il ne reste plus de variante, aller à l'étape 4.
    2. + +
    3. + Choisir la « meilleure Â» variante par élimination. Chacun des tests + suivants est effectué dans cet ordre. Toute variante non sélectionnée + à l'issue d'un test est éliminée. Après chaque test, s'il reste une + seule variante, choisir cette dernière comme celle qui correspond le + mieux puis aller à l'étape 3. S'il reste plusieurs variantes, passer + au test suivant. + +
        +
      1. Multiplier le facteur de qualité de l'en-tête + Accept par le facteur de qualité « qs Â» pour le type de + média de ces variantes, et choisir la variante qui possède la valeur + la plus importante.
      2. + +
      3. Sélectionner les variantes qui possèdent le facteur de qualité + de langage le plus haut.
      4. + +
      5. Sélectionner les variantes dont le langage correspond le mieux, + en se basant sur l'ordre des langages de l'en-tête + Accept-Language (s'il existe), ou de la directive + LanguagePriority (si elle existe).
      6. + +
      7. Sélectionner les variantes possédant le paramètre de média + « level Â» le plus élevé (utilisé pour préciser la version des types de + média text/html).
      8. + +
      9. Sélectionner les variantes possédant le paramètre de média + « charset Â» (jeu de caractères) qui correspond le mieux, en se basant + sur la ligne d'en-tête Accept-Charset . Le jeu de + caractères ISO-8859-1 est acceptable sauf s'il est explicitement + exclus. Les variantes avec un type de média text/* + mais non explicitement associées avec un jeu de caractères + particulier sont supposées être en ISO-8859-1.
      10. + +
      11. Sélectionner les variantes dont le paramètre de média « charset Â» + associé n'est pas ISO-8859-1. S'il n'en existe pas, + sélectionner toutes les variantes.
      12. + +
      13. Sélectionner les variantes avec le meilleur encodage. S'il existe + des variantes avec un encodage acceptable pour le client, + sélectionner celles-ci. Sinon, s'il existe des variantes encodées et + des variantes non encodées, ne sélectionner que les variantes non + encodées. Si toutes les variantes sont encodées ou si aucune + ne l'est, sélectionner toutes les variantes.
      14. + +
      15. Sélectionner les variantes dont le contenu a la longueur + la plus courte.
      16. + +
      17. Sélectionner la première des variantes restantes. Il s'agira + soit de la première variante listée dans le fichier de + correspondances de types, soit, quand les variantes sont lues depuis + le répertoire, la première par ordre alphabétique quand elles sont + triées selon le code ASCII.
      18. +
      +
    4. + +
    5. L'algorithme a maintenant sélectionné une variante considérée comme + la « meilleure Â», il la renvoie donc au client en guise de réponse. + L'en-tête HTTP Vary de la réponse est renseigné de façon à + indiquer les dimensions de la négociation (les navigateurs et les caches + peuvent utiliser cette information lors de la mise en cache de la + ressource). Travail terminé.
    6. + +
    7. Le passage par cette étape signifie qu'aucune variante n'a été + sélectionnée (parce qu'aucune n'est acceptable pour le navigateur). + Envoyer une réponse avec un code de statut 406 (qui signifie « Aucune + représentation acceptable Â») et un corps comportant un document HTML qui + affiche les variantes disponibles. Renseigner aussi l'en-tête HTTP + Vary de façon à indiquer les dimensions de la variante.
    8. +
    + +
    top
    +
    +

    Ajustement des valeurs de qualité

    + +

    Parfois httpd modifie les valeurs de qualité par rapport à celles qui + découleraient d'une stricte interprétation de l'algorithme de négociation + de httpd ci-dessus, cela afin d’améliorer les résultats de l'algorithme pour + les navigateurs qui envoient des informations incomplètes ou inappropriées. + Certains des navigateurs les plus populaires envoient des informations dans + l'en-tête Accept qui, sans ce traitement, provoqueraient la + sélection d'une variante inappropriée dans de nombreux cas. Quand un + navigateur envoie des informations complètes et correctes ces ajustements + ne sont pas effectués.

    + +

    Types de média et caractères génériques

    + +

    L'en-tête de requête Accept: indique les types de média + souhaités. Il peut aussi contenir des types de média avec caractères + génériques, comme « image/* Â» ou « */* Â» où * correspond à n'importe quelle + chaîne de caractères. Ainsi une requête contenant :

    + +

    Accept: image/*, */*

    + +

    indiquerait que tout type de média est acceptable, avec une préférence + pour les types commençant par « image/ Â». + Certains navigateurs ajoutent par défaut des types de média avec caractères + génériques aux types explicitement nommés qu'ils peuvent gérer. + Par exemple :

    + +

    + Accept: text/html, text/plain, image/gif, image/jpeg, */* +

    +

    Cela indique que les types explicitement listés sont préférés, mais + qu'une représentation avec un type différent de ces derniers conviendra + aussi. Les valeurs de qualités explicites, + afin de préciser ce que veut vraiment le navigateur, s'utilisent + comme suit :

    +

    + Accept: text/html, text/plain, image/gif, image/jpeg, */*; q=0.01 +

    +

    Les types explicites n'ont pas de facteur de qualité, la valeur par + défaut de leur préférence est donc de 1.0 (la plus haute). Le type avec + caractères génériques */* se voit attribuer une préférence basse de 0.01, + si bien que les types autres que ceux explicitement listés ne seront + renvoyés + que s'il n'existe pas de variante correspondant à un type explicitement + listé.

    + +

    Si l'en-tête Accept: ne contient pas de + facteur de qualité, httpd positionne la valeur de qualité de + « */* Â», si présent, à 0.01 pour simuler l'effet désiré. Il positionne aussi + la valeur de qualité des types avec caractères génériques au format + « type/* Â» à 0.02 (ils sont donc préférés à ceux correspondant à « */* Â»). Si + un type de média dans l'en-tête Accept: contient un facteur de + qualité, ces valeurs spéciales ne seront pas appliquées, de façon + à ce que les requêtes de navigateurs qui envoient les informations + explicites à prendre en compte fonctionnent comme souhaité.

    + + +

    Exceptions dans la négociation du +langage

    + +

    A partir de la version 2.0 de httpd, certaines exceptions ont été + ajoutées à l'algorithme de négociation afin de ménager une issue de secours + quand la négociation ne trouve aucun langage correspondant.

    + +

    Quand un client demande une page sur votre serveur, si ce dernier ne + parvient pas à trouver une page dont la langue correspond à l'en-tête + Accept-language envoyé par le navigateur, il enverra au client + une réponse « Aucune variante acceptable Â» ou « Plusieurs choix possibles Â». + Pour éviter ces + messages d'erreur, il est possible de configurer httpd de façon que, + dans ces cas, il ignore l'en-tête Accept-language et fournisse + tout de même un document, même s'il ne correspond pas exactement à la + demande explicite du client. La directive ForceLanguagePriority + peut être utilisée pour éviter ces messages d'erreur et leur substituer une + page dont le langage sera déterminé en fonction du contenu de la directive + LanguagePriority.

    + +

    Le serveur va aussi essayer d'étendre sa recherche de correspondance aux + sous-ensembles de langages quand aucune correspondance exacte ne peut être + trouvée. Par exemple, si un client demande des documents possédant le + langage en-GB, c'est à dire anglais britannique, le standard + HTTP/1.1 n'autorise normalement pas le serveur à faire correspondre cette + demande à un document dont le langage est simplement en + (notez qu'inclure en-GB et non en dans l'en-tête + Accept-Language constitue une quasi-erreur de configuration, + car il est très peu probable qu'un lecteur qui comprend l'anglais + britannique, ne comprenne pas l'anglais en général. Malheureusement, de + nombreux clients ont réellement des configurations par défaut de ce type). + Cependant, si aucune autre correspondance de langage n'est possible, et si le + serveur est sur le point de renvoyer une erreur « Aucune variable + acceptable Â» ou de choisir le langage défini par la directive LanguagePriority, le serveur ignorera + la spécification du sous-ensemble de langage et associera la demande en + en-GB à des documents en en. Implicitement, + httpd ajoute le langage parent à la liste de langages acceptés par le + client avec une valeur de qualité très basse. Notez cependant que si le + client demande « en-GB; q=0.9, fr; q=0.8 Â», et si le serveur dispose de + documents estampillés « en Â» et « fr Â», c'est le document « fr Â» qui sera + renvoyé, tout cela dans un souci de compatibilité avec la spécification + HTTP/1.1 et afin de fonctionner efficacement avec les clients + correctement configurés.

    + +

    Pour prendre en charge les techniques avancées (comme les cookies ou les chemins + d'URL spéciaux) afin de déterminer le langage préféré de l'utilisateur, le + module mod_negotiation reconnaît la + variable d'environnement + prefer-language + depuis la version 2.0.47 de httpd. Si elle est définie et contient un + symbole de langage approprié, mod_negotiation va essayer + de sélectionner une variante correspondante. S'il n'existe pas de telle + variante, le processus normal de négociation sera lancé.

    + +

    Exemple

    SetEnvIf Cookie "language=(.+)" prefer-language=$1
    +Header append Vary cookie
    +
    + +
    top
    +
    +

    Extensions à la négociation de contenu +transparente

    + +

    httpd étend le protocole de négociation de contenu transparente (RFC +2295) comme suit. Un nouvel élément {encodage ..} est utilisé dans +les listes de variantes pour marquer celles qui ne sont disponibles qu'avec un +encodage de contenu spécifique. L'implémentation de l'algorithme +RVSA/1.0 (RFC 2296) est étendue à la reconnaissance de variantes encodées dans +la liste, et à leur utilisation en tant que variantes candidates à partir du +moment où leur encodage satisfait au contenu de l'en-tête de requête +Accept-Encoding. L'implémentation RVSA/1.0 n'arrondit pas les +facteurs de qualité calculés à 5 décimales avant d'avoir choisi la meilleure +variante.

    +
    top
    +
    +

    Remarques à propos des liens hypertextes et des +conventions de nommage

    + +

    Si vous utilisez la négociation de langage, vous avez le choix entre + différentes conventions de nommage, car les fichiers peuvent posséder + plusieurs extensions, et l'ordre dans lequel ces dernières apparaissent + est en général sans rapport (voir la documentation sur le module mod_mime + pour plus de détails).

    + +

    Un fichier type possède une extension liée au type MIME + (par exemple, html), mais parfois aussi une + extension liée à l'encodage (par exemple, gz), + et bien sûr une extension liée au langage + (par exemple, en) quand plusieurs variantes de + langage sont disponibles pour ce fichier.

    + +

    Exemples :

    + +
      +
    • foo.en.html
    • + +
    • foo.html.en
    • + +
    • foo.en.html.gz
    • +
    + +

    Ci-dessous d'autres exemples de noms de fichiers avec des liens + hypertextes valables et non valables :

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Nom fichierlien valideLien invalide
    foo.html.enfoo
    + foo.html
    -
    foo.en.htmlfoofoo.html
    foo.html.en.gzfoo
    + foo.html
    foo.gz
    + foo.html.gz
    foo.en.html.gzfoofoo.html
    + foo.html.gz
    + foo.gz
    foo.gz.html.enfoo
    + foo.gz
    + foo.gz.html
    foo.html
    foo.html.gz.enfoo
    + foo.html
    + foo.html.gz
    foo.gz
    + +

    En regardant la table ci-dessus, vous remarquerez qu'il est toujours + possible d'utiliser le nom de fichier sans extension dans un lien + (par exemple, foo). L'avantage est de pouvoir + dissimuler le type réel du fichier associé à un document et de pouvoir + le modifier + ultérieurement, par exemple, de html à + shtml ou cgi sans avoir à + mettre à jour aucun lien.

    + +

    Si vous souhaitez continuer à utiliser un type MIME dans vos liens + (par exemple foo.html), l'extension liée au langage + (y compris une extension liée à l'encodage s'il en existe une) + doit se trouver à droite de l'extension liée au type MIME + (par exemple, foo.html.en).

    +
    top
    +
    +

    Remarque sur la mise en cache

    + +

    Quand un cache stocke une représentation, il l'associe avec l'URL de la + requête. Lorsque cette URL est à nouveau demandée, le cache peut utiliser + la représentation stockée. Cependant, si la ressource est négociable au + niveau du serveur, il se peut que seule la première variante demandée soit + mise en cache et de ce fait, la correspondance positive du cache peut + entraîner une réponse inappropriée. Pour + éviter cela, httpd marque par + défaut toutes les réponses qui sont renvoyées après une négociation de + contenu comme « non-cachables Â» par les clients HTTP/1.0. httpd prend + aussi en charge les fonctionnalités du protocole HTTP/1.1 afin de permettre la mise + en cache des réponses négociées.

    + +

    Pour les requêtes en provenance d'un client compatible HTTP/1.0 + (un navigateur ou un cache), la directive CacheNegotiatedDocs peut être utilisée + pour permettre la mise en cache des réponses qui ont fait l'objet d'une + négociation. Cette directive peut intervenir dans la configuration au + niveau du serveur ou de l'hôte virtuel, et n'accepte aucun argument. Elle + n'a aucun effet sur les requêtes en provenance de clients HTTP/1.1.

    + +

    Pour les clients HTTP/1.1, httpd envoie un en-tête de réponse HTTP + Vary afin d'indiquer les dimensions de la négociation pour + cette réponse. Les caches peuvent + utiliser cette information afin de déterminer + si une requête peut être servie à partir de la copie locale. Pour inciter + un cache à utiliser la copie locale sans tenir compte des dimensions de la + négociation, définissez la + variable d'environnement + force-no-vary.

    + +
    +
    +

    Langues Disponibles:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/content-negotiation.html.ja.utf8 b/docs/manual/content-negotiation.html.ja.utf8 new file mode 100644 index 0000000..fe92044 --- /dev/null +++ b/docs/manual/content-negotiation.html.ja.utf8 @@ -0,0 +1,752 @@ + + + + + +コンテントãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    コンテントãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³

    +
    +

    翻訳済ã¿è¨€èªž:  en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + + +

    Apache 㯠HTTP/1.1 ã®è¦æ ¼ã«è¨˜è¿°ã•れã¦ã„るコンテントãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ + サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚ + ブラウザã«ã‚ˆã‚Šæä¾›ã•れãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚¿ã‚¤ãƒ—〠+ è¨€èªžã€æ–‡å­—セットã€ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã®å„ªå…ˆå‚¾å‘ã«åŸºã¥ã„ã¦ã€ + 最é©ãªãƒªã‚½ãƒ¼ã‚¹ã®è¡¨ç¾ã‚’é¸æŠžã§ãã¾ã™ã€‚ + ã¾ãŸã€ä¸å®Œå…¨ãªãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³æƒ…報をé€ã£ã¦ãるブラウザã‹ã‚‰ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ + ã‚‚ã£ã¨è³¢ãå–り扱ãˆã‚‹ã‚ˆã†ã€ã„ãã¤ã‹æ©Ÿèƒ½ã‚‚実装ã—ã¦ã‚りã¾ã™ã€‚

    + +

    コンテントãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã¯ + mod_negotiation + モジュールã«ã‚ˆã£ã¦æä¾›ã•れã¦ã„ã¦ã€ãƒ‡ãƒ•ォルトã§çµ„ã¿è¾¼ã¾ã‚Œã¦ã„ã¾ã™ã€‚

    +
    + +
    top
    +
    +

    コンテントãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã«ã¤ã„ã¦

    + +

    リソースã¯ã€å¹¾ã¤ã‹ç•°ãªã£ãŸè¡¨ç¾ã§åˆ©ç”¨ã§ãã‚‹å ´åˆãŒã‚りã¾ã™ã€‚ + 例ãˆã°ã€ç•°ãªã‚‹è¨€èªžã‚„ç•°ãªã‚‹ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¿ã‚¤ãƒ—〠+ ã¾ãŸã¯ãれらã®çµ„ã¿åˆã‚ã›ã§åˆ©ç”¨ã§ãã‚‹ã‹ã‚‚知れã¾ã›ã‚“。 + ã‚‚ã£ã¨ã‚‚é©ã—ãŸé¸æŠžã‚’ã™ã‚‹æ–¹æ³•ã®ä¸€ã¤ã«ã¯ã€ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãƒšãƒ¼ã‚¸ã‚’ + ユーザã«è¦‹ã›ã¦ã€ãƒ¦ãƒ¼ã‚¶ã«é¸ã‚“ã§ã‚‚ã‚‰ã†æ–¹æ³•ãŒã‚りã¾ã™ã€‚ + ã—ã‹ã—ã€ã‚µãƒ¼ãƒãŒè‡ªå‹•çš„ã«é¸ã¶ã“ã¨ãŒã§ãã‚‹å ´åˆãŒå¤šãã‚りã¾ã™ã€‚ + ã“れã¯ã€ãƒ–ラウザãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆæ¯Žã«ã€ + ã©ã®è¡¨ç¾ã‚’嗜好ã™ã‚‹ã‹ã¨ã„ã†æƒ…報をé€ã‚‹ã“ã¨ã§å‹•作ã—ã¦ã„ã¾ã™ã€‚ + 例ãˆã°ãƒ–ラウザã¯ã€å¯èƒ½ãªã‚‰ãƒ•ãƒ©ãƒ³ã‚¹èªžã§æƒ…報を見ãŸã„〠+ ä¸å¯èƒ½ãªã‚‰ãã®ä»£ã‚りã«è‹±èªžã§ã‚‚よã„ã¨ã€ + 自分ã®å—œå¥½ã‚’知らã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ブラウザã¯ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ãƒ˜ãƒƒãƒ€ã§è‡ªåˆ†ã®å„ªå…ˆå‚¾å‘を知らã›ã¾ã™ã€‚ + フランス語ã®ã¿ã®è¡¨ç¾ã‚’è¦æ±‚ã™ã‚‹å ´åˆã¯ã€ãƒ–ãƒ©ã‚¦ã‚¶ã¯æ¬¡ã‚’é€ã‚Šã¾ã™ã€‚

    + +

    Accept-Language: fr

    + +

    ã“ã®å„ªå…ˆå‚¾å‘ã¯ã€é¸æŠžå¯èƒ½ãªè¡¨ç¾ãŒå­˜åœ¨ã—ã¦ã€ + 言語ã«ã‚ˆã£ã¦æ§˜ã€…ãªè¡¨ç¾ãŒã‚ã‚‹å ´åˆã«ã®ã¿é©ç”¨ã•れる + ã¨ã„ã†ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。

    + +

    ã‚‚ã£ã¨è¤‡é›‘ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ä¾‹ã‚’挙ã’ã¾ã—ょã†ã€‚ + ã“ã®ãƒ–ラウザã¯ãƒ•ランス語ã¨è‹±èªžã‚’å—ã‘付ã‘ã‚‹ã€ã—ã‹ã—フランス語を好む〠+ ãã—ã¦æ§˜ã€…ãªãƒ¡ãƒ‡ã‚£ã‚¢ã‚¿ã‚¤ãƒ—ã‚’å—ã‘付ã‘ã‚‹ãŒã€ + プレインテキストや他ã®ã‚¿ã‚¤ãƒ—より㯠HTML を好む〠+ ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¿ã‚¤ãƒ—より㯠GIF ã‚„ JPEG を好むã€ã—ã‹ã—最終手段ã¨ã—㦠+ ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¿ã‚¤ãƒ—ã‚‚å—ã‘付ã‘ã‚‹ã€ã¨è¨­å®šã•れã¦ã„ã¾ã™ã€‚

    + +

    + Accept-Language: fr; q=1.0, en; q=0.5
    + Accept: text/html; q=1.0, text/*; q=0.8, image/gif; q=0.6, image/jpeg; q=0.6, image/*; q=0.5, */*; q=0.1 +

    + +

    Apache 㯠HTTP/1.1 è¦æ ¼ã§å®šç¾©ã•れã¦ã„ã‚‹ 'server + driven' コンテントãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚ + Accept, Accept-Language, + Accept-Charset, Accept-Encoding + リクエストヘッダを完全ã«ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚Apache 㯠+ 'transparent' コンテントãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã‚‚サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ãŒã€ + ã“れ㯠RFC 2295 㨠RFC 2296 ã§å®šç¾©ã•れã¦ã„る試験的㪠+ ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ãƒ—ロトコルã§ã™ã€‚ + ã“れら㮠RFCã§å®šç¾©ã•れã¦ã„ã‚‹ 'feature negotiation' + ã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。

    + +

    リソースã¨ã¯ URI + ã§ç‰¹å®šã•れる概念上ã®ã‚‚ã®ã®ã“ã¨ã§ã™ (RFC 2396)。 Apache + ã®ã‚ˆã†ãª HTTP サーãƒã¯ã€ãã®åå‰ç©ºé–“ã®ä¸­ã§ã® + リソースã®è¡¨ç¾ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æä¾›ã—ã¾ã™ã€‚ + ãれãžã‚Œã®è¡¨ç¾ã¯ + 定義ã•れãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚¿ã‚¤ãƒ—ã€æ–‡å­—セットã€ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ç­‰ã® + 付属ã—ãŸã€ãƒã‚¤ãƒˆåˆ—ã®å½¢å¼ã§ã™ã€‚ + ãれãžã‚Œã®ãƒªã‚½ãƒ¼ã‚¹ã¯ã‚る時点㧠0 個ã€1 個ã€ãれ以上ã®è¡¨ç¾ã¨ + 関連付ã‘られるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚複数ã®è¡¨ç¾ãŒåˆ©ç”¨ã§ãã‚‹å ´åˆã¯ã€ + リソースã¯ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³å¯èƒ½ã§ã‚ã‚‹ã¨ã•れ〠+ 個々ã®è¡¨ç¾ã¯ variant ã¨å‘¼ã°ã‚Œã¾ã™ã€‚ + ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³å¯èƒ½ãªãƒªã‚½ãƒ¼ã‚¹ã® variant ãŒç•°ãªã‚‹ã€ + ãã®çŠ¶æ…‹ã‚’æŒ‡ã—ã¦ã€ + ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã®æ¬¡å…ƒã¨å‘¼ã³ã¾ã™ã€‚

    +
    top
    +
    +

    Apache ã«ãŠã‘ã‚‹ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³

    + +

    リソースをãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã™ã‚‹ãŸã‚ã«ã¯ã€ + サーãƒã¯ variant ãれãžã‚Œã«ã¤ã„ã¦ã®æƒ…報を知ã£ã¦ãŠãå¿…è¦ãŒã‚りã¾ã™ã€‚ + ã“れã¯ä»¥ä¸‹ã®äºŒã¤ã®æ–¹æ³•ã®ã©ã¡ã‚‰ã‹ã§è¡Œã‚れã¾ã™ã€‚

    + +
      +
    • タイプマップ + (ã™ãªã‚ã¡ *.var ファイル) + ã‚’ä½¿ã†æ–¹æ³•。 ã“れ㯠variant + ã‚’æ˜Žç¤ºçš„ã«æŒ™ã’ã¦ã„るファイルを指定ã—ã¾ã™ã€‚
    • + +
    • 'Multiviews' + を使ã£ã¦ã€ã‚µãƒ¼ãƒãŒæš—é»™ã®å†…ã«ãƒ•ァイルåã«ãƒ‘ターン照åˆã‚’ + 行ãªã£ã¦ãã®çµæžœã‹ã‚‰é¸æŠžã™ã‚‹æ–¹æ³•。
    • +
    + +

    type-map ファイルを使ã†

    + +

    タイプマップ㯠type-map ãƒãƒ³ãƒ‰ãƒ© + (ã‚‚ã—ãã¯ã€å¤ã„ Apache + ã®è¨­å®šã¨ä¸‹ä½äº’æ›ã§ã‚ã‚‹ MIME タイプ + application/x-type-map) + ã«é–¢é€£ä»˜ã‘られãŸãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã§ã™ã€‚ + ã“ã®æ©Ÿèƒ½ã‚’使ã†ãŸã‚ã«ã¯ã€ã‚ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‹¡å¼µå­ã‚’ + type-map + ã¨ã—ã¦å®šç¾©ã™ã‚‹ã‚ˆã†ãªãƒãƒ³ãƒ‰ãƒ©ã‚’〠+ 設定ファイル中ã«ç½®ãå¿…è¦ãŒã‚ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。 + ã“れã¯

    + +

    AddHandler type-map .var

    + +

    をサーãƒè¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã«æ›¸ãã“ã¨ãŒä¸€ç•ªè‰¯ã„方法ã§ã™ã€‚

    + +

    タイプマップファイルã¯è¨˜è¿°ã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹ã¨åŒã˜åå‰ã‚’æŒã£ã¦ã„ã¦ã€ + 利用å¯èƒ½ãª variant ãれãžã‚Œã®ã‚¨ãƒ³ãƒˆãƒªã‚’æŒã£ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + ãã—ã¦ã€ã“ã®ã‚¨ãƒ³ãƒˆãƒªã¯é€£ç¶šã—㟠HTTP ã®ãƒ˜ãƒƒãƒ€è¡Œã§æ§‹æˆã•れã¾ã™ã€‚ + ç•°ãªã‚‹ variant ã®ãŸã‚ã®ã‚¨ãƒ³ãƒˆãƒªã¯ç©ºè¡Œã§åŒºåˆ‡ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚ + エントリ中ã«ç©ºè¡ŒãŒè¤‡æ•°ã‚ã£ã¦ã¯ã„ã‘ã¾ã›ã‚“。 + 習慣的ã«ã¯ã€ãƒžãƒƒãƒ—ファイルã¯å…¨ä½“ã‚’çµåˆã—ãŸã‚‚ã®ã®ã‚¨ãƒ³ãƒˆãƒªã‹ã‚‰å§‹ã¾ã‚Šã¾ã™ + (ã—ã‹ã—ã“れã¯å¿…é ˆã§ã¯ãªãã€ã‚ã£ãŸã¨ã—ã¦ã‚‚無視ã•れるもã®ã§ã™)。 + 次ã«ä¾‹ã‚’示ã—ã¾ã™ã€‚ã“ã®ãƒ•ァイルã¯ãƒªã‚½ãƒ¼ã‚¹ foo + を記述ã—ã¦ã„ã‚‹ã®ã§ã€foo.var ã¨ã„ã†åå‰ã«ãªã‚Šã¾ã™ã€‚

    + +

    + URI: foo
    +
    + URI: foo.en.html
    + Content-type: text/html
    + Content-language: en
    +
    + URI: foo.fr.de.html
    + Content-type: text/html;charset=iso-8859-2
    + Content-language: fr, de
    +

    +

    ãŸã¨ãˆ MultiViews を使用ã™ã‚‹ã‚ˆã†ã«ãªã£ã¦ã„ãŸã¨ã—ã¦ã‚‚〠+ ファイルåã®æ‹¡å¼µå­ã‚ˆã‚Šã‚¿ã‚¤ãƒ—ãƒžãƒƒãƒ—ã®æ–¹ãŒå„ªå…ˆæ¨©ã‚’æŒã¤ã¨ã„ã†ã“ã¨ã«ã‚‚ + 注æ„ã—ã¦ãã ã•ã„。 + variant ã®å“質ãŒé•ã†ã¨ãã¯ã€ã“ã®ç”»åƒã®ã‚ˆã†ã« (JPEG, GIF, ASCII + アートãŒã‚りã¾ã™) メディアタイプ㮠"qs" + ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã§æŒ‡å®šã•れã¾ã™ã€‚

    + +

    + URI: foo
    +
    + URI: foo.jpeg
    + Content-type: image/jpeg; qs=0.8
    +
    + URI: foo.gif
    + Content-type: image/gif; qs=0.5
    +
    + URI: foo.txt
    + Content-type: text/plain; qs=0.01
    +

    + +

    qs 値ã®ç¯„囲㯠0.000 ã‹ã‚‰ 1.000 ã§ã™ã€‚qs 値㌠+ 0.000 ã® variant ã¯æ±ºã—㦠+ é¸æŠžã•れãªã„ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。'qs' 値ã®ãªã„ variant + 㯠qs 値 1.0 ã‚’ 与ãˆã‚‰ã‚Œã¾ã™ã€‚qs + パラメータã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®èƒ½åŠ›ã«é–¢ä¿‚ç„¡ãã€ä»–ã® variant 㨠+ 比較ã—ãŸã¨ãã® variant + ã®ç›¸å¯¾çš„ãªã€Œå“質ã€ã‚’示ã—ã¾ã™ã€‚ + 例ãˆã°ã€å†™çœŸã‚’表ç¾ã—よã†ã¨ã—ã¦ã„ã‚‹ã¨ã㯠JPEG + ãƒ•ã‚¡ã‚¤ãƒ«ã®æ–¹ãŒæ™®é€šã¯ ASCII + ファイルよりも高ã„å“質ã«ãªã‚Šã¾ã™ã€‚ã—ã‹ã—ã€ãƒªã‚½ãƒ¼ã‚¹ãŒå…ƒã€… + ASCII アートã§è¡¨ç¾ã•れã¦ã„ã‚‹ã¨ãã¯ã€ASCII ファイル㮠+ 方㌠JPEG ファイルよりも高ã„å“質ã«ãªã‚Šã¾ã™ã€‚ã“ã®ã‚ˆã†ã«ã€qs + 㯠表ç¾ã•ã‚Œã‚‹ãƒªã‚½ãƒ¼ã‚¹ã®æ€§è³ªã«ã‚ˆã£ã¦ variant + 毎ã«ç‰¹æœ‰ã®å€¤ã‚’å–りã¾ã™ã€‚

    + +

    èªè­˜ã•れるヘッダã®ä¸€è¦§ã¯ + mod_negotiation + ドキュメントã«ã‚りã¾ã™ã€‚

    + + +

    Multiviews

    + +

    MultiViews ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ¯Žã®ã‚ªãƒ—ションã§ã€ + httpd.confファイル㮠+ <Directory>, + <Location>, + <Files> + セクション中やã€(AllowOverride + ãŒé©åˆ‡ãªå€¤ã« 設定ã•れã¦ã„ã‚‹ã¨) .htaccess + ファイル㧠Options + ディレクティブã«ã‚ˆã£ã¦è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + Options All 㯠+ MultiViews + をセットã—ãªã„ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。明示的㫠+ ãã®åå‰ã‚’書ãå¿…è¦ãŒã‚りã¾ã™ã€‚

    + +

    MultiViews ã®åŠ¹æžœã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™: + サーãƒãŒ /some/dir/foo + ã¸ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’å—ã‘å–りã€/some/dir ã§ + MultiViews ãŒæœ‰åйã§ã‚ã£ã¦ã€ + /some/dir/foo ãŒå­˜åœ¨ã—ãªã„å ´åˆã€ + サーãƒã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’読ん㧠foo.* + ã«ã‚ã¦ã¯ã¾ã‚‹å…¨ã¦ã®ãƒ•ァイルを探ã—〠+ 事実上ãれらã®ãƒ•ァイルをマップã™ã‚‹ã‚¿ã‚¤ãƒ—マップを作りã¾ã™ã€‚ + ãã®ã¨ãã€ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¿ã‚¤ãƒ—ã¨ã‚³ãƒ³ãƒ†ãƒ³ãƒˆã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã¯ã€ãã®ãƒ•ァイルåã‚’ + 直接指定ã—ãŸã¨ãã¨åŒã˜ã‚‚ã®ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¾ã™ã€‚ + ãれã‹ã‚‰ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®è¦æ±‚ã«ä¸€ç•ªåˆã†ã‚‚ã®ã‚’é¸ã³ã¾ã™ã€‚

    + +

    サーãƒãŒãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ç´¢å¼•を作ã‚ã†ã¨ã—ã¦ã„ã‚‹å ´åˆã€ + MultiViews + 㯠DirectoryIndex + ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã§æŒ‡å®šã•れãŸãƒ•ァイルを探ã™éŽç¨‹ã«ã‚‚ + é©ç”¨ã•れã¾ã™ã€‚設定ファイルã«

    +

    DirectoryIndex index

    +

    ãŒæ›¸ã‹ã‚Œã¦ã„ã¦ã€index.html 㨠+ index.html3 ㌠+ 両方存在ã—ã¦ã„ã‚‹ã¨ã€ã‚µãƒ¼ãƒã¯ãã®ä¸­ã‹ã‚‰ã©ã¡ã‚‰ã‹ã‚’é©å½“ã«é¸ã³ã¾ã™ã€‚ + ã‚‚ã—ãã®ä¸¡æ–¹ãŒå­˜åœ¨ã›ãšã« index.cgi + ãŒå­˜åœ¨ã—ã¦ã„ã‚‹ã¨ã€ サーãƒã¯ãれを実行ã—ã¾ã™ã€‚

    + +

    ã‚‚ã—ディレクトリを読んã§ã„ã‚‹éš›ã«ã€ + 文字セットã€ã‚³ãƒ³ãƒ†ãƒ³ãƒˆã‚¿ã‚¤ãƒ—ã€è¨€èªžã€ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚’ + 指定ã™ã‚‹ãŸã‚ã® mod_mime + ã§èªè­˜ã§ãã‚‹æ‹¡å¼µå­ã‚’æŒãŸãªã„ファイルãŒè¦‹ã¤ã‹ã‚‹ã¨ã€çµæžœã¯ + MultiViewsMatch + ディレクティブã®è¨­å®šã«ä¾å­˜ã—ã¾ã™ã€‚ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–㯠+ ãƒãƒ³ãƒ‰ãƒ©ã€ãƒ•ィルタã€ä»–ã®ãƒ•ァイル拡張å­ã‚¿ã‚¤ãƒ—ã®ã©ã‚ŒãŒ + MultiViews ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã§ä½¿ç”¨ã§ãã‚‹ã‹ã‚’決定ã—ã¾ã™ã€‚

    + +
    top
    +
    +

    ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³æ–¹æ³•

    + +

    Apache ã¯ãƒªã‚½ãƒ¼ã‚¹ã® variant ã®ä¸€è¦§ã‚’ã€ã‚¿ã‚¤ãƒ—マップファイル㋠+ ディレクトリ内ã®ãƒ•ァイルåã‹ã‚‰ã‹ã§å–å¾—ã—ãŸå¾Œã€ + 「最é©ãªã€ variant を決定ã™ã‚‹ãŸã‚ã«äºŒã¤ã®æ–¹æ³•ã® + ã©ã¡ã‚‰ã‹ã‚’èµ·å‹•ã—ã¾ã™ã€‚ + Apache ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒˆãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã®æ©Ÿèƒ½ã‚’使ã†ãŸã‚ã«ã€ + ã©ã®ã‚ˆã†ã«ã—ã¦ã“ã®èª¿åœãŒè¡Œã‚れるã‹è©³ç´°ã‚’知る必è¦ã¯ã‚りã¾ã›ã‚“。 + ã—ã‹ã—ãªãŒã‚‰ã€ã“ã®æ–‡æ›¸ã®æ®‹ã‚Šã§ã¯é–¢å¿ƒã®ã‚る人ã®ãŸã‚ã«ã€ + 使用ã•れã¦ã„る方法ã«ã¤ã„ã¦èª¬æ˜Žã—ã¦ã„ã¾ã™ã€‚

    + +

    ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³æ–¹æ³•ã¯äºŒã¤ã‚りã¾ã™ã€‚

    + +
      +
    1. 通常㯠Apache ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã‚’用ã„㟠Server + driven negotiation ãŒä½¿ç”¨ã•れã¾ã™ã€‚Apache + ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã¯å¾Œã«è©³ç´°ã«èª¬æ˜Žã•れã¦ã„ã¾ã™ã€‚ + ã“ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ãŒä½¿ç”¨ã•れãŸå ´åˆã€Apache + ã¯ã‚ˆã‚Šè‰¯ã„çµæžœã«ãªã‚‹ã‚ˆã†ã«ã€ç‰¹å®šã®æ¬¡å…ƒã«ãŠã„ã¦å“質ã®å€¤ã‚’ + 「変ãˆã‚‹ã€ã“ã¨ãŒã§ãã¾ã™ã€‚Apache + ãŒå“質ã®å€¤ã‚’変ãˆã‚‹æ–¹æ³•ã¯å¾Œã§è©³ç´°ã«èª¬æ˜Žã•れã¦ã„ã¾ã™ã€‚
    2. + +
    3. RFC 2295 + ã§å®šç¾©ã•れã¦ã„る機構を用ã„ã¦ãƒ–ラウザãŒç‰¹ã«æŒ‡å®šã—ãŸå ´åˆã€ + transparent content negotiation + ãŒä½¿ç”¨ã•れã¾ã™ã€‚ã“ã®ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³æ–¹æ³•ã§ã¯ã€ã€Œæœ€é©ãªã€ + variant ã®æ±ºå®šã‚’ブラウザãŒå®Œå…¨ã«åˆ¶å¾¡ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã§ã™ã‹ã‚‰ã€çµæžœã¯ãƒ–ラウザãŒä½¿ç”¨ã—ã¦ã„るアルゴリズムã«ä¾å­˜ã—ã¾ã™ã€‚ + Transparent negotiation ã®å‡¦ç†ã®éŽç¨‹ã§ã€ãƒ–ラウザ㯠RFC 2296 + 㧠定義ã•れã¦ã„ã‚‹ 'remote variant selection algorithm' + を実行ã™ã‚‹ã‚ˆã†ã«é ¼ã‚€ã“ã¨ãŒã§ãã¾ã™ã€‚
    4. +
    + +

    ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã®æ¬¡å…ƒ

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    次元説明
    メディアタイプブラウザ㯠Accept + ヘッダフィールドã§å„ªå…ˆå‚¾å‘を指定ã—ã¾ã™ã€‚ + アイテムãれãžã‚Œã¯ã€é–¢é€£ã—ãŸå“質数値をæŒã¤ã“ã¨ãŒã§ãã¾ã™ã€‚ + variant ã®èª¬æ˜Žã‚‚å“質数値をæŒã¤ã“ã¨ãŒã§ãã¾ã™ + ("qs" パラメータをã”覧下ã•ã„)。
    言語ブラウザ㯠Accept-Language + ヘッダフィールドã§å„ªå…ˆå‚¾å‘を指定ã—ã¾ã™ã€‚ + è¦ç´ ãれãžã‚Œã«å“質数値をæŒãŸã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + variants 㯠0 ã‹ 1 ã¤ã‹ãれ以上ã®è¨€èªžã¨ + 関連ã¥ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
    エンコーディングブラウザ㯠Accept-Encoding + ヘッダフィールドã§å„ªå…ˆå‚¾å‘を指定ã—ã¾ã™ã€‚ + è¦ç´ ãれãžã‚Œã«å“質数値をæŒãŸã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
    文字セットブラウザ㯠Accept-Charset + ヘッダフィールドã§å„ªå…ˆå‚¾å‘を指定ã—ã¾ã™ã€‚ + è¦ç´ ãれãžã‚Œã«å“質数値をæŒãŸã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + variant ã¯ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¿ã‚¤ãƒ—ã®ãƒ‘ラメータã¨ã—ã¦æ–‡å­—セットを + 指定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
    + + +

    Apache ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ 

    + +

    ブラウザã«è¿”ã™ã€Œæœ€é©ãªã€variant ã‚’ (ã‚‚ã—ã‚れã°) é¸æŠžã™ã‚‹ã‚ˆã†ã« + Apache ã¯æ¬¡ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã‚’使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã“ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã‚’設定ã«ã‚ˆã‚Šå¤‰æ›´ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + 次ã®ã‚ˆã†ã«å‹•作ã—ã¾ã™:

    + +
      +
    1. ã¾ãšã¯ã˜ã‚ã«ã€ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã®æ¬¡å…ƒãれãžã‚Œã«ã¤ã„ã¦é©åˆ‡ãª + Accept* ヘッダフィールドを調ã¹ã€ + variant ãれãžã‚Œã«å“質を割り当ã¦ã¾ã™ã€‚ + ã‚‚ã—ã‚る次元㮠Accept* ヘッダã§ãã® variant + ãŒè¨±å®¹ã§ããªã„ã“ã¨ãŒç¤ºã•れã¦ã„れã°ã€ãれを削除ã—ã¾ã™ã€‚ + variant ãŒä¸€ã¤ã‚‚残ã£ã¦ã„ãªã‘れã°ã€ã‚¹ãƒ†ãƒƒãƒ— 4 ã«è¡Œãã¾ã™ã€‚
    2. + +
    3. + 消去法ã§ã€Œæœ€é©ãªã€ variant ã‚’é¸ã³ã¾ã™ã€‚ + 次ã®ãƒ†ã‚¹ãƒˆãŒé †ç•ªã«é©ç”¨ã•れã¾ã™ã€‚ + テストã§é¸æŠžã•れãªã‹ã£ãŸ variant ã¯å‰Šé™¤ã•れã¦ã„ãã¾ã™ã€‚ + テスト後 variant ãŒä¸€ã¤ã ã‘残ã£ã¦ã„れã°ã€ãれを最é©ãªã‚‚ã®ã¨ã—㦠+ ステップ 3 ã«é€²ã¿ã¾ã™ã€‚ + 複数 variant ãŒæ®‹ã£ã¦ã„れã°ã€æ¬¡ã®ãƒ†ã‚¹ãƒˆã«é€²ã¿ã¾ã™ã€‚ + +
        +
      1. variant ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¿ã‚¤ãƒ—ã®å“質数値㨠Accept + ヘッダã®å“質数値ã¨ã®ç©ã‚’計算ã—ã¦ã€æœ€é«˜å€¤ã® variant + ã‚’é¸ã³ã¾ã™ã€‚
      2. + +
      3. 言語å“è³ªæ•°å€¤ãŒæœ€é«˜ã® variant ã‚’é¸ã³ã¾ã™ã€‚
      4. + +
      5. (ã‚‚ã—ã‚れã°) Accept-Language ヘッダã®è¨€èªžé †ã‹ã€ + (ã‚‚ã—ã‚れã°) + LanguagePriority + ディレクティブã®è¨€èªžé †ã§æœ€é©ãªè¨€èªžã® variant ã‚’é¸ã³ã¾ã™ã€‚
      6. + +
      7. 最高「レベルã€ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ‘ラメータ + (text/html メディアタイプã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’与ãˆã‚‹ãŸã‚ã«ä½¿ã‚れã¾ã™) + ã‚’æŒã¤ variant ã‚’é¸ã³ã¾ã™ã€‚
      8. + +
      9. Accept-Charset ヘッダ行ã§ä¸Žãˆã‚‰ã‚Œã¦ã„ã‚‹æœ€é«˜ã®æ–‡å­—セット + メディアパラメータをæŒã¤ variant ã‚’é¸ã³ã¾ã™ã€‚ + 明示的ã«é™¤å¤–ã•れã¦ã„ãªã„é™ã‚Šã€ISO-8859-1 + ãŒè¨±å®¹ã•れるよã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ + text/* メディアタイプã§ã‚ã‚‹ã‘れã©ã‚‚ + ç‰¹å®šã®æ–‡å­—ã‚»ãƒƒãƒˆã«æ˜Žç¤ºçš„ã«é–¢é€£ã¥ã‘られã¦ã„ã‚‹ã‚ã‘ã§ã¯ãªã„ + variant 㯠ISO-8859-1 ã§ã‚ã‚‹ã¨ä»®å®šã•れã¾ã™ã€‚
      10. + +
      11. ISO-8859-1 ã§ã¯ãªã„文字セットメディアパラメータ㨠+ 関連ã¥ã‘られã¦ã„ã‚‹ variant ã‚’é¸ã³ã¾ã™ã€‚ + ãã®ã‚ˆã†ãª variant ãŒãªã„å ´åˆã¯ã€ä»£ã‚りã«å…¨ã¦ã® + variant ã‚’é¸ã³ã¾ã™ã€‚
      12. + +
      13. 最é©ãªã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã® variant ã‚’é¸ã³ã¾ã™ã€‚ + ã‚‚ã— user-agent ãŒè¨±å®¹ã™ã‚‹ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ãŒã‚れã°ã€ + ãã® variant ã®ã¿ã‚’é¸ã³ã¾ã™ã€‚ + ãã†ã§ã¯ãªãã€ã‚‚ã—エンコードã•れãŸã‚‚ã®ã¨ãã†ã§ãªã„ + variant ãŒæ··ã–ã£ã¦å­˜åœ¨ã—ã¦ã„ãŸã‚‰ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•れã¦ã„ãªã„ + variant ã®ã¿ã‚’é¸ã³ã¾ã™ã€‚ + variant ãŒå…¨éƒ¨ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•れã¦ã„ã‚‹ã‹ + variant ãŒå…¨éƒ¨ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•れã¦ã„ãªã„ã¨ã„ã†å ´åˆã¯ã€ + å…¨ã¦ã® variant ã‚’é¸ã³ã¾ã™ã€‚
      14. + +
      15. å†…å®¹ã®æœ€ã‚‚短ㄠvariant ã‚’é¸ã³ã¾ã™ã€‚
      16. + +
      17. 残ã£ã¦ã„ã‚‹ variant ã®æœ€åˆã®ã‚‚ã®ã‚’é¸ã³ã¾ã™ã€‚ + ã‚¿ã‚¤ãƒ—ãƒžãƒƒãƒ—ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€åˆã«ãƒªã‚¹ãƒˆã•れã¦ã„ã‚‹ã‹ã€ + variant ãŒãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‹ã‚‰æœ€åˆã«èª­ã¿è¾¼ã¾ã‚Œã‚‹æ™‚ã« + ASCIIé †ã§ã‚½ãƒ¼ãƒˆã—ã¦ãƒ•ァイルåãŒå…ˆé ­ã«ãªã£ãŸã‹ã€ã®ã©ã¡ã‚‰ã‹ã§ã™ã€‚
      18. +
      +
    4. + +
    5. アルゴリズムを使ã£ã¦ä¸€ã¤ã®ã€Œæœ€é©ãªã€variant ã‚’é¸ã³ã¾ã—ãŸã®ã§ã€ + ãれを応答ã¨ã—ã¦è¿”ã—ã¾ã™ã€‚ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã®æ¬¡å…ƒã‚’指定ã™ã‚‹ãŸã‚ã« + HTTP レスãƒãƒ³ã‚¹ãƒ˜ãƒƒãƒ€ Vary ãŒè¨­å®šã•れã¾ã™ + (リソースã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’ã™ã‚‹æ™‚ã«ã€ + ブラウザやキャッシュã¯ã“ã®æƒ…報を使ã†ã“ã¨ãŒã§ãã¾ã™)。 + 以上ã§çµ‚ã‚り。
    6. + +
    7. ã“ã“ã«æ¥ãŸã¨ã„ã†ã“ã¨ã¯ã€variant ãŒä¸€ã¤ã‚‚é¸æŠžã•れãªã‹ã£ãŸ + (ブラウザãŒè¨±å®¹ã™ã‚‹ã‚‚ã®ãŒãªã‹ã£ãŸãŸã‚) ã¨ã„ã†ã“ã¨ã§ã™ã€‚ + 406 ステータス ("No Acceptable representation" ã‚’æ„味ã™ã‚‹) + ãŒã€åˆ©ç”¨å¯èƒ½ãª variant ã®ãƒªã‚¹ãƒˆã®ã¤ã„㟠HTML + ドキュメントã¨ã¨ã‚‚ã«è¿”ã•れã¾ã™ã€‚ + 相é•ã®æ¬¡å…ƒã‚’示㙠HTTP Vary ヘッダも設定ã•れã¾ã™ã€‚
    8. +
    + +
    top
    +
    +

    å“質ã®å€¤ã‚’変ãˆã‚‹

    + +

    上記㮠Apache ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã®åŽ³æ ¼ãªè§£é‡ˆã§ + 得られるã§ã‚ã‚ã†å€¤ã‹ã‚‰ã€Apache ã¯å“質数値を時々変ãˆã¾ã™ã€‚ + ã“れã¯ã€ã“ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã§å®Œå…¨ã§ã¯ãªã„ã€ã‚ã‚‹ã„ã¯æ­£ç¢ºã§ãªã„情報をé€ã‚‹ + ブラウザå‘ã‘ã«ã‚ˆã‚Šã‚ˆã„çµæžœã‚’å¾—ã‚‹ãŸã‚ã«è¡Œã‚れã¾ã™ã€‚ + ã‹ãªã‚Šãƒãƒ”ュラーãªãƒ–ラウザã§ã€ã‚‚ã—ãªã„ã¨é–“é•ã£ãŸ variant + ã‚’é¸æŠžã™ã‚‹çµæžœã«ãªã£ã¦ã—ã¾ã†ã‚ˆã†ãª Accept + ヘッダ情報をé€ã‚‹ã‚‚ã®ã‚‚ã‚りã¾ã™ã€‚ + ブラウザãŒå®Œå…¨ã§æ­£ã—ã„æƒ…報をé€ã£ã¦ã„れã°ã€ + ã“ã®æ•°å€¤å¤‰åŒ–ã¯é©ç”¨ã•れã¾ã›ã‚“。

    + +

    メディアタイプã¨ãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰

    + +

    Accept: リクエストヘッダã¯ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¿ã‚¤ãƒ—ã®å„ªå…ˆå‚¾å‘を指定ã—ã¾ã™ã€‚ + ã“れã¯ã¾ãŸã€"image/*" ã‚„ "*/*" + ã¨ã„ã£ãŸã€Œãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰ã€ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¿ã‚¤ãƒ—ã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã“ã“ã§ * ã¯ä»»æ„ã®æ–‡å­—列ã«ãƒžãƒƒãƒã—ã¾ã™ã€‚ + ã§ã™ã‹ã‚‰ã€æ¬¡ã®:

    + +

    Accept: image/*, */*

    + +

    ã‚’å«ã‚€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ã€"image/" ã§ã¯ã˜ã¾ã‚‹ã‚¿ã‚¤ãƒ—å…¨ã¦ãŒè¨±å®¹ã§ãる〠+ ãã—ã¦ä»–ã®ã©ã‚“ãªã‚¿ã‚¤ãƒ—も許容ã§ãã‚‹ + (ã“ã®å ´åˆã¯ã˜ã‚ã® "image/*" ã¯å†—é•·ã«ãªã‚Šã¾ã™) + ã“ã¨ã‚’示ã—ã¾ã™ã€‚ + 扱ã†ã“ã¨ã®ã§ãる明示的ãªã‚¿ã‚¤ãƒ—ã«åŠ ãˆã¦ã€æ©Ÿæ¢°çš„ã« + ワイルドカードをé€ã‚‹ãƒ–ラウザもã‚りã¾ã™ã€‚例ãˆã°:

    + +

    + Accept: text/html, text/plain, image/gif, image/jpeg, */* +

    +

    ã“ã†ã™ã‚‹ã“ã¨ã®ç‹™ã„ã¯ã€æ˜Žç¤ºçš„ã«ãƒªã‚¹ãƒˆã—ã¦ã„るタイプãŒå„ªå…ˆã•れるã‘れã©ã‚‚〠+ ç•°ãªã‚‹è¡¨ç¾ãŒåˆ©ç”¨å¯èƒ½ã§ã‚れã°ãれã§ã‚‚良ã„ã€ã¨ã„ã†ã“ã¨ã§ã™ã€‚ + ã—ã‹ã—ãªãŒã‚‰ã€ä¸Šã®åŸºæœ¬çš„ãªã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã§ã¯ã€ + */* ワイルドカードã¯ä»–ã®å…¨ã¦ã®ã‚¿ã‚¤ãƒ—ã¨å…¨ãåŒç­‰ãªã®ã§å„ªå…ˆã•れã¾ã›ã‚“。 + ブラウザ㯠*/* ã«ã‚‚ã£ã¨ä½Žã„å“質 (優先) + 値を付ã‘ã¦ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ã‚‹ã¹ããªã®ã§ã™ã€‚例ãˆã°:

    +

    + Accept: text/html, text/plain, image/gif, image/jpeg, */*; q=0.01 +

    +

    明示的ãªã‚¿ã‚¤ãƒ—ã«ã¯å“質数値ãŒä»˜ã‘られã¦ã„ã¾ã›ã‚“ã®ã§ã€ + デフォルト㮠1.0 (最高値) ã®å„ªå…ˆã«ãªã‚Šã¾ã™ã€‚ + ワイルドカード */* ã¯ä½Žã„優先度 0.01 を与ãˆã‚‰ã‚Œã¦ã„ã‚‹ã®ã§ã€ + 明示的ã«ãƒªã‚¹ãƒˆã•れã¦ã„るタイプã«åˆè‡´ã™ã‚‹ variant ãŒãªã„å ´åˆã«ã®ã¿ã€ + ä»–ã®ã‚¿ã‚¤ãƒ—ãŒè¿”ã•れã¾ã™ã€‚

    + +

    ã‚‚ã— Accept: ヘッダ㌠q 値を全ãå«ã‚“ã§ã„ãªã‘れã°ã€ + 望ã¿ã®æŒ™å‹•ã‚’ã™ã‚‹ãŸã‚ã«ã€ + Apache 㯠"*/*" ãŒã‚れ㰠0.01 ã® q 値を設定ã—ã¾ã™ã€‚ + ã¾ãŸã€"type/*" ã®å½¢ã®ãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰ã«ã¯ 0.02 ã® q 値を設定ã—ã¾ã™ + (ã§ã™ã‹ã‚‰ã“れら㯠"*/*" ã®ãƒžãƒƒãƒã‚ˆã‚Šã‚‚優先ã•れã¾ã™)。 + ã‚‚ã— Accept: ヘッダ中ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¿ã‚¤ãƒ—ã®ã©ã‚Œã‹ãŒ q + 値をå«ã‚“ã§ã„れã°ã€ã“れらã®ç‰¹æ®Šãªå€¤ã¯é©å¿œã•れãšã€ + æ­£ã—ã„æƒ…報をé€ã‚‹ãƒ–ラウザã‹ã‚‰ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯æœŸå¾…通り㫠+ 動作ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚

    + + +

    言語ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã®ä¾‹å¤–処ç†

    + +

    Apache 2.0 ã§ã¯æ–°ãŸã«ã€è¨€èªžãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ãŒé©åˆã™ã‚‹ã‚‚ã®ã‚’ + 見ã¤ã‘ã‚‹ã®ã«å¤±æ•—ã—ãŸæ™‚ã«ã€å„ªé›…ã«ãƒ•ォールãƒãƒƒã‚¯ã§ãるよã†ãª + ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ãŒå¹¾ã¤ã‹è¿½åŠ ã•れã¾ã—ãŸã€‚

    + +

    サーãƒã®ãƒšãƒ¼ã‚¸ã‚’クライアントãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã—ãŸã‘れã©ã‚‚〠+ ブラウザã®é€ã£ã¦ã㟠Accept-Language ã«åˆè‡´ã™ã‚‹ãƒšãƒ¼ã‚¸ãŒä¸€ã¤ã‚‚ + 見ã¤ã‹ã‚‰ãªã‹ã£ãŸå ´åˆã«ã€ã‚µãƒ¼ãƒã¯ "No Acceptable Variant" + ã‹ "Multiple Choices" レスãƒãƒ³ã‚¹ã‚’クライアントã«è¿”ã—ã¾ã™ã€‚ + ã“れらã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’è¿”ã•ãªã„よã†ã«ã€ + ã“ã®ã‚ˆã†ãªå ´åˆã«ã¯ Apache ㌠Accept-Language を無視ã—ã¦ã€ + クライアントã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«æ˜Žç¤ºçš„ã«ã¯åˆè‡´ã—ãªã„ドキュメントを + æä¾›ã™ã‚‹ã‚ˆã†ã«è¨­å®šã§ãã¾ã™ã€‚ + ForceLanguagePriority + ディレクティブã¯ã€ã“れらã®ã‚¨ãƒ©ãƒ¼ã®ä¸€ã¤ã‹ä¸¡æ–¹ã‚’オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ãŸã‚ã« + 使用ã§ãã¦ã€ + LanguagePriority + ディレクティブã®å†…容を使ã£ã¦ã‚µãƒ¼ãƒã®åˆ¤æ–­ã‚’代行ã™ã‚‹ã‚ˆã†ã«ã§ãã¾ã™ã€‚

    + +

    サーãƒã¯ä»–ã«é©åˆã™ã‚‹ã‚‚ã®ãŒè¦‹ã¤ã‹ã‚‰ãªã‘れã°ã€ + 言語サブセットã§é©åˆã™ã‚‹ã‚‚ã®ã‚’試ãã†ã¨ã‚‚ã—ã¾ã™ã€‚ + 例ãˆã°ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒè‹±å›½è‹±èªžã§ã‚ã‚‹ en-GB 言語㧠+ ドキュメントをリクエストã—ãŸå ´åˆã€ã‚µãƒ¼ãƒã¯ HTTP/1.1 + è¦æ ¼ã§ã¯ã€å˜ã« en ã¨ãƒžãƒ¼ã‚¯ã•れã¦ã„るドキュメントを + マッãƒã™ã‚‹ã‚‚ã®ã¨ã™ã‚‹ã“ã¨ã¯é€šå¸¸ã¯è¨±ã•れã¦ã„ã¾ã›ã‚“。 + (英国英語ã¯ç†è§£ã§ãã‚‹ã‘ã©ä¸€èˆ¬çš„ãªè‹±èªžã¯ç†è§£ã§ããªã„ã¨ã„ã†èª­ã¿æ‰‹ã¯ + 考ãˆã‚‰ã‚Œãªã„ã®ã§ã€Accept-Language ヘッダ㧠en-GB + ã‚’å«ã‚“ã§ en ã‚’å«ã¾ãªã„ã®ã¯ã»ã¼ç¢ºå®Ÿã«è¨­å®šã®é–“é•ã„ã§ã‚る〠+ ã¨ã„ã†ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。 + ã§ã™ãŒä¸å¹¸ãªã“ã¨ã«ã€å¤šãã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã¯ãƒ‡ãƒ•ォルト㧠+ ã“ã®ã‚ˆã†ãªè¨­å®šã«ãªã£ã¦ã„ã¾ã™ã€‚) + ã—ã‹ã—ãªãŒã‚‰ã€ä»–ã®è¨€èªžã«ã¯ãƒžãƒƒãƒã›ãšã€"No Acceptable Variants" + エラーを返ã—ãŸã‚Šã€ + LanguagePriority + ã«ãƒ•ォールãƒãƒƒã‚¯ã—よã†ã¨ã—ã¦ã„ã‚‹ã¨ãã¯ã€ + サブセット指定を無視ã—ã¦ã€en-GB ã‚’ en + ã«ãƒžãƒƒãƒã—ã¾ã™ã€‚ + Apache ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®è¨±å®¹è¨€èªžãƒªã‚¹ãƒˆã«æš—黙㫠+ éžå¸¸ã«ä½Žã„å“質値ã®è¦ªè¨€èªžã‚’加ãˆã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ + ã—ã‹ã—ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒ "en-GB; q=0.9, fr; q=0.8" ã¨ãƒªã‚¯ã‚¨ã‚¹ãƒˆã—ã¦ã€ + サーãƒãŒ "en" 㨠"fr" ã¨è¨­è¨ˆã•れãŸãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’æŒã£ã¦ã„ã‚‹å ´åˆã¯ã€ + "fr" ドキュメントãŒè¿”ã•れるã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。 + ã“ã®ã‚ˆã†ãªå‡¦ç†ã¯ã€HTTP 1.1 è¦æ ¼ã¨ã®æ•´åˆæ€§ã‚’ç¶­æŒã—ã¦ã€ + é©åˆ‡ã«è¨­å®šã•れãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¨ã‚‚ãã¡ã‚“ã¨å‹•作ã™ã‚‹ãŸã‚ã« + å¿…è¦ã§ã™ã€‚

    + +

    より高度ãªãƒ†ã‚¯ãƒ‹ãƒƒã‚¯ (Cookie や特殊㪠URL パス等) + ã«ãŠã„ã¦ã‚‚ユーザã®è¨€èªžé¸æŠžã‚’サãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚〠+ Apache 2.0.47 ã‹ã‚‰ã¯ã€mod_negotiation + ãŒç’°å¢ƒå¤‰æ•° prefer-language + ã‚’èªè­˜ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚ + ã“ã®å¤‰æ•°ãŒå­˜åœ¨ã—ã¦ã€é©åˆ‡ãªè¨€èªžã‚¿ã‚°ãŒä»£å…¥ã•れã¦ã„ã‚‹ã®ã§ã‚れã°ã€ + mod_negotiation ã¯åˆè‡´ã™ã‚‹ variant + ã‚’é¸æŠžã—よã†ã¨ã—ã¾ã™ã€‚åˆè‡´ã™ã‚‹ã‚‚ã®ãŒç„¡ã‘れã°ã€ + 通常ã®ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³æ‰‹é †ãŒé©ç”¨ã•れã¾ã™ã€‚

    + +

    Example

    + SetEnvIf Cookie "language=(.+)" prefer-language=$1
    + Header append Vary cookie +

    + +
    top
    +
    +

    Transparent Content Negotiation +ã®æ‹¡å¼µ

    + +

    Apache 㯠transparent content negotiation プロトコル +(RFC 2295) を次ã®ã‚ˆã†ã«æ‹¡å¼µã—ã¦ã„ã¾ã™ã€‚ +特定ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒˆã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã®ã¿ãŒåˆ©ç”¨å¯èƒ½ã§ã‚ã‚‹ variant +ã«å°ã‚’付ã‘ã‚‹ãŸã‚ã«ã€æ–°ãŸã« {encoding ..} +è¦ç´ ã‚’ variant リスト中ã«ä½¿ã£ã¦ã„ã¾ã™ã€‚ +リスト中ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•れ㟠variant ã‚’èªè­˜ã—〠+Accept-Encoding リクエストヘッダã«å¾“ã£ã¦è¨±å®¹ã•れる +エンコードをもã£ãŸ variant ã¯ã€ã©ã‚Œã§ã‚‚候補 variant +ã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã‚ˆã†ã«ã€ +RVSA/1.0 アルゴリズム (RFC 2296) ã®å®Ÿè£…ãŒæ‹¡å¼µã•れã¾ã—ãŸã€‚ +RVSA/1.0 ã®å®Ÿè£…ã§ã¯ã€æœ€é©ãª variant ãŒè¦‹ã¤ã‹ã‚‹ã¾ã§ã€ +計算ã—ãŸå“質数値ã¯å°æ•°ç‚¹ä»¥ä¸‹ 5 æ¡ã¾ã§ä¸¸ã‚ã¾ã›ã‚“。

    +
    top
    +
    +

    リンクã¨åå‰ã®å¤‰æ›ã«é–¢ã™ã‚‹æ³¨æ„点

    + +

    言語ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã‚’使ã£ã¦ã„ã‚‹å ´åˆã¯ã€ + ファイルãŒä¸€ã¤ä»¥ä¸Šã®æ‹¡å¼µå­ã‚’æŒã¦ã¦ã€ + æ‹¡å¼µå­ã®é †ç•ªã¯é€šå¸¸ã¯è€ƒæ…®ã•れãªã„ + (詳細㯠mod_mime + ã‚’å‚ç…§) ã®ã§ã€ + å¹¾ã¤ã‹ã®ç•°ãªã‚‹åå‰ã®å¤‰æ›ã‚’é¸ã¹ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚

    + +

    典型的ãªãƒ•ァイルã§ã¯ã€MIME ã‚¿ã‚¤ãƒ—æ‹¡å¼µå­ (例ãˆã° + html) ã‚’æŒã£ã¦ã„ã¦ã€ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°æ‹¡å¼µå­ + (例ãˆã° gz) ã‚’æŒã£ã¦ã„ã‚‹ã‹ã‚‚ã—れãªãã¦ã€ + ã“ã®ãƒ•ァイルã«ç•°ãªã‚‹è¨€èªž variant を用æ„ã—ã¦ã„れã°ã€ + ã‚‚ã¡ã‚ã‚“è¨€èªžæ‹¡å¼µå­ (例ãˆã° en) + ã‚’æŒã£ã¦ã„ã‚‹ã§ã—ょã†ã€‚

    + +

    例:

    + +
      +
    • foo.en.html
    • + +
    • foo.html.en
    • + +
    • foo.en.html.gz
    • +
    + +

    ファイルåã¨ã€ãれã«å¯¾ã—ã¦ä½¿ãˆã‚‹ãƒªãƒ³ã‚¯ã¨ä½¿ãˆãªã„リンクã®ä¾‹ã§ã™:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ファイルå使ãˆã‚‹ãƒªãƒ³ã‚¯ä½¿ãˆãªã„リンク
    foo.html.enfoo
    + foo.html
    -
    foo.en.htmlfoofoo.html
    foo.html.en.gzfoo
    + foo.html
    foo.gz
    + foo.html.gz
    foo.en.html.gzfoofoo.html
    + foo.html.gz
    + foo.gz
    foo.gz.html.enfoo
    + foo.gz
    + foo.gz.html
    foo.html
    foo.html.gz.enfoo
    + foo.html
    + foo.html.gz
    foo.gz
    + +

    上ã®è¡¨ã‚’見ã¦ã€æ‹¡å¼µå­ãªã—ã®ãƒªãƒ³ã‚¯ (例ãˆã° foo) + ãŒã„ã¤ã§ã‚‚使ãˆã‚‹ã“ã¨ã«æ°—ãŒä»˜ãã§ã—ょã†ã€‚ + ã“ã®åˆ©ç‚¹ã¯ã€ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¨ã—ã¦å¿œç­”ã™ã‚‹ãƒ•ァイル㮠+ 実際ã®ãƒ•ァイルタイプを隠蔽ã—ã¦ã€ãƒªãƒ³ã‚¯ã®å‚照を変更ã™ã‚‹ã“ã¨ãªã + 後ã‹ã‚‰ãƒ•ァイルを変更ã§ãる〠+ 例ãˆã° html ã‹ã‚‰ shtml + ã«ã€ã‚ã‚‹ã„㯠cgi ã«å¤‰æ›´ã§ãる点ã§ã™ã€‚

    + +

    リンク㫠MIME タイプを使ã„ç¶šã‘ãŸã„ (例ãˆã° + foo.html)時ã¯ã€è¨€èªžæ‹¡å¼µå­ã¯ + (エンコーディング拡張å­ã‚‚ã‚れã°ãれもå«ã‚ã¦) + MIME タイプ拡張å­ã®å³å´ã«ãªã‘れã°ãªã‚Šã¾ã›ã‚“ + (例ãˆã° foo.html.en)。

    +
    top
    +
    +

    キャッシュã«é–¢ã™ã‚‹æ³¨æ„事項

    + +

    キャッシュãŒä¸€ã¤ã®è¡¨ç¾ã‚’ä¿å­˜ã—ã¦ã„ã‚‹ã¨ãã¯ã€ + リクエスト URL ã¨é–¢é€£ã¥ã‘られã¦ã„ã¾ã™ã€‚ + 次ã«ãã® URL ãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã•ã‚ŒãŸæ™‚ã«ã€ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã¯ + ä¿å­˜ã•れã¦ã„る表ç¾ã‚’使用ã§ãã¾ã™ã€‚ã—ã‹ã—〠+ リソースãŒã‚µãƒ¼ãƒã§ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³å¯èƒ½ã§ã‚れã°ã€ + 最åˆã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã§ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れã¦ç¶šãキャッシュヒットã§ã¯ + é–“é•ã£ãŸå¿œç­”ã‚’è¿”ã—ã¦ã—ã¾ã†ã¨ã„ã†ã“ã¨ã«ãªã‚Šã‹ã­ã¾ã›ã‚“。 + ã“れを防ããŸã‚ã«ã€Apache ã¯ã‚³ãƒ³ãƒ†ãƒ³ãƒˆãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã® + 後ã«è¿”ã•れãŸå¿œç­”å…¨ã¦ã«ã€HTTP/1.0 クライアントã§ã¯ + キャッシュä¸å¯èƒ½ã®å°ã‚’ã¤ã‘ã¾ã™ã€‚ + ã¾ãŸã€ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã•れãŸå¿œç­”ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’å¯èƒ½ã«ã™ã‚‹ + HTTP/1.1 ãƒ—ãƒ­ãƒˆã‚³ãƒ«ã®æ©Ÿèƒ½ã‚‚ Apache ã¯ã‚µãƒãƒ¼ãƒˆã—ã¾ã™ã€‚

    + +

    HTTP/1.0 準拠ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«å¯¾ã—ã¦ã¯ã€ + (ブラウザã§ã‚ã‚ã†ã¨ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã§ã‚ã‚ã†ã¨) + ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å—ã‘ãŸå¿œç­”ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’許ã™ãŸã‚ã«ã€ + CacheNegotiatedDocs + ディレクティブを使用ã§ãã¾ã™ã€‚ + ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã¯ã€ã‚µãƒ¼ãƒè¨­å®šãƒ•ァイルやãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã«æ›¸ãã“ã¨ãŒã§ã〠+ 引数をã¨ã‚Šã¾ã›ã‚“。 + HTTP/1.1 クライアントã‹ã‚‰ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¯åŠ¹åŠ›ã‚’æŒã¡ã¾ã›ã‚“。

    + +

    HTTP/1.1 クライアントã«å¯¾ã—ã¦ã¯ã€ãƒ¬ã‚¹ãƒãƒ³ã‚¹ã®ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³æ¬¡å…ƒ + を示ã™ãŸã‚ã« Vary HTTP レスãƒãƒ³ã‚¹ãƒ˜ãƒƒãƒ€ã‚’é€ã‚Šã¾ã™ã€‚ + キャッシュã¯ã€ã“れを使ã£ã¦å¾Œç¶šã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«å¯¾ã—ã¦ãƒ­ãƒ¼ã‚«ãƒ«ã‚³ãƒ”ーã§å¿œç­”ã§ãã‚‹ã‹ + ã©ã†ã‹ã‚’決定ã§ãã¾ã™ã€‚ + ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³æ¬¡å…ƒã¨ã¯é–¢ä¿‚ãªã—ã«ãƒ­ãƒ¼ã‚«ãƒ«ã‚³ãƒ”ーã®ä½¿ç”¨ã‚’優先ã™ã‚‹ã‚ˆã†ã«ã™ã‚‹ã«ã¯ã€ + force-no-vary 環境変数を + 設定ã—ã¾ã™ã€‚

    + +
    +
    +

    翻訳済ã¿è¨€èªž:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/content-negotiation.html.ko.euc-kr b/docs/manual/content-negotiation.html.ko.euc-kr new file mode 100644 index 0000000..a66a086 --- /dev/null +++ b/docs/manual/content-negotiation.html.ko.euc-kr @@ -0,0 +1,632 @@ + + + + + +³»¿ëÇù»ó (Content Negotiation) - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    ³»¿ëÇù»ó (Content Negotiation)

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + +

    ¾ÆÆÄÄ¡´Â HTTP/1.1 ±Ô¾à¿¡ ±â¼úµÈ ³»¿ëÇù»ó(content + negotiation)À» Áö¿øÇÑ´Ù. ³»¿ëÇù»óÀº media type, ¾ð¾î, ¹®ÀÚÁýÇÕ, + ÀÎÄÚµù µî¿¡ ´ëÇØ ºê¶ó¿ìÀú°¡ Á¦°øÇÑ ¼±È£µµ¿¡ µû¶ó ÀÚ¿øÀÇ + °¡Àå ÀûÇÕÇÑ Ç¥ÇöÀ» ¼±ÅÃÇÑ´Ù. ¶Ç ºÒ¿ÏÀüÇÑ Çù»ó Á¤º¸¸¦ º¸³»´Â + ºê¶ó¿ìÀúÀÇ ¿äûÀ» Áö´ÉÀûÀ¸·Î ó¸®ÇÏ´Â ±â´Éµµ ÀÖ´Ù.

    + +

    ±âº»ÀûÀ¸·Î ÄÄÆÄÀϵǴ mod_negotiation + ¸ðµâÀÌ ³»¿ëÇù»ó ±â´ÉÀ» Á¦°øÇÑ´Ù.

    +
    + +
    top
    +
    +

    ³»¿ëÇù»ó¿¡ ´ëÇØ

    + +

    ÀÚ¿øÀº ¿©·¯ ´Ù¸¥ Ç¥ÇöÀ» °¡Áú ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ´Ù¸¥ + ¾ð¾î³ª ´Ù¸¥ media type ȤÀº µÑ ¸ðµÎ°¡ ´Ù¸¥ Ç¥ÇöµéÀÌ ÀÖÀ» + ¼ö ÀÖ´Ù. °¡Àå Àû´çÇÑ Ç¥ÇöÀ» ¼±ÅÃÇÏ´Â ÇѰ¡Áö ¹æ¹ýÀº »ç¿ëÀÚ¿¡°Ô + ¸ñ·Ï ÆäÀÌÁö¸¦ º¸¿©ÁÖ°í ¼±ÅÃÇÏ°Ô ÇÏ´Â °ÍÀÌ´Ù. ±×·¯³ª ¼­¹ö°¡ + ÀÚµ¿À¸·Î ¼±ÅÃÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù. ÀÌ´Â ºê¶ó¿ìÀú°¡ ¿äûÀÇ + ÀϺηΠ±×µéÀÌ ¼±È£Çϴ ǥÇö¿¡ ´ëÇÑ Á¤º¸¸¦ º¸³»±â¶§¹®¿¡ + °¡´ÉÇÏ´Ù. ¿¹¸¦ µé¾î, ºê¶ó¿ìÀú´Â °¡´ÉÇÑÇÑ ºÒ¾î·Î, ±×·¯³ª + ¾ø´Ù¸é ¿µ¾î·Î Á¤º¸¸¦ º¸°í½Í´Ù°í ¾Ë·ÁÁÙ ¼ö ÀÖ´Ù. ºê¶ó¿ìÀú´Â + ¿äûÀÇ Çì´õ·Î ±×µéÀÇ ±âÈ£¸¦ ³ªÅ¸³½´Ù. ¿ÀÁ÷ ºÒ¾î·ÎµÈ Ç¥Çö¸¸À» + ¿äûÇÑ´Ù¸é ºê¶ó¿ìÀú´Â ´ÙÀ½°ú °°ÀÌ º¸³½´Ù.

    + +

    Accept-Language: fr

    + +

    ÀÌ·± ±âÈ£´Â Ç¥ÇöÀÌ ¾ð¾îº°·Î ´Ù¸¦ °æ¿ì¿¡¸¸ °í·ÁµÈ´Ù.

    + +

    ´ÙÀ½Àº ´õ º¹ÀâÇÑ ¿äûÀÇ ¿¹·Î ºê¶ó¿ìÀú°¡ ºÒ¾î¿Í ¿µ¾î¸¦ + ¹ÞÀ» ¼ö ÀÖÁö¸¸, ºÒ¾î¸¦ ´õ ¼±È£Çϰí, ¿©·¯ media typeÀ» ¹ÞÀ» + ¼ö ÀÖÁö¸¸, ÀÏ¹Ý ÅØ½ºÆ® º¸´Ù´Â HTML, ´Ù¸¥ media type º¸´Ù´Â + GIF¿Í JPEGÀ» ¼±È£ÇÑ´Ù°í ¾Ë·ÁÁØ´Ù.

    + +

    + Accept-Language: fr; q=1.0, en; q=0.5
    + Accept: text/html; q=1.0, text/*; q=0.8, image/gif; q=0.6, image/jpeg; q=0.6, image/*; q=0.5, */*; q=0.1 +

    + +

    ¾ÆÆÄÄ¡´Â HTTP/1.1 ±Ô¾à¿¡ Á¤ÀÇµÈ '¼­¹ö ÁÖµµ(server driven)' + ³»¿ëÇù»óÀ» Áö¿øÇÑ´Ù. ¾ÆÆÄÄ¡´Â Accept, + Accept-Language, Accept-Charset, + Accept-Encoding ¿äû Çì´õ¸¦ ¸ðµÎ Áö¿øÇÑ´Ù. + ¶Ç, ¾ÆÆÄÄ¡´Â RFC 2295¿Í RFC 2296¿¡ Á¤ÀÇµÈ ½ÇÇèÀûÀÎ ³»¿ëÇù»óÀÎ + 'ÀÚ¿¬½º·¯¿î(transparent)' ¿äû Çì´õµµ Áö¿øÇÑ´Ù. ±×·¯³ª ÀÌ + RFC¿¡ Á¤ÀÇµÈ '±â´É Çù»ó(feature negotiation)'Àº Áö¿øÇÏÁö + ¾Ê´Â´Ù.

    + +

    ÀÚ¿ø(resource)Àº (RFC 2396) URI·Î ±¸º°ÇÏ´Â + °³³äÀûÀÎ Á¸Àç´Ù. ¾ÆÆÄÄ¡¿Í °°Àº À¥¼­¹ö´Â ÀÚ¿øÀÇ + Ç¥Çö(representations)À» Á¦°øÇÑ´Ù. Ç¥ÇöÀº + ÁöÁ¤µÈ media type, ¹®ÀÚÁýÇÕ, ÀÎÄÚµù µîÀ» °¡Áø ¹ÙÀÌÆ®µé·Î + µÇÀÖ´Ù. ÀÚ¿øÀº ¿©·¯ Ç¥Çö°ú (¶§·Î´Â ¾øÀ» ¼öµµ ÀÖ´Ù) ¿¬°üµÈ´Ù. + ÀÚ¿ø¿¡ ¿©·¯ Ç¥ÇöÀÌ ÀÖ´Ù¸é ÀÚ¿øÀ» + Çù»ó°¡´ÉÇÏ´Ù°í(negotiable) ºÎ¸£¸ç, À̶§ + °¢ Ç¥ÇöÀ» º¯Çü(variant)À̶ó°í ÇÑ´Ù. + Çù»ó°¡´ÉÇÑ ÀÚ¿øÀÇ º¯Çü Á¾·ù¸¦ Çù»óÀÇ + ¹üÀ§(dimension)¶ó°í ÇÑ´Ù.

    +
    top
    +
    +

    ¾ÆÆÄÄ¡ÀÇ Çù»ó

    + +

    ÀÚ¿øÀ» Çù»óÇϱâÀ§ÇØ ¼­¹ö´Â °¢ º¯Çü¿¡ ´ëÇÑ Á¤º¸°¡ ÇÊ¿äÇÏ´Ù. + ´ÙÀ½ µÎ°¡Áö ¹æ¹ýÁß Çϳª·Î Á¤º¸¸¦ ¾ò´Â´Ù:

    + +
      +
    • º¯ÇüÀ» ´ãÀº ÆÄÀϵéÀ» Á÷Á¢ ¿­°ÅÇÑ type mapÀ» (¿¹¸¦ + µé¾î, *.var ÆÄÀÏ) »ç¿ëÇϰųª,
    • + +
    • Á÷Á¢ ÁöÁ¤ÇÏÁö¾Ê¾Æµµ ¼­¹ö°¡ ÆÄÀÏ¸í¿¡¼­ ±ÔÄ¢À» ã¾Æ¼­ + °á°ú¸¦ ¼±ÅÃÇÏ´Â 'MultiViews'¸¦ »ç¿ëÇÑ´Ù.
    • +
    + +

    type-map ÆÄÀÏ »ç¿ëÇϱâ

    + +

    type mapÀº type-mapÀ̶õ Çڵ鷯¿Í ¿¬°áµÈ + (ȤÀº ÀÌÀü ¾ÆÆÄÄ¡ ¼³Á¤°ú ȣȯÀ» À§ÇØ MIME typeÀÌ + application/x-type-mapÀÎ) ¹®¼­´Ù. ÀÌ ±â´ÉÀ» + »ç¿ëÇÏ·Á¸é ¼³Á¤¿¡¼­ type-map Çڵ鷯¿¡ ´ëÇÑ + ÆÄÀÏ È®ÀåÀÚ¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù. ¼­¹ö ¼³Á¤ÆÄÀÏ¿¡ ´ÙÀ½°ú °°ÀÌ + ¼³Á¤ÇÏ´Â °ÍÀÌ ÁÁ´Ù.

    + +

    AddHandler type-map .var

    + +

    Type map ÆÄÀÏÀº ÇØ´çÇÏ´Â ÀÚ¿ø°ú À̸§ÀÌ °°¾Æ¾ß Çϰí, + °¢ º¯Çü¿¡ ´ëÇÑ Ç׸ñÀÌ ÀÖ¾î¾ß ÇÑ´Ù. Ç׸ñÀº ¿©·¯ HTTPÇü½Ä + Çì´õ ÁÙ·Î ±¸¼ºµÈ´Ù. º¯Çü¿¡ ´ëÇÑ °¢°¢ÀÇ Ç׸ñµéÀº ºóÁÙ·Î + ±¸ºÐÇÑ´Ù. Ç׸ñ¾È¿¡¼­ ºóÁÙÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. (ÀÌ·¸°Ô ÇÒ + Çʿ䰡 ¾ø°í, À־ ¹«½ÃÇÏÁö¸¸) ¿©·¯ Ç׸ñÀÌ °øÅëÀ¸·Î °¡Áö°í + ÀÖ´Â ³»¿ëÀ¸·Î map ÆÄÀÏÀ» ½ÃÀÛÇÏ´Â °ÍÀÌ º¸ÅëÀÌ´Ù. ´ÙÀ½Àº + map ÆÄÀÏ ¿¹´Ù. ÀÌ ÆÄÀÏÀÇ À̸§Àº foo.var·Î, + foo¶ó´Â ÀÚ¿øÀ» ¼³¸íÇÑ´Ù.

    + +

    + URI: foo
    +
    + URI: foo.en.html
    + Content-type: text/html
    + Content-language: en
    +
    + URI: foo.fr.de.html
    + Content-type: text/html;charset=iso-8859-2
    + Content-language: fr, de
    +

    +

    typemap ÆÄÀÏÀÌ ÆÄÀϸí È®ÀåÀÚ º¸´Ù, ½ÉÁö¾î Multiviews¸¦ + »ç¿ëÇÏ¿©µµ, ¿ì¼±±ÇÀ» °¡ÁüÀ» ÁÖÀÇÇ϶ó. º¯ÇüÀÌ ¼­·Î ´Ù¸¥ ǰÁúÀ» + °¡Áø´Ù¸é, ´ÙÀ½°ú °°ÀÌ (JPEG, GIF, ASCII-art¿¡ ÇØ´çÇÏ´Â) + media type¿¡ "qs" ÆÄ¶ó¹ÌÅͷΠǰÁú(source quality)À» Ç¥½ÃÇÒ + ¼ö ÀÖ´Ù:

    + +

    + URI: foo
    +
    + URI: foo.jpeg
    + Content-type: image/jpeg; qs=0.8
    +
    + URI: foo.gif
    + Content-type: image/gif; qs=0.5
    +
    + URI: foo.txt
    + Content-type: text/plain; qs=0.01
    +

    + +

    qs °ªÀº 0.000¿¡¼­ 1.000 »çÀÌ´Ù. qs °ªÀÌ 0.000ÀÎ º¯ÇüÀº + Àý´ë ¼±ÅõÇÁö ¾ÊÀ½À» ÁÖÀÇÇ϶ó. 'qs' °ªÀÌ ¾ø´Â º¯ÇüÀº 1.0À¸·Î + Ãë±ÞµÈ´Ù. qs °ªÀº Ŭ¶óÀ̾ðÆ®ÀÇ ´É·Â°ú´Â °ü°è¾øÀÌ ´Ù¸¥ º¯Çüµé°ú + ºñ±³ÇÏ¿© ±× º¯ÇüÀÇ »ó´ëÀûÀÎ 'ǰÁú'À» ³ªÅ¸³½´Ù. ¿¹¸¦ µé¾î, + »çÁøÀ» ³ªÅ¸³»·Á´Â °æ¿ì JPEG ÆÄÀÏÀÌ ASCII ÆÄÀϺ¸´Ù´Â Ç×»ó + ³ôÀº ǰÁúÀ» °¡Áø´Ù. ±×·¯³ª ÀÚ¿øÀÌ ¿ø·¡ ASCII art¿´´Ù¸é + ASCII Ç¥ÇöÀÌ JPEG Ç¥Çöº¸´Ù ´õ ³ôÀº ǰÁúÀ» °¡Áú ¼ö ÀÖ´Ù. + ±×·¯¹Ç·Î ¾î¶² º¯ÇüÀÇ qs °ªÀº Ç¥ÇöÇÏ·Á´Â ÀÚ¿øÀÇ ¼ºÁú¿¡ + µû¶ó ´Ù¸£´Ù.

    + +

    Áö¿øÇÏ´Â ¸ðµç Çì´õ ¸ñ·ÏÀº mod_negotation + typemap ¹®¼­¸¦ Âü°íÇ϶ó.

    + + +

    Multiviews

    + +

    MultiViews´Â µð·ºÅ丮º° ¿É¼ÇÀ̹ǷÎ, + httpd.confÀÇ + <Directory>, + <Location>, + <Files> + ¼½¼Ç ȤÀº (AllowOverride°¡ + ÀûÀýÈ÷ ¼³Á¤µÇ¾ú´Ù¸é) .htaccess ÆÄÀÏÀÇ + Options Áö½Ã¾î¿¡ ¼³Á¤ÇÒ + ¼ö ÀÖ´Ù. Options AllÀº MultiViews¸¦ + Æ÷ÇÔÇÏÁö¾ÊÀ½À» ÁÖÀÇÇ϶ó. µû·Î Á÷Á¢ ½áÁà¾ß ÇÑ´Ù.

    + +

    MultiViews¸¦ »ç¿ëÇÏ¸é ´ÙÀ½°ú °°Àº ÀÏÀÌ ÀϾ´Ù: + ¼­¹ö°¡ /some/dir/foo¿¡ ´ëÇÑ ¿äûÀ» ¹Þ°í + /some/dir/foo¿¡ MultiViews°¡ µ¿ÀÛÇϸç + /some/dir/foo°¡ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì, + ¼­¹ö´Â µð·ºÅ丮¿¡¼­ À̸§ÀÌ foo.*ÀÎ ÆÄÀϵéÀ» ¸ðµç Æ÷ÇÔÇÏ´Â + °¡»óÀÇ type mapÀ» ¸¸µç´Ù. Ŭ¶óÀÌ¾ðÆ®°¡ ¿äûÇÑ media type°ú + content-encodingÀ» °¡Áö°í ÀÌÁß¿¡ °¡Àå ÀûÇÕÇÑ °ÍÀ» ¼±ÅÃÇÑ´Ù.

    + +

    MultiViews´Â ¼­¹ö°¡ µð·ºÅ丮¸¦ ÂüÁ¶ÇÒ¶§ + ÆÄÀÏÀ» ã´Â DirectoryIndex Áö½Ã¾î¿¡µµ + Àû¿ëµÈ´Ù. ¼³Á¤ÆÄÀÏÀÌ ´ÙÀ½°ú °°´Ù¸é,

    +

    DirectoryIndex index

    +

    index.html°ú index.html3ÀÌ + ¸ðµÎ ÀÖ´Ù¸é ¼­¹ö´Â ÀÌµÑ Áß¿¡ Çϳª¸¦ °áÁ¤ÇÑ´Ù. µÑ ¸ðµÎ ¾ø°í + index.cgi°¡ ÀÖ´Ù¸é, ¼­¹ö´Â ±×°ÍÀ» ½ÇÇàÇÑ´Ù.

    + +

    µð·ºÅ丮¸¦ ÀÐÀ»¶§ ÆÄÀÏÁß Çϳª°¡ Charset, Content-Type, + Language, Encoding¸¦ ÆÇ´ÜÇÏ´Â mod_mimeÀÌ ¸ð¸£´Â + È®ÀåÀÚ¸¦ °¡Áø´Ù¸é, °á°ú´Â MultiViewsMatch Áö½Ã¾î ¼³Á¤¿¡ + ´Þ·Ç´Ù. ÀÌ Áö½Ã¾î´Â Çڵ鷯, ÇÊÅÍ, ´Ù¸¥ È®ÀåÇüµéÀÌ MultiViews + Çù»ó¿¡ Âü¿©ÇÒÁö ¿©ºÎ¸¦ °áÁ¤ÇÑ´Ù.

    + +
    top
    +
    +

    Çù»ó¹æ¹ý

    + +

    ¾ÆÆÄÄ¡°¡ type-map ÆÄÀÏÀ̳ª µð·ºÅ丮¿¡ ÀÖ´Â ÆÄÀϸíµé·Î + ÁÖ¾îÁø ÀÚ¿ø¿¡ ´ëÇÑ º¯Çü ¸ñ·ÏÀ» ¾ò°ÔµÇ¸é 'ÃÖÀûÀÇ' º¯ÇüÀ» + °áÁ¤ÇϱâÀ§ÇØ µÎ ¹æ¹ýÁß Çϳª¸¦ »ç¿ëÇÑ´Ù. ¾ÆÆÄÄ¡ ³»¿ëÇù»ó + ±â´ÉÀ» »ç¿ëÇϱâÀ§ÇØ Á¤È®È÷ Çù»óÀÌ ¾î¶»°Ô ÀϾ´ÂÁö ÀÚ¼¼È÷ + ¾Ë ÇÊ¿ä´Â ¾ø´Ù. ±×·¯³ª ±Ã±ÝÇÑ »ç¶÷À» À§ÇØ ÀÌ ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.

    + +

    µÎ°¡Áö Çù»ó¹æ¹ýÀÌ ÀÖ´Ù:

    + +
      +
    1. ¾ÆÆÄÄ¡ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¿© ¼­¹ö°¡ ÁÖµµÇÏ´Â + Çù»óÀº ÀϹÝÀûÀÎ °æ¿ì¿¡ »ç¿ëÇÑ´Ù. ¾ÆÆÄÄ¡ ¾Ë°í¸®ÁòÀº + ¾Æ·¡¼­ ÀÚ¼¼È÷ ¼³¸íÇÑ´Ù. ÀÌ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¸é ¾ÆÆÄÄ¡´Â + ´õ ³ªÀº °á°ú¸¦ ¾ò±âÀ§ÇØ Á¾Á¾ ƯÁ¤ ¹üÀ§ÀÇ + ǰÁú°è¼ö(quality factor)¸¦ 'Á¶ÀÛÇÑ´Ù'. ¾ÆÆÄÄ¡°¡ ǰÁú°è¼ö¸¦ + Á¶ÀÛÇÏ´Â ¹æ¹ýÀº ¾Æ·¡¼­ ÀÚ¼¼È÷ ¼³¸íÇÑ´Ù.
    2. + +
    3. ÀÚ¿¬½º·¯¿î(Transparent) ³»¿ëÇù»óÀº + ºê¶ó¿ìÀú°¡ RFC 2295¿¡ Á¤ÀÇµÈ ¹æ¹ýÀ¸·Î ¿äûÇÒ °æ¿ì¿¡¸¸ + »ç¿ëÇÑ´Ù. ÀÌ Çù»ó¹æ¹ýÀº 'ÃÖÀûÀÇ' º¯ÇüÀ» °áÁ¤ÇÒ ±ÇÇÑÀ» + ºê¶ó¿ìÀú¿¡°Ô ºÎ¿©ÇÑ´Ù. ±×·¡¼­ °á°ú´Â ºê¶ó¿ìÀúÀÇ ¾Ë°í¸®Áò¿¡ + ´Þ·È´Ù. ÀÚ¿¬½º·¯¿î Çù»ó°úÁ¤Áß¿¡ ºê¶ó¿ìÀú´Â ¾ÆÆÄÄ¡¿¡°Ô + RFC 2296¿¡ Á¤ÀÇµÈ '¿ø°Ý º¯Çü¼±Åà ¾Ë°í¸®Áò(remote variant + selection algorithm)'À» ¿äûÇÒ ¼ö ÀÖ´Ù.
    4. +
    + +

    Çù»óÀÇ ¹üÀ§

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ¹üÀ§¼³¸í
    Media Typeºê¶ó¿ìÀú´Â Accept Çì´õ·Î ¼±È£¸¦ ³ªÅ¸³½´Ù. + °¢ Ç׸ñÀº ǰÁú°è¼ö¸¦ °¡Áú ¼ö ÀÖ´Ù. º¯ÇüÀÇ ¼³¸íµµ ǰÁú°è¼ö¸¦ + ("qs" ÆÄ¶ó¹ÌÅÍ) °¡Áú ¼ö ÀÖ´Ù.
    Languageºê¶ó¿ìÀú´Â Accept-Language Çì´õ·Î ¼±È£¸¦ + ³ªÅ¸³½´Ù. °¢ Ç׸ñÀº ǰÁú°è¼ö¸¦ °¡Áú ¼ö ÀÖ´Ù. º¯ÇüÀº + ¿©·¯ ¾ð¾î¸¦ °¡Áú (ȤÀº ¾Æ¹« ¾ð¾îµµ ¾øÀ») ¼ö ÀÖ´Ù.
    Encodingºê¶ó¿ìÀú´Â Accept-Encoding Çì´õ·Î ¼±È£¸¦ + ³ªÅ¸³½´Ù. °¢ Ç׸ñÀº ǰÁú°è¼ö¸¦ °¡Áú ¼ö ÀÖ´Ù.
    Charsetºê¶ó¿ìÀú´Â Accept-Charset Çì´õ·Î ¼±È£¸¦ + ³ªÅ¸³½´Ù. °¢ Ç׸ñÀº ǰÁú°è¼ö¸¦ °¡Áú ¼ö ÀÖ´Ù. º¯ÇüÀº + media typeÀÇ ÆÄ¶ó¹ÌÅÍ·Î ¹®ÀÚÁýÇÕÀ» ³ªÅ¸³¾ ¼ö ÀÖ´Ù.
    + + +

    ¾ÆÆÄÄ¡ Çù»ó ¾Ë°í¸®Áò

    + +

    ¾ÆÆÄÄ¡´Â ºê¶ó¿ìÀú¿¡°Ô º¸³¾ 'ÃÖÀûÀÇ' º¯ÇüÀ» (ÀÖ´Ù¸é) + ¼±ÅÃÇϱâÀ§ÇØ ¾Æ·¡ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÑ´Ù. ÀÌ ¾Ë°í¸®ÁòÀº º¯°æÇÒ + ¼ö ¾ø´Ù. ´ÙÀ½¿Í °°ÀÌ µ¿ÀÛÇÑ´Ù:

    + +
      +
    1. ¸ÕÀú, Çù»óÀÇ °¢ ¹üÀ§¿¡ ´ëÇØ ÇØ´çÇÏ´Â Accept* + Çì´õ¸¦ °Ë»çÇϰí, °¢ º¯Çü¿¡ ǰÁú°ªÀ» ¸Å±ä´Ù. ¾î¶² ¹üÀ§ÀÇ + Accept* Çì´õ°¡ ¹Þ¾ÆµéÀÌÁö ¾Ê´Â º¯ÇüÀº Èĺ¸¿¡¼­ + Á¦¿ÜÇÑ´Ù. ¾î¶² º¯Çüµµ ³²Áö¾ÊÀ¸¸é 4 ´Ü°è·Î °£´Ù.
    2. + +
    3. + Èĺ¸¿¡¼­ Çϳª¾¿ Á¦¿ÜÇÏ¿© 'ÃÖÀûÀÇ' º¯ÇüÀ» ã´Â´Ù. ´ÙÀ½ + °¢ °Ë»ç´Â ¼ø¼­´ë·Î ÀϾ´Ù. °¢ °Ë»ç¿¡¼­ ¼±ÅõÇÁö¾ÊÀº + º¯ÇüÀº Á¦¿ÜµÈ´Ù. °¢ °Ë»çÈÄ ÇÑ º¯Çü¸¸ ³²À¸¸é À̸¦ ÃÖÀûÀÇ + º¯ÇüÀ¸·Î ¼±ÅÃÇϰí 3 ´Ü°è·Î °£´Ù. ¿©·¯ º¯ÇüÀÌ ³²À¸¸é + ´ÙÀ½ °Ë»ç¸¦ ÁøÇàÇÑ´Ù. + +
        +
      1. Accept Çì´õÀÇ Ç°Áú°è¼ö¿Í º¯ÇüÀÇ + media type¿¡ ´ëÇÑ Ç°Áú°ªÀ» °öÇÏ¿© °¡Àå ³ôÀº °ªÀ» + °¡Áø º¯ÇüÀ» ¼±ÅÃÇÑ´Ù.
      2. + +
      3. °¡Àå ³ôÀº ¾ð¾î(language) ǰÁú°è¼ö¸¦ °¡Áø º¯ÇüÀ» + ¼±ÅÃÇÑ´Ù.
      4. + +
      5. Accept-Language Çì´õ¿¡ (ÀÖ´Ù¸é) + ³ª¿Â ¾ð¾îÀÇ ¼ø¼­ ȤÀº LanguagePriority + Áö½Ã¾î¿¡ (ÀÖ´Ù¸é) ³ª¿Â ¾ð¾îÀÇ ¼ø¼­¸¦ °¡Áö°í °¡Àå + ÀûÇÕÇÑ ¾ð¾î¸¦ °¡Áø º¯ÇüÀ» ¼±ÅÃÇÑ´Ù.
      6. + +
      7. °¡Àå ³ôÀº (text/html media typeÀÇ ¹öÀüÀ» ³ªÅ¸³»´Â) + 'level' media ÆÄ¶ó¹ÌÅ͸¦ °¡Áø º¯ÇüÀ» ¼±ÅÃÇÑ´Ù.
      8. + +
      9. Accept-Charset Çì´õ¸¦ °¡Áö°í °¡Àå + ÀûÇÕÇÑ charset media ÆÄ¶ó¹ÌÅ͸¦ °¡Áø º¯ÇüÀ» ã´Â´Ù. + Çì´õ°¡ ¾ø´Ù¸é ISO-8859-1 ¹®ÀÚÁýÇÕÀ» °¡Àå ¼±È£ÇÑ´Ù. + text/* media typeÀ» °¡ÁöÁö¸¸ ¸í½ÃÀûÀ¸·Î + ƯÁ¤ ¹®ÀÚÁýÇÕ°ú ¿¬°áµÇÁö¾ÊÀº º¯ÇüÀº ISO-8859-1·Î + °¡Á¤ÇÑ´Ù.
      10. + +
      11. ISO-8859-1ÀÌ ¾Æ´Ñ charset media ÆÄ¶ó¹ÌÅ͸¦ + °¡Áø º¯ÇüµéÀ» ¼±ÅÃÇÑ´Ù. ±×·± º¯ÇüÀÌ ¾ø´Ù¸é, ´ë½Å ¸ðµç + º¯ÇüÀ» ¼±ÅÃÇÑ´Ù.
      12. + +
      13. °¡Àå ÀûÇÕÇÑ ÀÎÄÚµùÀ» °¡Áø º¯ÇüÀ» ¼±ÅÃÇÑ´Ù. + user-agent¿¡ ÀûÇÕÇÑ ÀÎÄÚµùÀ» °¡Áø º¯ÇüÀÌ ÀÖ´Ù¸é ±× + º¯Çü¸¸À» ¼±ÅÃÇÑ´Ù. ±×·¸Áö¾Ê°í ÀÎÄÚµùµÈ º¯Çü°ú ÀÎÄÚµù¾ÈµÈ + º¯ÇüÀÌ °°ÀÌ ÀÖ´Ù¸é ÀÎÄÚµù¾ÈµÊ º¯Çü¸¸À» ¼±ÅÃÇÑ´Ù. º¯ÇüÀÌ + ¸ðµÎ ÀÎÄÚµùµÇ¾ú°Å³ª ¸ðµÎ ÀÎÄÚµù¾ÈµÈ °æ¿ì ¸ðµç º¯ÇüÀ» + ¼±ÅÃÇÑ´Ù.
      14. + +
      15. content length°¡ °¡Àå ÀûÀº º¯ÇüÀ» ¼±ÅÃÇÑ´Ù.
      16. + +
      17. ³²Àº °ÍÁß Ã¹¹øÀç º¯ÇüÀ» ¼±ÅÃÇÑ´Ù. ÀÌ´Â type-map + ÆÄÀÏÀÇ ¾Õ¿¡ ³ª¿Ô°Å³ª, µð·ºÅ丮¿¡¼­ º¯ÇüÀ» ÀÐÀº °æ¿ì + ÆÄÀϸíÀ» ASCII ÄÚµå ¼ø¼­·Î ÇÏ¿© ¾Õ¿¡ ³ª¿À´Â °ÍÀÌ´Ù.
      18. +
      +
    4. + +
    5. ÀÌÁ¦ ¾Ë°í¸®ÁòÀÌ 'ÃÖÀûÀÇ' º¯ÇüÀ» ¼±ÅÃÇß´Ù. À̰ÍÀ» ÀÀ´äÀ¸·Î + º¸³½´Ù. HTTP ÀÀ´ä Çì´õ Vary´Â Çù»óÀÇ ¹üÀ§¸¦ + ³ªÅ¸³»°Ô µÈ´Ù. (ºê¶ó¿ìÀú¿Í ij½¬´Â ÀÚ¿øÀ» ij½¬ÇÒ¶§ ÀÌ Á¤º¸¸¦ + »ç¿ëÇÒ ¼ö ÀÖ´Ù.) ³¡.
    6. + +
    7. ÀÌ ´Ü°è¿¡ µµ´ÞÇß´Ù¸é (¸ðµÎ ºê¶ó¿ìÀú°¡ ¹ÞÁö¸øÇϱ⠶§¹®¿¡) + ¾î¶² º¯Çüµµ ¼±ÅÃÀÌ ¾ÈµÈ °æ¿ì´Ù. ("No acceptable + representation"¸¦ ¶æÇÏ´Â) »óÅ 406°ú ³»¿ëÀ¸·Î »ç¿ë°¡´ÉÇÑ + º¯ÇüÀÇ ¸ñ·ÏÀ» ´ãÀº HTML ¹®¼­¸¦ ÀÀ´äÀ» º¸³½´Ù. ¶Ç, HTML + Vary Çì´õ´Â º¯ÇüÀÇ ¹üÀ§¸¦ ³ªÅ¸³½´Ù.
    8. +
    + +
    top
    +
    +

    ǰÁú°è¼ö Á¶ÀÛÇϱâ

    + +

    ¾ÆÆÄÄ¡´Â Á¾Á¾ À§ÀÇ ¾ÆÆÄÄ¡ Çù»ó ¾Ë°í¸®ÁòÀ» ¾ö°ÝÈ÷ ÁöŰÁö¾Ê°í + ǰÁú°è¼ö¸¦ º¯°æÇÑ´Ù. ÀÌÀ¯´Â ¿ÏÀüÇϰí Á¤È®ÇÑ Á¤º¸¸¦ º¸³»Áö¾Ê´Â + ºê¶ó¿ìÀú¿¡°Ô (¾Ë°í¸®ÁòÀÇ) ´õ ³ªÀº °á°ú¸¦ º¸³»±â À§Çؼ­´Ù. + ³Î¸® ¾²ÀÌ´Â ºê¶ó¿ìÀúÁß ÀϺδ ÀÚÁÖ À߸øµÈ º¯ÇüÀ» ¼±ÅÃÇϵµ·Ï + Accept Çì´õ¸¦ º¸³½´Ù. ºê¶ó¿ìÀú°¡ ¿ÏÀüÇÏ°í ¿Ã¹Ù¸¥ + Á¤º¸¸¦ º¸³½´Ù¸é, Á¶ÀÛÀ» ÇÏÁö¾Ê´Â´Ù.

    + +

    Media Type°ú ¿ÍÀϵåÄ«µå

    + +

    Accept: ¿äû Çì´õ´Â media type¿¡ ´ëÇÑ ¼±È£¸¦ + ³ªÅ¸³½´Ù. ¶Ç, *´Â ¾î¶² ¹®ÀÚ¿­ÀÌ¶óµµ °¡´ÉÇϱ⶧¹®¿¡ "image/*"³ª + "*/*" °°ÀÌ '¿ÍÀϵåÄ«µå' media typeÀ» »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ±×·¡¼­ + ´ÙÀ½°ú °°Àº ¿äûÀº:

    + +

    Accept: image/*, */*

    + +

    "image/"·Î ½ÃÀÛÇÏ´Â ¾î¶² type°ú ´Ù¸¥ ¾î¶² typeµµ °¡´ÉÇÔÀ» + ÀǹÌÇÑ´Ù. ¾î¶² ºê¶ó¿ìÀú´Â + ÀÚ½ÅÀÌ ½ÇÁ¦·Î ´Ù·ê ¼ö ÀÖ´Â type¿¡ Ãß°¡·Î ¿ÍÀϵåÄ«µå¸¦ º¸³½´Ù. + ¿¹¸¦ µé¸é:

    + +

    + Accept: text/html, text/plain, image/gif, image/jpeg, */* +

    +

    ÀÌÀ¯´Â Á÷Á¢ ¿­°ÅÇÑ typeÀ» ¼±È£ÇÏÁö¸¸ ´Ù¸¥ Ç¥ÇöÀÌ ÀÖ´Ù¸é + ±×°Íµµ ±¦ÂúÀ½À» ³ªÅ¸³»±â À§Çؼ­´Ù. ºê¶ó¿ìÀú°¡ ½ÇÁ¦·Î ¿øÇÑ + °ÍÀº ´ÙÀ½°ú °°ÀÌ ¸í½ÃÀûÀ¸·Î ǰÁú°ªÀ» »ç¿ëÇÑ °ÍÀÌ´Ù.

    +

    + Accept: text/html, text/plain, image/gif, image/jpeg, */*; q=0.01 +

    +

    Á÷Á¢ ¿­°ÅÇÑ typeÀº ǰÁú°è¼ö°¡ ¾ø¾î¼­ ±âº»°ªÀÎ (°¡Àå ³ôÀº) + 1.0À» °¡Áø´Ù. ¿ÍÀϵåÄ«µå */*´Â ³·Àº ¼±È£µµ 0.01À» °¡Áö¹Ç·Î + Á÷Á¢ ¿­°ÅÇÑ type¿¡ ¸Â´Â º¯ÇüÀÌ ¾ø´Â °æ¿ì¿¡¸¸ ´Ù¸¥ typeµéÀÌ + »ç¿ëµÈ´Ù.

    + +

    Accept: Çì´õ¿¡ q °è¼ö°¡ ÀüÇô ¾ø°í + "*/*"°¡ ÀÖ´Ù¸é, ¾ÆÆÄÄ¡´Â ¹Ù¶÷Á÷ÇÑ ÇൿÀ» À§ÇØ q °ªÀ¸·Î 0.01À» + ÁöÁ¤ÇÑ´Ù. ¶Ç, "type/*" ÇüÅÂÀÇ ¿ÍÀϵåÄ«µå¿¡´Â ("*/*"º¸´Ù´Â + ´õ ¼±È£Çϵµ·Ï) 0.02¸¦ ÁöÁ¤ÇÑ´Ù. Accept: Çì´õ¿¡¼­ + q °è¼ö¸¦ °¡Áö´Â media typeÀÌ ÀÖ´Ù¸é ÀÌ·± Ưº°ÇÑ °ªÀ» Ãß°¡ÇÏÁö + ¾Ê´Â´Ù. ±×·¡¼­ ¸í½ÃÀûÀÎ Á¤º¸¸¦ º¸³»´Â ºê¶ó¿ìÀúÀÇ + ¿äûÀº ¿äûÇѵ¥·Î ó¸®ÇÑ´Ù.

    + + +

    ¾ð¾î(language) Çù»óÀÇ ¿¹¿Ü

    + +

    ¾ÆÆÄÄ¡ 2.0Àº ¾ð¾î Çù»óÀÌ ½ÇÆÐÇÑ °æ¿ì ºÎµå·´°Ô º¹±¸ÇϱâÀ§ÇØ + Çù»ó ¾Ë°í¸®Áò¿¡ »õ·Î ¿¹¿Ü¸¦ ¸î°³ Ãß°¡Çß´Ù.

    + +

    Ŭ¶óÀÌ¾ðÆ®°¡ ¼­¹ö¿¡ ÆäÀÌÁö¸¦ ¿äûÇßÀ»¶§ ¼­¹ö°¡ ºê¶ó¿ìÀú°¡ + º¸³½ Accept-language¿¡ ¸Â´Â ÆäÀÌÁö¸¦ ´Ü ÇѰ³¸¸ + ãÀ¸¸é ¹®Á¦°¡ ¾øÁö¸¸, ±×·¯Áö ¾ÊÀº °æ¿ì ¼­¹ö´Â Ŭ¶óÀÌ¾ðÆ®¿¡°Ô + "No Acceptable Variant"³ª "Multiple Choices" ÀÀ´äÀ» º¸³½´Ù. + ÀÌ·± ¿À·ù¹®À» ÇÇÇϱâÀ§ÇØ ÀÌ °æ¿ì Accept-language¸¦ + ¹«½ÃÇϰí Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû¿¡ ¸íÈ®È÷ ¸ÂÁö´Â ¾ÊÁö¸¸ ¹®¼­¸¦ + º¸³»µµ·Ï ¾ÆÆÄÄ¡¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ForceLanguagePriority + Áö½Ã¾î´Â ¼­¹ö°¡ ÀÌ·± ¿À·ù¹®Áß Çϳª ȤÀº µÑ´Ù¸¦ ¹«½ÃÇϰí + LanguagePriority + Áö½Ã¾î·Î ÆÇ´ÜÇϵµ·Ï ÇÑ´Ù.

    + +

    ¶Ç, ¼­¹ö´Â ¸Â´Â ¾ð¾î¸¦ ¸øÃ£Àº °æ¿ì ºÎ¸ð¾ð¾î¸¦ ãÀ» ¼öµµ + ÀÖ´Ù. ¿¹¸¦ µé¾î Ŭ¶óÀÌ¾ðÆ®°¡ ¿µ±¹¿µ¾î¸¦ ¶æÇÏ´Â + en-GB ¾ð¾î·Î ¹®¼­¸¦ ¿äûÇÑ °æ¿ì, HTTP/1.1 Ç¥ÁØ¿¡ + µû¸£¸é ¼­¹ö´Â enÀ¸·Î¸¸ Ç¥½ÃµÈ ¹®¼­¸¦ ÀϹÝÀûÀ¸·Î + ¼±ÅÃÇÏÁö ¸øÇÑ´Ù. (±×·¡¼­ ¿µ±¹¿µ¾î¸¦ ÀÌÇØÇÏ´Â µ¶ÀÚ°¡ ÀϹÝÀûÀÎ + ¿µ¾îµµ ÀÌÇØÇÒ ¼ö ÀÖÀ¸¹Ç·Î Accept-Language Çì´õ¿¡ + en-GB¸¸ Æ÷ÇÔÇϰí enÀ» Æ÷ÇÔÇÏÁö¾ÊÀ¸¸é + °ÅÀÇ È®½ÇÈ÷ À߸øµÈ ¼³Á¤ÀÓÀ» À¯ÀÇÇ϶ó. ºÒÇàÈ÷µµ ÇöÀç ¸¹Àº + Ŭ¶óÀÌ¾ðÆ®µéÀº ÀÌ·± ½ÄÀ¸·Î ±âº»¼³Á¤µÇÀÖ´Ù.) ´Ù¸¥ ¾ð¾î¸¦ + ãÁö ¸øÇÏ¿© ¼­¹ö°¡ "No Acceptable Variants" ¿À·ù¸¦ º¸³»°Å³ª + LanguagePriority·Î + µ¹¾Æ°¡¾ß ÇÑ´Ù¸é, ¼­¹ö´Â ÇÏÀ§¾ð¾î ±Ô¾àÀ» ¹«½ÃÇϰí + en-GB¸¦ en ¹®¼­¿¡ ´ëÀÀÇÑ´Ù. + ¾Ï¹¬ÀûÀ¸·Î ¾ÆÆÄÄ¡´Â ºÎ¸ð¾ð¾î¸¦ ¸Å¿ì ³·Àº ǰÁú°ªÀ¸·Î + Ŭ¶óÀ̾ðÆ®ÀÇ Çã¿ë¾ð¾î ¸ñ·Ï¿¡ Ãß°¡ÇÑ´Ù. ±×·¯³ª Ŭ¶óÀÌ¾ðÆ®°¡ + "en-GB; q=0.9, fr; q=0.8"À» ¿äûÇÏ°í ¼­¹ö¿¡ "en"°ú "fr" + ¹®¼­°¡ ÀÖ´Ù¸é, "fr" ¹®¼­°¡ ¼±ÅõÊÀ» ÁÖÀÇÇ϶ó. ÀÌ´Â HTTP/1.1 + Ç¥ÁØÀ» Áö۰í, ¿Ã¹Ù·Î ¼³Á¤µÈ Ŭ¶óÀÌ¾ðÆ®¿Í È¿À²ÀûÀ¸·Î + µ¿ÀÛÇϱâÀ§ÇÔÀÌ´Ù.

    + +

    »ç¿ëÀÚ°¡ ¼±È£ÇÏ´Â ¾ð¾î¸¦ ¾Ë¾Æ³»±âÀ§ÇÑ (ÄíŰ³ª Ưº°ÇÑ + URL-°æ·Î °°Àº) °í±Þ ±â¹ýÀ» Áö¿øÇϱâÀ§ÇØ ¾ÆÆÄÄ¡ 2.0.47ºÎÅÍ + mod_negotiationÀº prefer-language¶ó´Â + ȯ°æº¯¼ö¸¦ ÀνÄÇÑ´Ù. ÀÌ È¯°æº¯¼ö°¡ + Á¸ÀçÇϰí ÀûÀýÇÑ ¾ð¾îű׸¦ Æ÷ÇÔÇÑ´Ù¸é, + mod_negotiationÀº ÇØ´çÇÏ´Â º¯ÇüÀ» ¼±ÅÃÇÏ·Á°í + ½ÃµµÇÑ´Ù. ±×·± º¯ÇüÀÌ ¾ø´Ù¸é ÀϹÝÀûÀÎ Çù»ó°úÁ¤À» ½ÃÀÛÇÑ´Ù.

    + +

    ¿¹Á¦

    + SetEnvIf Cookie "language=(.+)" prefer-language=$1 +

    + +
    top
    +
    +

    ÀÚ¿¬½º·¯¿î(transparent) ³»¿ëÇù»óÀÇ È®Àå

    + +

    ¾ÆÆÄÄ¡´Â ´ÙÀ½°ú °°ÀÌ ÀÚ¿¬½º·¯¿î ³»¿ëÈ®Àå ÇÁ·ÎÅäÄÝÀ» (RFC 2295) +È®ÀåÇÑ´Ù. º¯Çü ¸ñ·ÏÀÇ »õ·Î¿î {encoding ..}´Â ƯÁ¤ +content-encodingÀ» °¡Áø º¯Çü¸¸À» ÁöĪÇÑ´Ù. RVSA/1.0 ¾Ë°í¸®ÁòÀº +(RFC 2296) ¸ñ·Ï¿¡¼­ ÀÎÄÚµùµÈ º¯ÇüÀ» ÀνÄÇÒ ¼ö ÀÖ°í, ÀÎÄÚµùÀÌ +Accept-Encoding ¿äû Çì´õ¿¡ ¸Â´Â °æ¿ì ÀÎÄÚµùµÈ +º¯Çüµéµµ È帷Π»ç¿ëÇϵµ·Ï È®ÀåµÇ¾ú´Ù. RVSA/1.0 ±¸ÇöÀº ÃÖÀûÀÇ +º¯ÇüÀ» ã±â Àü¿¡ °è»êµÈ ǰÁú°è¼ö¸¦ ¼Ò¼öÁ¡ 5ÀÚ¸®¿¡¼­ ¹Ý¿Ã¸²ÇÏÁö +¾Ê´Â´Ù.

    +
    top
    +
    +

    ÇÏÀÌÆÛ¸µÅ©¿Í À̸§±ÔÄ¢¿¡ ´ëÇÏ¿©

    + +

    ¾ð¾î(language) Çù»óÀ» »ç¿ëÇÑ´Ù¸é ÆÄÀÏÀº ¿©·¯ È®ÀåÀÚ¸¦ + °¡Áö°í È®ÀåÀÚÀÇ ¼ø¼­´Â º¸Åë °ü°è¾øÀ¸¹Ç·Î ÆÄÀÏ¸í¿¡ ¿©·¯ ´Ù¸¥ + À̸§±ÔÄ¢À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. (ÀÚ¼¼ÇÑ ³»¿ëÀº mod_mime ¹®¼­¸¦ + Âü°íÇ϶ó.)

    + +

    ÀüÇüÀûÀÎ ÆÄÀÏÀº MIME-type È®ÀåÀÚ (¿¹¸¦ µé¾î, + html), °æ¿ì¿¡ µû¶ó encoding È®ÀåÀÚ (¿¹¸¦ + µé¾î, gz), ÆÄÀÏ¿¡ ¿©·¯ ¾ð¾î º¯ÇüÀÌ ÀÖ´Â + °æ¿ì ¹°·Ð ¾ð¾î È®ÀåÀÚ¸¦ (¿¹¸¦ µé¾î, en) + °¡Áø´Ù.

    + +

    ¿¹Á¦:

    + +
      +
    • foo.en.html
    • + +
    • foo.html.en
    • + +
    • foo.en.html.gz
    • +
    + +

    ´ÙÀ½Àº ¸î¸î ÆÄÀϸí°ú ±× ÆÄÀÏ¿¡ ´ëÇÑ À¯È¿Çϰí À¯È¿ÇÏÁö¾ÊÀº + ÇÏÀÌÆÛ¸µÅ©¸¦ º¸ÀδÙ:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ÆÄÀϸíÀ¯È¿ÇÑ ÇÏÀÌÆÛ¸µÅ©À¯È¿ÇÏÁö¾ÊÀº ÇÏÀÌÆÛ¸µÅ©
    foo.html.enfoo
    + foo.html
    -
    foo.en.htmlfoofoo.html
    foo.html.en.gzfoo
    + foo.html
    foo.gz
    + foo.html.gz
    foo.en.html.gzfoofoo.html
    + foo.html.gz
    + foo.gz
    foo.gz.html.enfoo
    + foo.gz
    + foo.gz.html
    foo.html
    foo.html.gz.enfoo
    + foo.html
    + foo.html.gz
    foo.gz
    + +

    À§ Ç¥¸¦ º¸¸é ÇÏÀÌÆÛ¸µÅ©¿¡ ¾î¶² È®ÀåÀÚµµ ¾ø´Â À̸§À» + (¿¹¸¦ µé¾î, foo) Ç×»ó »ç¿ëÇÒ ¼ö ÀÖÀ½À» + ¾Ë ¼ö ÀÖ´Ù. ÀÌ °æ¿ì ÀåÁ¡Àº ¹®¼­ÀÇ ½ÇÁ¦ Á¾·ù¸¦ ¼û±æ ¼ö À־, + ¿¹¸¦ µé¾î ÇÏÀÌ·¯¸µÅ© ÂüÁ¶¸¦ ¼öÁ¤ÇϾʰí + html ÆÄÀÏÀ» shtmlÀ̳ª + cgi·Î º¯°æÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù.

    + +

    °è¼Ó ÇÏÀÌÆÛ¸µÅ©¿¡ MIME-typeÀ» (¿¹¸¦ µé¾î, + foo.html) »ç¿ëÇÏ°í ½Í´Ù¸é (encoding È®ÀåÀÚ°¡ + ÀÖ´Ù¸é À̰͵µ Æ÷ÇÔÇÏ¿©) ¾ð¾î È®ÀåÀÚ¸¦ MIME-type È®ÀåÀÚº¸´Ù + ¿À¸¥ÂÊ¿¡ (¿¹¸¦ µé¾î, foo.html.en) + µÎ¾î¾ßÇÑ´Ù.

    +
    top
    +
    +

    ij½¬¿¡ ´ëÇÏ¿©

    + +

    ij½¬°¡ Ç¥ÇöÀ» ÀúÀåÇϸé Ç¥Çö°ú ¿äû URLÀ» ¿¬°ü½ÃŲ´Ù. + ´ÙÀ½¹ø ±× URLÀ» ¿äûÇϸé ij½¬´Â ÀúÀåµÈ Ç¥ÇöÀ» »ç¿ëÇÑ´Ù. + ±×·¯³ª ¼­¹ö¿Í Çù»óÀÌ °¡´ÉÇÑ ÀÚ¿øÀÎ °æ¿ì ù¹øÂ° ¿äûÇÑ º¯Çü¸¸ + ij½¬µÇ¾î ÀÌÈÄ ¿äûÀº ij½¬µÈ À߸øµÈ ÀÀ´äÀ» ¾òÀ» ¼ö ÀÖ´Ù. + À̸¦ ¸·±âÀ§ÇØ ¾ÆÆÄÄ¡´Â º¸Åë ³»¿ëÇù»óÈÄ ¹ÝȯµÇ´Â ¸ðµç ¿äû¿¡ + HTTP/1.0 Ŭ¶óÀÌ¾ðÆ®°¡ ij½¬¸¦ ¸øÇϵµ·Ï Ç¥½Ã¸¦ ÇÑ´Ù. ¶Ç, ¾ÆÆÄÄ¡´Â + Çù»óÇÑ ÀÀ´äÀÇ Ä³½¬¸¦ Çã¿ëÇÏ´Â HTTP/1.1 ÇÁ·ÎÅäÄÝÀÇ ±â´ÉÀ» + Áö¿øÇÑ´Ù.

    + +

    CacheNegotiatedDocs + Áö½Ã¾î´Â HTTP/1.0 ȣȯ Ŭ¶óÀ̾ðÆ®(ºê¶ó¿ìÀú ȤÀº ij½¬)°¡ + º¸³½ ¿äû¿¡ ´ëÇØ Çù»óÇÑ ÀÀ´äÀ» ij½¬ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù. ÀÌ Áö½Ã¾î´Â + ¼­¹ö³ª °¡»óÈ£½ºÆ® ¼³Á¤¿¡ »ç¿ëÇϸç, ¾Æ±Ô¸ÕÆ®¸¦ ¹ÞÁö¾Ê´Â´Ù. + ÀÌ Áö½Ã¾î´Â HTTP/1.1 Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû°ú´Â °ü°è°¡ ¾ø´Ù.

    + +

    HTTP/1.1 Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ¾ÆÆÄÄ¡´Â ÀÀ´äÀÇ Çù»ó ¹üÀ§¸¦ + ¾Ë·ÁÁÖ´Â Vary HTTP ÀÀ´äÇì´õ¸¦ º¸³½´Ù. ÀÌ Á¤º¸¸¦ + »ç¿ëÇÏ¿© ´ÙÀ½ ¿äûÀ» ij½¬µÈ º¹»çº»À¸·Î ´ëüÇÒ ¼ö ÀÖ´ÂÁö + ÆÇ´ÜÇÒ ¼ö ÀÖ´Ù. Çé»óÀÇ ¹üÀ§¿Í °ü°è¾øÀÌ Ä³½¬µÈ º¹»çº»À» + ±ÇÇÑ´Ù¸é force-no-vary ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù.

    + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/content-negotiation.html.tr.utf8 b/docs/manual/content-negotiation.html.tr.utf8 new file mode 100644 index 0000000..dd4cfe5 --- /dev/null +++ b/docs/manual/content-negotiation.html.tr.utf8 @@ -0,0 +1,680 @@ + + + + + +İçerik Uzlaşımı - Apache HTTP Sunucusu Sürüm 2.4 + + + + + + + +
    <-
    +

    İçerik Uzlaşımı

    +
    +

    Mevcut Diller:  en  | + fr  | + ja  | + ko  | + tr 

    +
    + + +

    Apache HTTPD, içerik uzlaşımını HTTP/1.1 belirtiminde bahsedildiği şekliyle + destekler. Bir özkaynağın en iyi gösterimini, tarayıcının sağladığı + karakter kodlaması, karakter kümesi, dil, ortam türü gibi kullanıcı + tercihlerine bağlı olarak seçebilir. Ayrıca, tarayıcının kullanıcı + tercihlerini tam yansıtamadığı durumlarda istekleri daha akıllıca ele + alabilmeyi sağlayacak bir takım özelliklere de sahiptir.

    + +

    İçerik uzlaşımı öntanımlı olarak derlenen + mod_negotiation modülü tarafından sağlanır.

    +
    + +
    top
    +
    +

    İçerik Uzlaşımı Hakkında

    + +

    Bir özkaynağın bir çok farklı gösterimi olabilir. Örneğin, bir belgenin + farklı ortam türleri ve/veya farklı diller için gösterimleri olabilir. + En uygun seçimi yapmanın tek yolu kullanıcıya bir liste verip seçmesini + istemektir. Bununla birlikte sunucunun bu seçimi kendiliğinden yapması + da mümkündür. Tarayıcılar isteğin bir parçası olarak kullanıcı + tercihlerini de gönderdiğinden bu istendiği gibi çalışır. Örneğin bir + tarayıcı, kullanıcısınının mümkünse Fransızca içerik tercih ettiğini + yoksa İngilizce içeriğe de razı olabileceğini belirtebilirdi. + Tarayıcılar bu tercihleri başlıkta belirtirler. Tarayıcı sadece Türkçe + içerik istendiğini şöyle belirtebilirdi:

    + +

    Accept-Language: tr

    + +

    Bu tercihin yerine getirilebilmesininin sadece, desteklenen diller + arasında bu dilin varlığına ve istenen belgenin bu dilde bir + gösteriminin bulunmasına bağlı oluşuna dikkat ediniz.

    + +

    Daha karmaşık bir istek örneği olarak, tarayıcının Fransızca ve + İngilizce içerik kabul etmeye ayarlandığını fakat Fransızcayı tercih + ettiğini ve çeşitli ortam türlerini kabul etmekle birlikte salt metin ve + diğer metin türlerinden ziyade HTML tercih ettiğini, ayrıca, diğer ortam + türleri üzerinde GIF veya JPEG tercih ettiğini fakat başka çare yoksa + her ortam türüne de izin verdiğini belirtiyor olsun:

    + +

    + Accept-Language: fr; q=1.0, en; q=0.5
    + Accept: text/html; q=1.0, text/*; q=0.8, image/gif; q=0.6, image/jpeg; + q=0.6, image/*; q=0.5, */*; q=0.1 +

    + +

    httpd, HTTP/1.1 belirtiminde tanımlanan şekliyle ‘sunucu yönetiminde’ + içerik uzlaşımını destekler. Accept, + Accept-Language, Accept-Charset ve + Accept-Encoding istek başlıklarını tamamen destekler. + httpd ayrıca, RFC 2295 ve RFC 2296’da tanımlanan bir deneysel uzlaşım + olarak ‘şeffaf’ içerik uzlaşımını da destekler. Fakat ‘özellik + uzlaşımını’ bu RFC’lerde tanımlandığı gibi desteklemez.

    + +

    Bir özkaynak bir URI (RFC 2396) tarafından betimlenen + kavramsal bir öğedir. Apache gibi bir HTTP sunucusu, ortam türü, + karakter kümesi, kodlama ve saire ile tanımlanmış bir bayt dizisi + şeklindeki her gösterimiyle, özkaynaklara kendi isim alanları dahilinde + erişim sağlar. Her özkaynağın aynı anda bir veya daha fazla gösterimi + mevcut olabileceği gibi hiç mevcut olmayabilir de. Eğer çok sayıda + gösterim mevcutsa, bu özkaynağın uzlaşılabilir + olduğundan ve her gösteriminin bir çeşitlilik + oluşturduğundan bunun da uzlaşımın boyutlarından + kaynaklandığından bahsedilebilir.

    +
    top
    +
    +

    httpd’de İçerik Uzlaşımı

    + +

    Bir özkaynak üzerinde uzlaşılırken gösterim çeşitlerinin her biri + hakkında sunucuya bilgi verilmesi gerekir. Bu iki yolla yapılabilir:

    + +
      +
    • Ya gösterim çeÅŸitlerini içeren dosyaların isimleriyle eÅŸleÅŸmeyi + saÄŸlayan bir tür eÅŸlemi kullanılır (bir *.var dosyası + gibi).
    • + +
    • Ya da sunucu örtük bir dosya ismi kalıbı eÅŸleÅŸmesinin ardından + sonuçlar arasından seçim yapar; buna ‘Çoklu Görünüm’ araması adı + verilir.
    • +
    + +

    Bir türeşlem dosyası kullanmak

    + +

    Bir türeşlem dosyası, type-map eylemcisi ile ilişkili bir + belgedir (ya da eski httpd yapılandırmaları ile geriye uyumluluk için, + application/x-type-map MIME türünde + bir belgedir). Bu özelliği kullanmak için, yapılandırmada bir tür + eşleyici olarak her dosya ismi uzantısı için bir type-map + eylemcisi tanımlamalısınız. Bu, sunucu yapılandırma dosyasında en iyi + şöyle yapılabilir:

    + +
    AddHandler type-map .var
    + + +

    Türeşlem dosyaları kendilerini tanımlayan özkaynak ile aynı isimde + olmalı ve isim bir .var uzantısı içermelidir. Aşağıdaki + örneklerde özkaynak ismi foo olduğundan türeşlem dosyasının + ismi foo.var'dır.

    + +

    Bu dosya her gösterim çeşidi için bir girdi içermelidir; bu girdiler + ardarda belirtilen HTTP biçem başlık satırlarından oluşur. Farklı + gösterimlerin girdileri bir boş satırla diğerlerinden ayrılır. Aynı + girdi içinde boş satır kullanılamaz. Bir eşlem dosyasını bir birleşik + öğenin tamamı için bir girdi ile başlatmak adet olmuştur (ise de, bu + gerekli değildir, hele yoksayılacaksa hiç gerekli değildir). Eşlem + dosyası için aşağıda bir örnek verilmiştir.

    + +

    Bu dosyadaki URI'ler türeşlem dosyasının yerine görelidir. Dolayısıyla, + bu dosyaların aynı dizinde bulunması beklenirse de bu gerekli değildir. + Aynı sunucuda bulunan tüm dosyalar için türeşlem dosyasındaki gibi mutlak + veya göreli URI'ler belirtebilirsiniz.

    + +

    + URI: misal
    +
    + URI: misal.en.html
    + Content-type: text/html
    + Content-language: en
    +
    + URI: misal.fr.de.html
    + Content-type: text/html;charset=iso-8859-2
    + Content-language: fr, de
    +

    + +

    Ayrıca, MultiViews etkin olsa bile bir türeşlem dosyasının + dosya ismi uzantılarının taranmasına göre öncelik alacağına dikkat + ediniz. Eğer gösterimler bu örnekteki resim dosyasında olduğu gibi + farklı kaynak üstünlüklerine sahipseler, ortam türünün qs + parametresi kullanılarak kaynak üstünlükleri belirtilebilir:

    + +

    + URI: misal
    +
    + URI: misal.jpeg
    + Content-type: image/jpeg; qs=0.8
    +
    + URI: misal.gif
    + Content-type: image/gif; qs=0.5
    +
    + URI: misal.txt
    + Content-type: text/plain; qs=0.01
    +

    + +

    qs değerleri 0.000-1.000 değer aralığı içinde + belirtilebilir. 0.000 qs değerine sahip gösterimin asla + seçilmeyeceğine dikkat ediniz. Bir qs değeri belirtilmeyen + gösterimlerin kaynak üstünlüğü 1.000 kabul edilir. qs + parametresinin belirttiği değer istemcinin yeteneklerinden bağımsız + olarak olası gösterimler arasında göreli bir üstünlük ifade eder. + Örneğin bir fotoğraf sözkonusu olduğunda bir JPEG dosyasının kaynak + üstünlüğü bir ASCII çiziminkinden yüksek olacaktır. Diğer taraftan özgün + resim bir ASCII çizim olduğu takdirde, ASCII çizim, bir JPEG gösterimine + göre öncelikli olacaktır. Bu nedenle qs değeri özkaynağın + doğasına bakarak belirlenir.

    + +

    Tanınan başlıkların tam listesini mod_negotiation modülünün + belgesinde bulabilirsiniz.

    + + +

    Çoklu Görünümler

    + +

    MultiViews, httpd.conf dosyasındaki veya + (AllowOverride yönergesinin + değerine bağlı olarak) .htaccess dosyalarındaki <Directory>, <Location> veya <Files> bölümleri içinde + Options yönergeleri ile + belirtilebilen, dizine özgü bir seçenektir. Yalnız, dikkatli olun, + Options All yaparak MultiViews seçeneğini + etkin kılamazsınız; seçeneği ismiyle açıkça belirtmelisiniz.

    + +

    MultiViews şöyle etki eder: Sunucudan, + MultiViews seçeneğinin etkin olduğu /bir/dizin + dizininden filanca dosyası için bir istekte bulunulmuşsa + fakat dizinde bu dosya yoksa, sunucu dizin içeriğini + filanca.* dosyaları için tarar ve bu dosyalar için + istemcinin ismiyle talep ettiği ortam türlerini ve kodlamaları + kullanarak bir türeşlem dosyası uydurup bu gösterimler arasından + istemcinin gereksinimlerine en uygun gösterimi seçer.

    + +

    MultiViews ayrıca, sunucunun bir dizin içeriğini + listelemeye çalıştığı durumda DirectoryIndex yönergesi ile belirtilen dosya için de bir + arama tertipleyebilir. Eğer yapılandırma dosyalarında

    + +
    DirectoryIndex index
    + + +

    şeklinde bir atama varsa ve dizinde index.html ve + index.html3 dosyaları varsa sunucu bunlar arasından hakem + sıfatıyla bir seçim yapacaktır; ama bu ikisi yerine dizinde sadece + index.cgi mevcutsa sunucu sadece bu dosyayı + çalıştıracaktır.

    + +

    Okunan dizinde bulunan dosyalar arasında mod_mime + tarafından tanınan karakter kümesi, içerik türü, dil ve kodlama + başlıklarına uygun gösterim uzantılarından birine sahip bir dosya yoksa + sonuç MultiViewsMatch + yönergesiyle yapılan tanıma bağlı olur. Bu yönerge hangi diğer dosya + uzantılarının, eylemcilerin veya süzgeçlerin çok gösterimli uzlaşımla + ilintileneceğini belirler.

    + +
    top
    +
    +

    Uzlaşım Yöntemleri

    + +

    httpd’nin, bir türeşlem dosyası veya dizin içindeki bir dosya + sayesinde belli bir özkaynağın gösterim çeşitlerinin bir listesini elde + ettikten sonra ‘en uygun’ gösterime karar vermek için kullanabileceği + iki yöntem vardır. httpd’nin içerik uzlaşım özelliklerinin kullanımı + sırasında uzlaşımın nasıl yerine getirileceği ile ilgili ayrıntıları + bilmek aslında gerekli değildir. Bununla birlikte belgenin kalanında bu + konu açıklanmaya çalışılmıştır.

    + +

    İki uzlaşım yöntemi vardır:

    + +
      +
    1. Normal durumda sunucu yönetiminde httpd uzlaşım + algoritması kullanılır. Bu algoritma aşağıda ayrıntılı olarak + açıklanmıştır. Bu algoritma kullanıldığı zaman, httpd, en iyi sonuca + ulaşmak için bazen belli boyutların üstünlük katsayılarıyla ‘oynar’. + httpd’nin bu katsayılarla oynama işini nasıl yaptığı aşağıda daha + ayrıntılı açıklanmıştır.
    2. + +
    3. İstemci bu işlem için özellikle RFC 2295’te tanımlanan mekanizmanın + kullanılmasını isterse şeffaf içerik uzlaşımı + kullanılır. Bu uzlaşım yöntemi, en uygun gösterimin seçilmesi + konusunda tarayıcıya tam denetim imkanı verir; dolayısıyla sonuç + tarayıcının bu işlem için kullandığı algoritmanın başarısına bağlıdır. + Şeffaf uzlaşım sürecinin bir parçası olarak, tarayıcı, RFC 2296’da + tanımlanan ‘gösterim çeşidini uzaktan seçme algoritması’nın + çalıştırılmasını httpd’den isteyebilir.
    4. +
    + +

    Uzlaşımın Boyutları

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    BoyutAçıklama
    Ortam TürüTarayıcı ortam türü tercihlerini Accept başlık alanı + ile belirtir. Her öğenin kendine özgü bir üstünlük katsayısı + olabilir. Gösterimin açıklaması da ayrıca bir kaynak üstünlüğüne + (qs parametresi) sahip olabilir.
    DilTarayıcı dil tercihlerini Accept-Language başlık + alanı ile belirtir. Her öğenin kendine özgü bir üstünlük katsayısı + olabilir. Gösterimler bir kaç dilde olabileceği gibi hiç bir dille + ilişkilendirimemiş de olabilir.
    KodlamaTarayıcı kodlama tercihlerini Accept-Encoding başlık + alanı ile belirtir. Her öğenin kendine özgü bir üstünlük katsayısı + olabilir.
    Karakter KümesiTarayıcı karakter kümesi tercihlerini Accept-Charset + başlık alanı ile belirtir. Her öğenin kendine özgü bir üstünlük + katsayısı olabilir. Gösterim çeşitleri karakter kümesini ortam + türünün bir parametresi olarak belirtebilirler.
    + + +

    httpd Uzlaşım Algoritması

    + +

    httpd, tarayıcıya döndürülecek en uygun gösterim çeşidini (varsa) + seçmek için aşağıdaki algoritmayı kullanabilir. Bu algoritma pek de + yapılandırılabilir değildir. Şöyle çalışır:

    + +
      +
    1. Önce her uzlaşım boyutu için ilgili Accept* başlık alanına + bakılıp her gösterim çeşidine bir üstünlük katsayısı atanır. Eğer + boyutlardan bazıları için ilgili Accept* başlığı + uygulanabilir değilse bu boyut elenir ve sonuçta hiçbir gösterim + çeşidi kalmasza 4. adıma atlanır.
    2. + +
    3. ‘En uygun’ gösterim çeşidi bir eleme süreciyle seçilir. Bu süreç + sırasında aşağıdaki sınamalar sırayla uygulanır. Sınamalardan + geçemeyen bir gösterim çeşidi elenir. Sınamaların bir aşamasında tek + bir gösterim çeşidi kalırsa bu en uygun eşleşme olarak seçilmiş olur + ve 3. adıma atlanır. Eğer birden fazla gösterim çeşidi kalırsa sonraki + sınamaya geçilir. + +
        +
      1. Accept başlığındaki üstünlük katsayısı ile + gösterimin ortam türünde belirtilen kaynak üstünlüğünün çarpımı en + büyük olan gösterim çeşidi seçilir.
      2. + +
      3. En yüksek dil üstünlük katsayısına sahip gösterim çeşidi seçilir. +
      4. + +
      5. En uygun dil eşleşmesine sahip gösterim çeşidini seçmek için + önce varsa Accept-Language başlığındaki dil + sıralamasına bakılır, aksi takdirde LanguagePriority + yönergesi ile atanmışsa oradaki dil sıralamasına bakılır.
      6. + +
      7. En yüksek ‘seviyeden’ ortam parametresine (text/html ortam türü + sürümünü belirtmekte kullanılır) sahip gösterim çeşitleri + seçilir.
      8. + +
      9. Accept-Charset başlık satırında belirtilene bakarak + en uygun karakter kümesine sahip gösterim çeşitleri seçilir. + Alenen dışlanmadıkça ISO-8859-1 kabul edilebilir karakter + kümesidir. text/* ortam türüne sahip gösterim + çeşitlerinden belli bir karakter kümesi ile ilişkilendirilmemiş + olanların karakter kümesinin ISO-8859-1 olduğu varsayılır.
      10. + +
      11. ISO-8859-1 karakter kümesi ile ilişkilendirilmemiş gösterim + çeşitleri seçilir. Böyle hiçbir gösterim yoksa bütün gösterimler + seçilir.
      12. + +
      13. En uygun kodlamaya sahip gösterim çeşitleri seçilir. Tarayıcı + tarafından kabul edilebilir kodlamaya sahip gösterim çeşitleri + varsa bunlar seçilir. Yoksa kodlanmış ve kodlanmamış gösterim + çeşitleri karışık olarak mevcutsa sadece kodlanmamış olanlar + seçilir. Eğer bütün gösterim çeşitlerinin sadece kodlanmış ya da + sadece kodlanmamış gösterimleri mevcutsa hepsi seçilir.
      14. + +
      15. En küçük içerik uzunluğuna sahip gösterim çeşitleri seçilir.
      16. + +
      17. Kalan gösterim çeşitlerinin ilki seçilir. Bu ilk, ya türeşlem + dosyasında listelenen ilk çeşittir ya da gösterimler bir dizinden + okunuyorsa ASCII kod sıralamasına göre ilk sıradaki dosya ismine + sahip gösterimdir.
      18. +
      +
    4. + +
    5. Algoritma, artık seçilmiş en uygun gösterim çeşidine sahipse bu + artık yanıt olarak döndürülebilir. HTTP yanıt başlığı + Vary’ye uzlaşım boyutları atanır (tarayıcı ve + arabellekler özkaynağı kaydederken bu bilgiyi kullanırlar) + ve algoritma sonlandırılır.
    6. + +
    7. Buraya gelinmişse hiçbir gösterim seçilmemiş demektir (hiçbiri + tarayıcı tarafından kabul edilebilir bulunmadığından dolayı). + Gövdesinde mevcut gösterim çeşitlerini listeleyen bir HTML belgesi 406 + durum koduyla döndürülür (406: ‘kabul edilebilir bir gösterim yok’). + Ayrıca HTTP Vary başlığında gösterim çeşitliliğinin + boyutları belirtilir.
    8. +
    + +
    top
    +
    +

    Üstünlük Değerleriyle Oynamak

    + +

    httpd bazen yukarıdaki httpd uzlaşım algoritmasının kesin sonucunun + beklenenden farklı olması için üstünlük değerleriyle oynar. Bunu tam ve + doğru bilgi göndermeyen tarayıcılar için algoritmadan en iyi sonucu elde + etmek amacıyla yapar. Bazen günümüzün en tanınmış tarayıcıları bile çoğu + durumda yanlış bir seçimle sonuçlanmayacaksa Accept başlık + bilgilerini göndermemektedir. Eğer tarayıcı eksiksiz ve doğru bilgi + gönderirse httpd bu değerlerle oynamayacaktır.

    + +

    Ortam Türleri ve Dosyaismi Kalıpları

    + +

    Accept: istek başlığı ortam türü tercihlerini yansıtır. + Ayrıca, * bir dizge ile eşleşmek üzere "image/*" veya "*/*" gibi ortam + türü kalıpları da içerebilir. Dolayısıyla şöyle bir istek,

    + +

    Accept: image/*, */*

    + +

    diğer türler gibi "image/" ile başlayan ortam türlerini kabul + edilebilir kılacaktır. Bazı tarayıcılar ortam türlerini örtük olarak + elde etmek amacıyla hep bu tür kalıplar gönderirler. Örnek:

    + +

    + Accept: text/html, text/plain, image/gif, image/jpeg, */* +

    + +

    Bunun amacı, açıkça listelenmiş türlerin tercih edildiğini, fakat + farklı gösterimler varsa onların da kabul edilebileceğini belirtmektir. + Üstünlük değerlerini doğrudan kullanarak tarayıcılar gerçekte ne + istediklerini şuna benzer şekilde belirtebilirler:

    + +

    + Accept: text/html, text/plain, image/gif, image/jpeg, */*; q=0.01 +

    + +

    Açıkça belirtilen türler için üstünlük katsayısı belirtilmemiştir, + dolayısıyla üstünlük katsayılarının 1.0 (en yüksek) olduğu + varsayılmaktadır. */* kalıbı 0.01 gibi çok daha düşük bir öncelik + belirtmektedir. Bu bakımdan, ancak, açıkça belirtilen türlerden + hiçbirinin bulunmaması halinde diğer türler eşleşecektir.

    + +

    Eğer Accept: başlığı hiçbir q + katsayısı içermiyorsa ve başlıkta "*/*" belirtilmişse, httpd istenen + davranışı taklit etmek için bu kalıba 0.01 katsayısını atar. Keza + "type/*" kalıbına da 0.02 katsayısını atar (yani, */* kalıbına göre + tercihli olur). Eğer Accept: alanındaki her ortam türü bir + q katsayısı içeriyorsa bu özel değerler uygulanmaz. + Dolayısıyla gerekli bilgiyi açıkça bildiren tarayıcılardan gelen + istekler umulduğu gibi işlem görecektir.

    + + +

    Dil Uzlaşımında İstisnalar

    + +

    httpd 2.0’dan itibaren, uzlaşım algoritmasına, bir eşleşme bulmak + konusunda algoritma başarılı olamadığı takdirde hoş bir son çareye izin + vermek için bazı istisnalar eklenmiştir.

    + +

    İstemci sunucudan bir sayfa istediğinde, sunucu, tarayıcı tarafından + gönderilen Accept-language başlığıyla eşleşen tek bir sayfa + bulamadığı takdirde istemciye ya “Kabul edilebilir bir gösterim çeşidi + yok†ya da “Çok sayıda seçim belirtilmiş†yanıtını döndürür. Bu hata + iletilerinden kaçınmak için bu gibi durumlarda httpd + Accept-language başlığını yoksaymaya ayarlanabilir. Böylece + istemcinin isteğine tam olarak uymasa da bir belge sağlanır. Bu hata + iletilerinin birini veya her ikisini de geçersiz kılmak için ForceLanguagePriority yönergesi + kullanılabilir ve sunucunun kararını LanguagePriority yönergesine + dayanarak vermesi sağlanabilir.

    + +

    Sunucu ayrıca, tam bir eşleşme bulunmadığı zaman lehçelerle de eşleşme + arayabilir. Örneğin, bir istemci Britanya İngilizcesi + (en-GB) ile yazılmış belgeler için istekte bulunursa, + sunucu normalde HTTP/1.1 standardına göre bir belgenin basitçe + en olarak imlenmesine izin vermez. (Bir okuyucu Britanya + İngilizcesini anlıyor ama genel İngilizceyi anlamıyor diye + Accept-Language başlığında en değil de + en-GB’yi belirtmesinin hemen hemen daima bir yapılandırma + hatasına yol açacağına dikkat ediniz. Maalesef, mevcut istemcilerin çoğu + öntanımlı yapılandırmalarında buna benzer şeyler yapmaktadır.) Bununla + birlikte, başka bir dille eşleşme mümkün değilse ve sunucu “Kabul + edilebilir bir gösterim çeşidi yok†hatasını döndürmeye hazırsa veya + LanguagePriority son + çaresine ayarlanmışsa alt küme belirtimini yok sayacak ve + en belge isteklerine en-GB belgelerle yanıt + verecektir. httpd, lehçenin üyesi olduğu anadili, istemcinin kabul + edilebilir diller listesine örtük olarak düşük bir üstünlük değeri ile + ekler. Yalnız şuna dikkat edin, eğer istemci tercihini "en-GB; q=0.9, + fr; q=0.8" olarak belirtirse ve sunucuda sadece "en" ve "fr" belgeleri + varsa sunucu "fr" belge ile yanıt verecektir. HTTP/1.1 belirtimi ile + uyumluluğu sağlamak ve düzgün yapılandırılmış istemcilerle gerektiği + gibi çalışabilmek için bu gereklidir.

    + +

    Gelişmiş tekniklerin (çerezler, özel URL yolları gibi) desteklenmesi + sırasında, kullanıcının tercih ettiği dili saptamak için httpd 2.0.47 + sürümünden beri mod_negotiation modülü + prefer-language ortam değişkenini + tanımaktadır. Değişken mevcutsa ve uygun bir dil yaftası içeriyorsa + mod_negotiation uygun gösterimi seçmeyi deneyecektir. + Böyle bir gösterim çeşidi mevcut değilse normal uzlaşım işlemi + uygulanacaktır.

    + +

    Örnek

    SetEnvIf Cookie "language=(.+)" prefer-language=$1
    +Header append Vary cookie
    +
    + +
    top
    +
    +

    Şeffaf İçerik Uzlaşımının Genişletilmesi

    + + +

    httpd, şeffaf içerik uzlaşımı protokolünü (RFC 2295) şöyle genişletir: + Sadece içerik kodlamasına özgü olmak üzere gösterim çeşidi listelerinde + gösterim çeşitlerini imlemek için yeni bir {encoding ..} + elemanı kullanılır. RVSA/1.0 algoritmasının (RFC 2296) gerçeklenimi, + listedeki kodlanmış gösterim çeşitlerini tanımak ve onları + Accept-Encoding başlık alanıyla ilgili olarak kabul + edilebilir kodlamalara aday gösterim çeşitleri olarak kullanmak üzere + genişletilmiştir. RVSA/1.0 gerçeklenimi, en uygun gösterim çeşidi + seçiminin öncesinde hesaplanmış üstünlük katsayısını virgülden sonra beş + haneye yuvarlamaz.

    +
    top
    +
    +

    Hiperbağlar ve İsimlendirme Uzlaşımları

    + +

    Eğer dil uzlaşımı kullanıyorsanız ve birden fazla dosya ismi uzantısına + sahip dosyalarınız varsa uzantıların sıralamasının normalde uygunsuz + düştüğü farklı isimlendirme yaklaşımlarında bulunabilirsiniz (ayrıntılar + için mod_mime belgesine + bakınız).

    + +

    Bir MIME türü uzantısına sahip bir dosyanın (html gibi), + kodlanmış bir gösterimi (gz gibi) mevcut olabilir. Bu + dosyanın ayrıca farklı dillerdeki gösterimleri için de bir uzantısı + (en gibi) olabilir.

    + +

    Örnekler:

    + +
      +
    • misal.en.html
    • + +
    • misal.html.en
    • + +
    • misal.en.html.gz
    • +
    + +

    Hiperbağ olarak geçerli ve geçersiz bazı dosya ismi örnekleri:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Dosya ismiGeçerli HiperbağGeçersiz Hiperbağ
    misal.html.enmisal
    + misal.html
    -
    misal.en.htmlmisalmisal.html
    misal.html.en.gzmisal
    + misal.html
    misal.gz
    + misal.html.gz
    misal.en.html.gzmisalmisal.html
    + misal.html.gz
    + misal.gz
    misal.gz.html.enmisal
    + misal.gz
    + misal.gz.html
    misal.html
    misal.html.gz.enmisal
    + misal.html
    + misal.html.gz
    misal.gz
    + +

    Yukarıdaki tabloya bakarak hiperbağlarda bir dosya ismini uzantısız + olarak (misal gibi) kullanmanın daima mümkün olduğunu + farkedeceksiniz. Böylece bir belgenin asıl türünü gizleyebilir ve + sonradan bir hiperbağ değişikliği yapmaksızın örneğin + html’den shtml veya cgi’ye + geçebilirsiniz.

    + +

    Hiperbağlarda MIME türlerini (misal.html gibi) kullanmaya + devam etmek istiyorsanız dil uzantısı MIME türü uzantısının sağında + kalmalıdır (misal.html.en gibi).

    +
    top
    +
    +

    Arabellekler Hakkında

    + +

    Bir arabellek, bir gösterimi istek URL’si ile ilişkilendirerek saklar. + Böylece, sonradan aynı URL için bir istek yapıldığında kaydettiği + gösterimi kullanabilir. Fakat özkaynak sunucuyla uzlaşılan türdeyse + arabelleğe ilk istenen çeşit saklanmış olacağından isteğe yanlış + gösterimle yanıt verilmiş olacaktır. Bunun olmaması için httpd, normal + olarak içerik uzlaşımının sonucu olarak döndürülen tüm yanıtları + HTTP/1.0 istemciler tarafından arabelleklenemez olarak imler. httpd + ayrıca, uzlaşımlı yanıtların arabelleklenmesini mümkün kılan HTTP/1.1 + protokolünü de destekler.

    + +

    HTTP/1.0 uyumlu istemcilerden (bir tarayıcı veya arabellek) gelen + istekler için, uzlaşıma konu yanıtların arabelleklenmesini mümkün kılmak + üzere CacheNegotiatedDocs yönergesi kullanılabilir. Bu yönerge + argümansızdır ve sunucu genelinde veya sanal konakların + yapılandırılmasında kullanılabilir. Bunun HTTP/1.1 istemcilerinden gelen + isteklere bir etkisi yoktur.

    + +

    HTTP/1.1 istemciler için, httpd, yanıtın uzlaşım boyutlarını göstermek + üzere bir Vary HTTP yanıt başlığı gönderir. Arabellekler bu + bilgiyi sonraki istekleri yerel kopyadan sunarken kullanabilirler. Bir + arabelleğin uzlaşım boyutlarına bakmaksızın yerel kopyasını kullanmaya + teşvik etmek için force-no-vary ortam değişkenini etkin kılabilirsiniz.

    + +
    +
    +

    Mevcut Diller:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Yorumlar

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/convenience.map b/docs/manual/convenience.map new file mode 100644 index 0000000..19befc8 --- /dev/null +++ b/docs/manual/convenience.map @@ -0,0 +1,726 @@ +# Mapping from directive names to URLs +# GENERATED FROM XML -- DO NOT EDIT +# You may use it as follows: +# RewriteEngine On +# RewriteMap dir2url txt:/path/to/convenience.map +# RewriteCond ${dir2url:$1} (.+) +# RewriteRule ^/+([^/]+)$ /manual/%1 [R=301,NE,L] + +acceptfilter mod/core.html#acceptfilter +acceptpathinfo mod/core.html#acceptpathinfo +accessfilename mod/core.html#accessfilename +action mod/mod_actions.html#action +addalt mod/mod_autoindex.html#addalt +addaltbyencoding mod/mod_autoindex.html#addaltbyencoding +addaltbytype mod/mod_autoindex.html#addaltbytype +addcharset mod/mod_mime.html#addcharset +adddefaultcharset mod/core.html#adddefaultcharset +adddescription mod/mod_autoindex.html#adddescription +addencoding mod/mod_mime.html#addencoding +addhandler mod/mod_mime.html#addhandler +addicon mod/mod_autoindex.html#addicon +addiconbyencoding mod/mod_autoindex.html#addiconbyencoding +addiconbytype mod/mod_autoindex.html#addiconbytype +addinputfilter mod/mod_mime.html#addinputfilter +addlanguage mod/mod_mime.html#addlanguage +addmoduleinfo mod/mod_info.html#addmoduleinfo +addoutputfilter mod/mod_mime.html#addoutputfilter +addoutputfilterbytype mod/mod_filter.html#addoutputfilterbytype +addtype mod/mod_mime.html#addtype +alias mod/mod_alias.html#alias +aliasmatch mod/mod_alias.html#aliasmatch +allow mod/mod_access_compat.html#allow +allowconnect mod/mod_proxy_connect.html#allowconnect +allowencodedslashes mod/core.html#allowencodedslashes +allowmethods mod/mod_allowmethods.html#allowmethods +allowoverride mod/core.html#allowoverride +allowoverridelist mod/core.html#allowoverridelist +anonymous mod/mod_authn_anon.html#anonymous +anonymous_logemail mod/mod_authn_anon.html#anonymous_logemail +anonymous_mustgiveemail mod/mod_authn_anon.html#anonymous_mustgiveemail +anonymous_nouserid mod/mod_authn_anon.html#anonymous_nouserid +anonymous_verifyemail mod/mod_authn_anon.html#anonymous_verifyemail +asyncrequestworkerfactor mod/event.html#asyncrequestworkerfactor +authbasicauthoritative mod/mod_auth_basic.html#authbasicauthoritative +authbasicfake mod/mod_auth_basic.html#authbasicfake +authbasicprovider mod/mod_auth_basic.html#authbasicprovider +authbasicusedigestalgorithm mod/mod_auth_basic.html#authbasicusedigestalgorithm +authdbduserpwquery mod/mod_authn_dbd.html#authdbduserpwquery +authdbduserrealmquery mod/mod_authn_dbd.html#authdbduserrealmquery +authdbmgroupfile mod/mod_authz_dbm.html#authdbmgroupfile +authdbmtype mod/mod_authn_dbm.html#authdbmtype +authdbmuserfile mod/mod_authn_dbm.html#authdbmuserfile +authdigestalgorithm mod/mod_auth_digest.html#authdigestalgorithm +authdigestdomain mod/mod_auth_digest.html#authdigestdomain +authdigestnoncelifetime mod/mod_auth_digest.html#authdigestnoncelifetime +authdigestprovider mod/mod_auth_digest.html#authdigestprovider +authdigestqop mod/mod_auth_digest.html#authdigestqop +authdigestshmemsize mod/mod_auth_digest.html#authdigestshmemsize +authformauthoritative mod/mod_auth_form.html#authformauthoritative +authformbody mod/mod_auth_form.html#authformbody +authformdisablenostore mod/mod_auth_form.html#authformdisablenostore +authformfakebasicauth mod/mod_auth_form.html#authformfakebasicauth +authformlocation mod/mod_auth_form.html#authformlocation +authformloginrequiredlocation mod/mod_auth_form.html#authformloginrequiredlocation +authformloginsuccesslocation mod/mod_auth_form.html#authformloginsuccesslocation +authformlogoutlocation mod/mod_auth_form.html#authformlogoutlocation +authformmethod mod/mod_auth_form.html#authformmethod +authformmimetype mod/mod_auth_form.html#authformmimetype +authformpassword mod/mod_auth_form.html#authformpassword +authformprovider mod/mod_auth_form.html#authformprovider +authformsitepassphrase mod/mod_auth_form.html#authformsitepassphrase +authformsize mod/mod_auth_form.html#authformsize +authformusername mod/mod_auth_form.html#authformusername +authgroupfile mod/mod_authz_groupfile.html#authgroupfile +authldapauthorizeprefix mod/mod_authnz_ldap.html#authldapauthorizeprefix +authldapbindauthoritative mod/mod_authnz_ldap.html#authldapbindauthoritative +authldapbinddn mod/mod_authnz_ldap.html#authldapbinddn +authldapbindpassword mod/mod_authnz_ldap.html#authldapbindpassword +authldapcharsetconfig mod/mod_authnz_ldap.html#authldapcharsetconfig +authldapcompareasuser mod/mod_authnz_ldap.html#authldapcompareasuser +authldapcomparednonserver mod/mod_authnz_ldap.html#authldapcomparednonserver +authldapdereferencealiases mod/mod_authnz_ldap.html#authldapdereferencealiases +authldapgroupattribute mod/mod_authnz_ldap.html#authldapgroupattribute +authldapgroupattributeisdn mod/mod_authnz_ldap.html#authldapgroupattributeisdn +authldapinitialbindasuser mod/mod_authnz_ldap.html#authldapinitialbindasuser +authldapinitialbindpattern mod/mod_authnz_ldap.html#authldapinitialbindpattern +authldapmaxsubgroupdepth mod/mod_authnz_ldap.html#authldapmaxsubgroupdepth +authldapremoteuserattribute mod/mod_authnz_ldap.html#authldapremoteuserattribute +authldapremoteuserisdn mod/mod_authnz_ldap.html#authldapremoteuserisdn +authldapsearchasuser mod/mod_authnz_ldap.html#authldapsearchasuser +authldapsubgroupattribute mod/mod_authnz_ldap.html#authldapsubgroupattribute +authldapsubgroupclass mod/mod_authnz_ldap.html#authldapsubgroupclass +authldapurl mod/mod_authnz_ldap.html#authldapurl +authmerging mod/mod_authz_core.html#authmerging +authname mod/mod_authn_core.html#authname +authncachecontext mod/mod_authn_socache.html#authncachecontext +authncacheenable mod/mod_authn_socache.html#authncacheenable +authncacheprovidefor mod/mod_authn_socache.html#authncacheprovidefor +authncachesocache mod/mod_authn_socache.html#authncachesocache +authncachetimeout mod/mod_authn_socache.html#authncachetimeout +authnprovideralias mod/mod_authn_core.html#authnprovideralias +authnzfcgicheckauthnprovider mod/mod_authnz_fcgi.html#authnzfcgicheckauthnprovider +authnzfcgidefineprovider mod/mod_authnz_fcgi.html#authnzfcgidefineprovider +authtype mod/mod_authn_core.html#authtype +authuserfile mod/mod_authn_file.html#authuserfile +authzdbdlogintoreferer mod/mod_authz_dbd.html#authzdbdlogintoreferer +authzdbdquery mod/mod_authz_dbd.html#authzdbdquery +authzdbdredirectquery mod/mod_authz_dbd.html#authzdbdredirectquery +authzdbmtype mod/mod_authz_dbm.html#authzdbmtype +authzprovideralias mod/mod_authz_core.html#authzprovideralias +authzsendforbiddenonfailure mod/mod_authz_core.html#authzsendforbiddenonfailure +balancergrowth mod/mod_proxy.html#balancergrowth +balancerinherit mod/mod_proxy.html#balancerinherit +balancermember mod/mod_proxy.html#balancermember +balancerpersist mod/mod_proxy.html#balancerpersist +brotlialteretag mod/mod_brotli.html#brotlialteretag +brotlicompressionmaxinputblock mod/mod_brotli.html#brotlicompressionmaxinputblock +brotlicompressionquality mod/mod_brotli.html#brotlicompressionquality +brotlicompressionwindow mod/mod_brotli.html#brotlicompressionwindow +brotlifilternote mod/mod_brotli.html#brotlifilternote +browsermatch mod/mod_setenvif.html#browsermatch +browsermatchnocase mod/mod_setenvif.html#browsermatchnocase +bufferedlogs mod/mod_log_config.html#bufferedlogs +buffersize mod/mod_buffer.html#buffersize +cachedefaultexpire mod/mod_cache.html#cachedefaultexpire +cachedetailheader mod/mod_cache.html#cachedetailheader +cachedirlength mod/mod_cache_disk.html#cachedirlength +cachedirlevels mod/mod_cache_disk.html#cachedirlevels +cachedisable mod/mod_cache.html#cachedisable +cacheenable mod/mod_cache.html#cacheenable +cachefile mod/mod_file_cache.html#cachefile +cacheheader mod/mod_cache.html#cacheheader +cacheignorecachecontrol mod/mod_cache.html#cacheignorecachecontrol +cacheignoreheaders mod/mod_cache.html#cacheignoreheaders +cacheignorenolastmod mod/mod_cache.html#cacheignorenolastmod +cacheignorequerystring mod/mod_cache.html#cacheignorequerystring +cacheignoreurlsessionidentifiers mod/mod_cache.html#cacheignoreurlsessionidentifiers +cachekeybaseurl mod/mod_cache.html#cachekeybaseurl +cachelastmodifiedfactor mod/mod_cache.html#cachelastmodifiedfactor +cachelock mod/mod_cache.html#cachelock +cachelockmaxage mod/mod_cache.html#cachelockmaxage +cachelockpath mod/mod_cache.html#cachelockpath +cachemaxexpire mod/mod_cache.html#cachemaxexpire +cachemaxfilesize mod/mod_cache_disk.html#cachemaxfilesize +cacheminexpire mod/mod_cache.html#cacheminexpire +cacheminfilesize mod/mod_cache_disk.html#cacheminfilesize +cachenegotiateddocs mod/mod_negotiation.html#cachenegotiateddocs +cachequickhandler mod/mod_cache.html#cachequickhandler +cachereadsize mod/mod_cache_disk.html#cachereadsize +cachereadtime mod/mod_cache_disk.html#cachereadtime +cacheroot mod/mod_cache_disk.html#cacheroot +cachesocache mod/mod_cache_socache.html#cachesocache +cachesocachemaxsize mod/mod_cache_socache.html#cachesocachemaxsize +cachesocachemaxtime mod/mod_cache_socache.html#cachesocachemaxtime +cachesocachemintime mod/mod_cache_socache.html#cachesocachemintime +cachesocachereadsize mod/mod_cache_socache.html#cachesocachereadsize +cachesocachereadtime mod/mod_cache_socache.html#cachesocachereadtime +cachestaleonerror mod/mod_cache.html#cachestaleonerror +cachestoreexpired mod/mod_cache.html#cachestoreexpired +cachestorenostore mod/mod_cache.html#cachestorenostore +cachestoreprivate mod/mod_cache.html#cachestoreprivate +cgidscripttimeout mod/mod_cgid.html#cgidscripttimeout +cgimapextension mod/core.html#cgimapextension +cgipassauth mod/core.html#cgipassauth +cgivar mod/core.html#cgivar +charsetdefault mod/mod_charset_lite.html#charsetdefault +charsetoptions mod/mod_charset_lite.html#charsetoptions +charsetsourceenc mod/mod_charset_lite.html#charsetsourceenc +checkbasenamematch mod/mod_speling.html#checkbasenamematch +checkcaseonly mod/mod_speling.html#checkcaseonly +checkspelling mod/mod_speling.html#checkspelling +chrootdir mod/mod_unixd.html#chrootdir +contentdigest mod/core.html#contentdigest +cookiedomain mod/mod_usertrack.html#cookiedomain +cookieexpires mod/mod_usertrack.html#cookieexpires +cookiehttponly mod/mod_usertrack.html#cookiehttponly +cookiename mod/mod_usertrack.html#cookiename +cookiesamesite mod/mod_usertrack.html#cookiesamesite +cookiesecure mod/mod_usertrack.html#cookiesecure +cookiestyle mod/mod_usertrack.html#cookiestyle +cookietracking mod/mod_usertrack.html#cookietracking +coredumpdirectory mod/mpm_common.html#coredumpdirectory +customlog mod/mod_log_config.html#customlog +dav mod/mod_dav.html#dav +davdepthinfinity mod/mod_dav.html#davdepthinfinity +davgenericlockdb mod/mod_dav_lock.html#davgenericlockdb +davlockdb mod/mod_dav_fs.html#davlockdb +davmintimeout mod/mod_dav.html#davmintimeout +dbdexptime mod/mod_dbd.html#dbdexptime +dbdinitsql mod/mod_dbd.html#dbdinitsql +dbdkeep mod/mod_dbd.html#dbdkeep +dbdmax mod/mod_dbd.html#dbdmax +dbdmin mod/mod_dbd.html#dbdmin +dbdparams mod/mod_dbd.html#dbdparams +dbdpersist mod/mod_dbd.html#dbdpersist +dbdpreparesql mod/mod_dbd.html#dbdpreparesql +dbdriver mod/mod_dbd.html#dbdriver +defaulticon mod/mod_autoindex.html#defaulticon +defaultlanguage mod/mod_mime.html#defaultlanguage +defaultruntimedir mod/core.html#defaultruntimedir +defaulttype mod/core.html#defaulttype +define mod/core.html#define +deflatebuffersize mod/mod_deflate.html#deflatebuffersize +deflatecompressionlevel mod/mod_deflate.html#deflatecompressionlevel +deflatefilternote mod/mod_deflate.html#deflatefilternote +deflateinflatelimitrequestbody mod/mod_deflate.html#deflateinflatelimitrequestbody +deflateinflateratioburst mod/mod_deflate.html#deflateinflateratioburst +deflateinflateratiolimit mod/mod_deflate.html#deflateinflateratiolimit +deflatememlevel mod/mod_deflate.html#deflatememlevel +deflatewindowsize mod/mod_deflate.html#deflatewindowsize +deny mod/mod_access_compat.html#deny +directory mod/core.html#directory +directorycheckhandler mod/mod_dir.html#directorycheckhandler +directoryindex mod/mod_dir.html#directoryindex +directoryindexredirect mod/mod_dir.html#directoryindexredirect +directorymatch mod/core.html#directorymatch +directoryslash mod/mod_dir.html#directoryslash +documentroot mod/core.html#documentroot +dtraceprivileges mod/mod_privileges.html#dtraceprivileges +dumpioinput mod/mod_dumpio.html#dumpioinput +dumpiooutput mod/mod_dumpio.html#dumpiooutput +else mod/core.html#else +elseif mod/core.html#elseif +enableexceptionhook mod/mpm_common.html#enableexceptionhook +enablemmap mod/core.html#enablemmap +enablesendfile mod/core.html#enablesendfile +error mod/core.html#error +errordocument mod/core.html#errordocument +errorlog mod/core.html#errorlog +errorlogformat mod/core.html#errorlogformat +example mod/mod_example_hooks.html#example +expiresactive mod/mod_expires.html#expiresactive +expiresbytype mod/mod_expires.html#expiresbytype +expiresdefault mod/mod_expires.html#expiresdefault +extendedstatus mod/core.html#extendedstatus +extfilterdefine mod/mod_ext_filter.html#extfilterdefine +extfilteroptions mod/mod_ext_filter.html#extfilteroptions +fallbackresource mod/mod_dir.html#fallbackresource +fileetag mod/core.html#fileetag +files mod/core.html#files +filesmatch mod/core.html#filesmatch +filterchain mod/mod_filter.html#filterchain +filterdeclare mod/mod_filter.html#filterdeclare +filterprotocol mod/mod_filter.html#filterprotocol +filterprovider mod/mod_filter.html#filterprovider +filtertrace mod/mod_filter.html#filtertrace +flushmaxpipelined mod/core.html#flushmaxpipelined +flushmaxthreshold mod/core.html#flushmaxthreshold +forcelanguagepriority mod/mod_negotiation.html#forcelanguagepriority +forcetype mod/core.html#forcetype +forensiclog mod/mod_log_forensic.html#forensiclog +globallog mod/mod_log_config.html#globallog +gprofdir mod/core.html#gprofdir +gracefulshutdowntimeout mod/mpm_common.html#gracefulshutdowntimeout +group mod/mod_unixd.html#group +h2copyfiles mod/mod_http2.html#h2copyfiles +h2direct mod/mod_http2.html#h2direct +h2earlyhints mod/mod_http2.html#h2earlyhints +h2maxsessionstreams mod/mod_http2.html#h2maxsessionstreams +h2maxworkeridleseconds mod/mod_http2.html#h2maxworkeridleseconds +h2maxworkers mod/mod_http2.html#h2maxworkers +h2minworkers mod/mod_http2.html#h2minworkers +h2moderntlsonly mod/mod_http2.html#h2moderntlsonly +h2outputbuffering mod/mod_http2.html#h2outputbuffering +h2padding mod/mod_http2.html#h2padding +h2push mod/mod_http2.html#h2push +h2pushdiarysize mod/mod_http2.html#h2pushdiarysize +h2pushpriority mod/mod_http2.html#h2pushpriority +h2pushresource mod/mod_http2.html#h2pushresource +h2serializeheaders mod/mod_http2.html#h2serializeheaders +h2streammaxmemsize mod/mod_http2.html#h2streammaxmemsize +h2tlscooldownsecs mod/mod_http2.html#h2tlscooldownsecs +h2tlswarmupsize mod/mod_http2.html#h2tlswarmupsize +h2upgrade mod/mod_http2.html#h2upgrade +h2windowsize mod/mod_http2.html#h2windowsize +header mod/mod_headers.html#header +headername mod/mod_autoindex.html#headername +heartbeataddress mod/mod_heartbeat.html#heartbeataddress +heartbeatlisten mod/mod_heartmonitor.html#heartbeatlisten +heartbeatmaxservers mod/mod_heartmonitor.html#heartbeatmaxservers +heartbeatstorage mod/mod_lbmethod_heartbeat.html#heartbeatstorage +heartbeatstorage mod/mod_heartmonitor.html#heartbeatstorage +hostnamelookups mod/core.html#hostnamelookups +httpprotocoloptions mod/core.html#httpprotocoloptions +identitycheck mod/mod_ident.html#identitycheck +identitychecktimeout mod/mod_ident.html#identitychecktimeout +if mod/core.html#if +ifdefine mod/core.html#ifdefine +ifdirective mod/core.html#ifdirective +iffile mod/core.html#iffile +ifmodule mod/core.html#ifmodule +ifsection mod/core.html#ifsection +ifversion mod/mod_version.html#ifversion +imapbase mod/mod_imagemap.html#imapbase +imapdefault mod/mod_imagemap.html#imapdefault +imapmenu mod/mod_imagemap.html#imapmenu +include mod/core.html#include +includeoptional mod/core.html#includeoptional +indexheadinsert mod/mod_autoindex.html#indexheadinsert +indexignore mod/mod_autoindex.html#indexignore +indexignorereset mod/mod_autoindex.html#indexignorereset +indexoptions mod/mod_autoindex.html#indexoptions +indexorderdefault mod/mod_autoindex.html#indexorderdefault +indexstylesheet mod/mod_autoindex.html#indexstylesheet +inputsed mod/mod_sed.html#inputsed +isapiappendlogtoerrors mod/mod_isapi.html#isapiappendlogtoerrors +isapiappendlogtoquery mod/mod_isapi.html#isapiappendlogtoquery +isapicachefile mod/mod_isapi.html#isapicachefile +isapifakeasync mod/mod_isapi.html#isapifakeasync +isapilognotsupported mod/mod_isapi.html#isapilognotsupported +isapireadaheadbuffer mod/mod_isapi.html#isapireadaheadbuffer +keepalive mod/core.html#keepalive +keepalivetimeout mod/core.html#keepalivetimeout +keptbodysize mod/mod_request.html#keptbodysize +languagepriority mod/mod_negotiation.html#languagepriority +ldapcacheentries mod/mod_ldap.html#ldapcacheentries +ldapcachettl mod/mod_ldap.html#ldapcachettl +ldapconnectionpoolttl mod/mod_ldap.html#ldapconnectionpoolttl +ldapconnectiontimeout mod/mod_ldap.html#ldapconnectiontimeout +ldaplibrarydebug mod/mod_ldap.html#ldaplibrarydebug +ldapopcacheentries mod/mod_ldap.html#ldapopcacheentries +ldapopcachettl mod/mod_ldap.html#ldapopcachettl +ldapreferralhoplimit mod/mod_ldap.html#ldapreferralhoplimit +ldapreferrals mod/mod_ldap.html#ldapreferrals +ldapretries mod/mod_ldap.html#ldapretries +ldapretrydelay mod/mod_ldap.html#ldapretrydelay +ldapsharedcachefile mod/mod_ldap.html#ldapsharedcachefile +ldapsharedcachesize mod/mod_ldap.html#ldapsharedcachesize +ldaptimeout mod/mod_ldap.html#ldaptimeout +ldaptrustedclientcert mod/mod_ldap.html#ldaptrustedclientcert +ldaptrustedglobalcert mod/mod_ldap.html#ldaptrustedglobalcert +ldaptrustedmode mod/mod_ldap.html#ldaptrustedmode +ldapverifyservercert mod/mod_ldap.html#ldapverifyservercert +limit mod/core.html#limit +limitexcept mod/core.html#limitexcept +limitinternalrecursion mod/core.html#limitinternalrecursion +limitrequestbody mod/core.html#limitrequestbody +limitrequestfields mod/core.html#limitrequestfields +limitrequestfieldsize mod/core.html#limitrequestfieldsize +limitrequestline mod/core.html#limitrequestline +limitxmlrequestbody mod/core.html#limitxmlrequestbody +listen mod/mpm_common.html#listen +listenbacklog mod/mpm_common.html#listenbacklog +listencoresbucketsratio mod/mpm_common.html#listencoresbucketsratio +loadfile mod/mod_so.html#loadfile +loadmodule mod/mod_so.html#loadmodule +location mod/core.html#location +locationmatch mod/core.html#locationmatch +logformat mod/mod_log_config.html#logformat +logiotrackttfb mod/mod_logio.html#logiotrackttfb +loglevel mod/core.html#loglevel +logmessage mod/mod_log_debug.html#logmessage +luaauthzprovider mod/mod_lua.html#luaauthzprovider +luacodecache mod/mod_lua.html#luacodecache +luahookaccesschecker mod/mod_lua.html#luahookaccesschecker +luahookauthchecker mod/mod_lua.html#luahookauthchecker +luahookcheckuserid mod/mod_lua.html#luahookcheckuserid +luahookfixups mod/mod_lua.html#luahookfixups +luahookinsertfilter mod/mod_lua.html#luahookinsertfilter +luahooklog mod/mod_lua.html#luahooklog +luahookmaptostorage mod/mod_lua.html#luahookmaptostorage +luahookpretranslate mod/mod_lua.html#luahookpretranslate +luahooktranslatename mod/mod_lua.html#luahooktranslatename +luahooktypechecker mod/mod_lua.html#luahooktypechecker +luainherit mod/mod_lua.html#luainherit +luainputfilter mod/mod_lua.html#luainputfilter +luamaphandler mod/mod_lua.html#luamaphandler +luaoutputfilter mod/mod_lua.html#luaoutputfilter +luapackagecpath mod/mod_lua.html#luapackagecpath +luapackagepath mod/mod_lua.html#luapackagepath +luaquickhandler mod/mod_lua.html#luaquickhandler +luaroot mod/mod_lua.html#luaroot +luascope mod/mod_lua.html#luascope +macro mod/mod_macro.html#macro +maxconnectionsperchild mod/mpm_common.html#maxconnectionsperchild +maxkeepaliverequests mod/core.html#maxkeepaliverequests +maxmemfree mod/mpm_common.html#maxmemfree +maxrangeoverlaps mod/core.html#maxrangeoverlaps +maxrangereversals mod/core.html#maxrangereversals +maxranges mod/core.html#maxranges +maxrequestworkers mod/mpm_common.html#maxrequestworkers +maxspareservers mod/prefork.html#maxspareservers +maxsparethreads mod/mpm_common.html#maxsparethreads +maxthreads mod/mpm_netware.html#maxthreads +mdactivationdelay mod/mod_md.html#mdactivationdelay +mdbaseserver mod/mod_md.html#mdbaseserver +mdcachallenges mod/mod_md.html#mdcachallenges +mdcertificateagreement mod/mod_md.html#mdcertificateagreement +mdcertificateauthority mod/mod_md.html#mdcertificateauthority +mdcertificatecheck mod/mod_md.html#mdcertificatecheck +mdcertificatefile mod/mod_md.html#mdcertificatefile +mdcertificatekeyfile mod/mod_md.html#mdcertificatekeyfile +mdcertificatemonitor mod/mod_md.html#mdcertificatemonitor +mdcertificateprotocol mod/mod_md.html#mdcertificateprotocol +mdcertificatestatus mod/mod_md.html#mdcertificatestatus +mdchallengedns01 mod/mod_md.html#mdchallengedns01 +mdcontactemail mod/mod_md.html#mdcontactemail +mddrivemode mod/mod_md.html#mddrivemode +mdexternalaccountbinding mod/mod_md.html#mdexternalaccountbinding +mdhttpproxy mod/mod_md.html#mdhttpproxy +mdmember mod/mod_md.html#mdmember +mdmembers mod/mod_md.html#mdmembers +mdmessagecmd mod/mod_md.html#mdmessagecmd +mdmuststaple mod/mod_md.html#mdmuststaple +mdnotifycmd mod/mod_md.html#mdnotifycmd +mdomain mod/mod_md.html#mdomain +mdomainset mod/mod_md.html#mdomainset +mdportmap mod/mod_md.html#mdportmap +mdprivatekeys mod/mod_md.html#mdprivatekeys +mdrenewmode mod/mod_md.html#mdrenewmode +mdrenewwindow mod/mod_md.html#mdrenewwindow +mdrequirehttps mod/mod_md.html#mdrequirehttps +mdserverstatus mod/mod_md.html#mdserverstatus +mdstapleothers mod/mod_md.html#mdstapleothers +mdstapling mod/mod_md.html#mdstapling +mdstaplingkeepresponse mod/mod_md.html#mdstaplingkeepresponse +mdstaplingrenewwindow mod/mod_md.html#mdstaplingrenewwindow +mdstoredir mod/mod_md.html#mdstoredir +mdwarnwindow mod/mod_md.html#mdwarnwindow +memcacheconnttl mod/mod_socache_memcache.html#memcacheconnttl +mergeslashes mod/core.html#mergeslashes +mergetrailers mod/core.html#mergetrailers +metadir mod/mod_cern_meta.html#metadir +metafiles mod/mod_cern_meta.html#metafiles +metasuffix mod/mod_cern_meta.html#metasuffix +mimemagicfile mod/mod_mime_magic.html#mimemagicfile +minspareservers mod/prefork.html#minspareservers +minsparethreads mod/mpm_common.html#minsparethreads +mmapfile mod/mod_file_cache.html#mmapfile +modemstandard mod/mod_dialup.html#modemstandard +modmimeusepathinfo mod/mod_mime.html#modmimeusepathinfo +multiviewsmatch mod/mod_mime.html#multiviewsmatch +mutex mod/core.html#mutex +namevirtualhost mod/core.html#namevirtualhost +noproxy mod/mod_proxy.html#noproxy +nwssltrustedcerts mod/mod_nw_ssl.html#nwssltrustedcerts +nwsslupgradeable mod/mod_nw_ssl.html#nwsslupgradeable +options mod/core.html#options +order mod/mod_access_compat.html#order +outputsed mod/mod_sed.html#outputsed +passenv mod/mod_env.html#passenv +pidfile mod/mpm_common.html#pidfile +privilegesmode mod/mod_privileges.html#privilegesmode +protocol mod/core.html#protocol +protocolecho mod/mod_echo.html#protocolecho +protocols mod/core.html#protocols +protocolshonororder mod/core.html#protocolshonororder +proxy mod/mod_proxy.html#proxy +proxy100continue mod/mod_proxy.html#proxy100continue +proxyaddheaders mod/mod_proxy.html#proxyaddheaders +proxybadheader mod/mod_proxy.html#proxybadheader +proxyblock mod/mod_proxy.html#proxyblock +proxydomain mod/mod_proxy.html#proxydomain +proxyerroroverride mod/mod_proxy.html#proxyerroroverride +proxyexpressdbmfile mod/mod_proxy_express.html#proxyexpressdbmfile +proxyexpressdbmtype mod/mod_proxy_express.html#proxyexpressdbmtype +proxyexpressenable mod/mod_proxy_express.html#proxyexpressenable +proxyfcgibackendtype mod/mod_proxy_fcgi.html#proxyfcgibackendtype +proxyfcgisetenvif mod/mod_proxy_fcgi.html#proxyfcgisetenvif +proxyftpdircharset mod/mod_proxy_ftp.html#proxyftpdircharset +proxyftpescapewildcards mod/mod_proxy_ftp.html#proxyftpescapewildcards +proxyftplistonwildcard mod/mod_proxy_ftp.html#proxyftplistonwildcard +proxyhcexpr mod/mod_proxy_hcheck.html#proxyhcexpr +proxyhctemplate mod/mod_proxy_hcheck.html#proxyhctemplate +proxyhctpsize mod/mod_proxy_hcheck.html#proxyhctpsize +proxyhtmlbufsize mod/mod_proxy_html.html#proxyhtmlbufsize +proxyhtmlcharsetout mod/mod_proxy_html.html#proxyhtmlcharsetout +proxyhtmldoctype mod/mod_proxy_html.html#proxyhtmldoctype +proxyhtmlenable mod/mod_proxy_html.html#proxyhtmlenable +proxyhtmlevents mod/mod_proxy_html.html#proxyhtmlevents +proxyhtmlextended mod/mod_proxy_html.html#proxyhtmlextended +proxyhtmlfixups mod/mod_proxy_html.html#proxyhtmlfixups +proxyhtmlinterp mod/mod_proxy_html.html#proxyhtmlinterp +proxyhtmllinks mod/mod_proxy_html.html#proxyhtmllinks +proxyhtmlmeta mod/mod_proxy_html.html#proxyhtmlmeta +proxyhtmlstripcomments mod/mod_proxy_html.html#proxyhtmlstripcomments +proxyhtmlurlmap mod/mod_proxy_html.html#proxyhtmlurlmap +proxyiobuffersize mod/mod_proxy.html#proxyiobuffersize +proxymatch mod/mod_proxy.html#proxymatch +proxymaxforwards mod/mod_proxy.html#proxymaxforwards +proxypass mod/mod_proxy.html#proxypass +proxypassinherit mod/mod_proxy.html#proxypassinherit +proxypassinterpolateenv mod/mod_proxy.html#proxypassinterpolateenv +proxypassmatch mod/mod_proxy.html#proxypassmatch +proxypassreverse mod/mod_proxy.html#proxypassreverse +proxypassreversecookiedomain mod/mod_proxy.html#proxypassreversecookiedomain +proxypassreversecookiepath mod/mod_proxy.html#proxypassreversecookiepath +proxypreservehost mod/mod_proxy.html#proxypreservehost +proxyreceivebuffersize mod/mod_proxy.html#proxyreceivebuffersize +proxyremote mod/mod_proxy.html#proxyremote +proxyremotematch mod/mod_proxy.html#proxyremotematch +proxyrequests mod/mod_proxy.html#proxyrequests +proxyscgiinternalredirect mod/mod_proxy_scgi.html#proxyscgiinternalredirect +proxyscgisendfile mod/mod_proxy_scgi.html#proxyscgisendfile +proxyset mod/mod_proxy.html#proxyset +proxysourceaddress mod/mod_proxy.html#proxysourceaddress +proxystatus mod/mod_proxy.html#proxystatus +proxytimeout mod/mod_proxy.html#proxytimeout +proxyvia mod/mod_proxy.html#proxyvia +proxywebsocketfallbacktoproxyhttp mod/mod_proxy_wstunnel.html#proxywebsocketfallbacktoproxyhttp +qualifyredirecturl mod/core.html#qualifyredirecturl +readbuffersize mod/core.html#readbuffersize +readmename mod/mod_autoindex.html#readmename +receivebuffersize mod/mpm_common.html#receivebuffersize +redirect mod/mod_alias.html#redirect +redirectmatch mod/mod_alias.html#redirectmatch +redirectpermanent mod/mod_alias.html#redirectpermanent +redirecttemp mod/mod_alias.html#redirecttemp +redisconnpoolttl mod/mod_socache_redis.html#redisconnpoolttl +redistimeout mod/mod_socache_redis.html#redistimeout +reflectorheader mod/mod_reflector.html#reflectorheader +regexdefaultoptions mod/core.html#regexdefaultoptions +registerhttpmethod mod/core.html#registerhttpmethod +remoteipheader mod/mod_remoteip.html#remoteipheader +remoteipinternalproxy mod/mod_remoteip.html#remoteipinternalproxy +remoteipinternalproxylist mod/mod_remoteip.html#remoteipinternalproxylist +remoteipproxiesheader mod/mod_remoteip.html#remoteipproxiesheader +remoteipproxyprotocol mod/mod_remoteip.html#remoteipproxyprotocol +remoteipproxyprotocolexceptions mod/mod_remoteip.html#remoteipproxyprotocolexceptions +remoteiptrustedproxy mod/mod_remoteip.html#remoteiptrustedproxy +remoteiptrustedproxylist mod/mod_remoteip.html#remoteiptrustedproxylist +removecharset mod/mod_mime.html#removecharset +removeencoding mod/mod_mime.html#removeencoding +removehandler mod/mod_mime.html#removehandler +removeinputfilter mod/mod_mime.html#removeinputfilter +removelanguage mod/mod_mime.html#removelanguage +removeoutputfilter mod/mod_mime.html#removeoutputfilter +removetype mod/mod_mime.html#removetype +requestheader mod/mod_headers.html#requestheader +requestreadtimeout mod/mod_reqtimeout.html#requestreadtimeout +require mod/mod_authz_core.html#require +requireall mod/mod_authz_core.html#requireall +requireany mod/mod_authz_core.html#requireany +requirenone mod/mod_authz_core.html#requirenone +rewritebase mod/mod_rewrite.html#rewritebase +rewritecond mod/mod_rewrite.html#rewritecond +rewriteengine mod/mod_rewrite.html#rewriteengine +rewritemap mod/mod_rewrite.html#rewritemap +rewriteoptions mod/mod_rewrite.html#rewriteoptions +rewriterule mod/mod_rewrite.html#rewriterule +rlimitcpu mod/core.html#rlimitcpu +rlimitmem mod/core.html#rlimitmem +rlimitnproc mod/core.html#rlimitnproc +satisfy mod/mod_access_compat.html#satisfy +scoreboardfile mod/mpm_common.html#scoreboardfile +script mod/mod_actions.html#script +scriptalias mod/mod_alias.html#scriptalias +scriptaliasmatch mod/mod_alias.html#scriptaliasmatch +scriptinterpretersource mod/core.html#scriptinterpretersource +scriptlog mod/mod_cgi.html#scriptlog +scriptlogbuffer mod/mod_cgi.html#scriptlogbuffer +scriptloglength mod/mod_cgi.html#scriptloglength +scriptsock mod/mod_cgid.html#scriptsock +securelisten mod/mod_nw_ssl.html#securelisten +seerequesttail mod/core.html#seerequesttail +sendbuffersize mod/mpm_common.html#sendbuffersize +serveradmin mod/core.html#serveradmin +serveralias mod/core.html#serveralias +serverlimit mod/mpm_common.html#serverlimit +servername mod/core.html#servername +serverpath mod/core.html#serverpath +serverroot mod/core.html#serverroot +serversignature mod/core.html#serversignature +servertokens mod/core.html#servertokens +session mod/mod_session.html#session +sessioncookiename mod/mod_session_cookie.html#sessioncookiename +sessioncookiename2 mod/mod_session_cookie.html#sessioncookiename2 +sessioncookieremove mod/mod_session_cookie.html#sessioncookieremove +sessioncryptocipher mod/mod_session_crypto.html#sessioncryptocipher +sessioncryptodriver mod/mod_session_crypto.html#sessioncryptodriver +sessioncryptopassphrase mod/mod_session_crypto.html#sessioncryptopassphrase +sessioncryptopassphrasefile mod/mod_session_crypto.html#sessioncryptopassphrasefile +sessiondbdcookiename mod/mod_session_dbd.html#sessiondbdcookiename +sessiondbdcookiename2 mod/mod_session_dbd.html#sessiondbdcookiename2 +sessiondbdcookieremove mod/mod_session_dbd.html#sessiondbdcookieremove +sessiondbddeletelabel mod/mod_session_dbd.html#sessiondbddeletelabel +sessiondbdinsertlabel mod/mod_session_dbd.html#sessiondbdinsertlabel +sessiondbdperuser mod/mod_session_dbd.html#sessiondbdperuser +sessiondbdselectlabel mod/mod_session_dbd.html#sessiondbdselectlabel +sessiondbdupdatelabel mod/mod_session_dbd.html#sessiondbdupdatelabel +sessionenv mod/mod_session.html#sessionenv +sessionexclude mod/mod_session.html#sessionexclude +sessionexpiryupdateinterval mod/mod_session.html#sessionexpiryupdateinterval +sessionheader mod/mod_session.html#sessionheader +sessioninclude mod/mod_session.html#sessioninclude +sessionmaxage mod/mod_session.html#sessionmaxage +setenv mod/mod_env.html#setenv +setenvif mod/mod_setenvif.html#setenvif +setenvifexpr mod/mod_setenvif.html#setenvifexpr +setenvifnocase mod/mod_setenvif.html#setenvifnocase +sethandler mod/core.html#sethandler +setinputfilter mod/core.html#setinputfilter +setoutputfilter mod/core.html#setoutputfilter +ssiendtag mod/mod_include.html#ssiendtag +ssierrormsg mod/mod_include.html#ssierrormsg +ssietag mod/mod_include.html#ssietag +ssilastmodified mod/mod_include.html#ssilastmodified +ssilegacyexprparser mod/mod_include.html#ssilegacyexprparser +ssistarttag mod/mod_include.html#ssistarttag +ssitimeformat mod/mod_include.html#ssitimeformat +ssiundefinedecho mod/mod_include.html#ssiundefinedecho +sslcacertificatefile mod/mod_ssl.html#sslcacertificatefile +sslcacertificatepath mod/mod_ssl.html#sslcacertificatepath +sslcadnrequestfile mod/mod_ssl.html#sslcadnrequestfile +sslcadnrequestpath mod/mod_ssl.html#sslcadnrequestpath +sslcarevocationcheck mod/mod_ssl.html#sslcarevocationcheck +sslcarevocationfile mod/mod_ssl.html#sslcarevocationfile +sslcarevocationpath mod/mod_ssl.html#sslcarevocationpath +sslcertificatechainfile mod/mod_ssl.html#sslcertificatechainfile +sslcertificatefile mod/mod_ssl.html#sslcertificatefile +sslcertificatekeyfile mod/mod_ssl.html#sslcertificatekeyfile +sslciphersuite mod/mod_ssl.html#sslciphersuite +sslcompression mod/mod_ssl.html#sslcompression +sslcryptodevice mod/mod_ssl.html#sslcryptodevice +sslengine mod/mod_ssl.html#sslengine +sslfips mod/mod_ssl.html#sslfips +sslhonorcipherorder mod/mod_ssl.html#sslhonorcipherorder +sslinsecurerenegotiation mod/mod_ssl.html#sslinsecurerenegotiation +sslocspdefaultresponder mod/mod_ssl.html#sslocspdefaultresponder +sslocspenable mod/mod_ssl.html#sslocspenable +sslocspnoverify mod/mod_ssl.html#sslocspnoverify +sslocspoverrideresponder mod/mod_ssl.html#sslocspoverrideresponder +sslocspproxyurl mod/mod_ssl.html#sslocspproxyurl +sslocsprespondercertificatefile mod/mod_ssl.html#sslocsprespondercertificatefile +sslocsprespondertimeout mod/mod_ssl.html#sslocsprespondertimeout +sslocspresponsemaxage mod/mod_ssl.html#sslocspresponsemaxage +sslocspresponsetimeskew mod/mod_ssl.html#sslocspresponsetimeskew +sslocspuserequestnonce mod/mod_ssl.html#sslocspuserequestnonce +sslopensslconfcmd mod/mod_ssl.html#sslopensslconfcmd +ssloptions mod/mod_ssl.html#ssloptions +sslpassphrasedialog mod/mod_ssl.html#sslpassphrasedialog +sslprotocol mod/mod_ssl.html#sslprotocol +sslproxycacertificatefile mod/mod_ssl.html#sslproxycacertificatefile +sslproxycacertificatepath mod/mod_ssl.html#sslproxycacertificatepath +sslproxycarevocationcheck mod/mod_ssl.html#sslproxycarevocationcheck +sslproxycarevocationfile mod/mod_ssl.html#sslproxycarevocationfile +sslproxycarevocationpath mod/mod_ssl.html#sslproxycarevocationpath +sslproxycheckpeercn mod/mod_ssl.html#sslproxycheckpeercn +sslproxycheckpeerexpire mod/mod_ssl.html#sslproxycheckpeerexpire +sslproxycheckpeername mod/mod_ssl.html#sslproxycheckpeername +sslproxyciphersuite mod/mod_ssl.html#sslproxyciphersuite +sslproxyengine mod/mod_ssl.html#sslproxyengine +sslproxymachinecertificatechainfile mod/mod_ssl.html#sslproxymachinecertificatechainfile +sslproxymachinecertificatefile mod/mod_ssl.html#sslproxymachinecertificatefile +sslproxymachinecertificatepath mod/mod_ssl.html#sslproxymachinecertificatepath +sslproxyprotocol mod/mod_ssl.html#sslproxyprotocol +sslproxyverify mod/mod_ssl.html#sslproxyverify +sslproxyverifydepth mod/mod_ssl.html#sslproxyverifydepth +sslrandomseed mod/mod_ssl.html#sslrandomseed +sslrenegbuffersize mod/mod_ssl.html#sslrenegbuffersize +sslrequire mod/mod_ssl.html#sslrequire +sslrequiressl mod/mod_ssl.html#sslrequiressl +sslsessioncache mod/mod_ssl.html#sslsessioncache +sslsessioncachetimeout mod/mod_ssl.html#sslsessioncachetimeout +sslsessionticketkeyfile mod/mod_ssl.html#sslsessionticketkeyfile +sslsessiontickets mod/mod_ssl.html#sslsessiontickets +sslsrpunknownuserseed mod/mod_ssl.html#sslsrpunknownuserseed +sslsrpverifierfile mod/mod_ssl.html#sslsrpverifierfile +sslstaplingcache mod/mod_ssl.html#sslstaplingcache +sslstaplingerrorcachetimeout mod/mod_ssl.html#sslstaplingerrorcachetimeout +sslstaplingfaketrylater mod/mod_ssl.html#sslstaplingfaketrylater +sslstaplingforceurl mod/mod_ssl.html#sslstaplingforceurl +sslstaplingrespondertimeout mod/mod_ssl.html#sslstaplingrespondertimeout +sslstaplingresponsemaxage mod/mod_ssl.html#sslstaplingresponsemaxage +sslstaplingresponsetimeskew mod/mod_ssl.html#sslstaplingresponsetimeskew +sslstaplingreturnrespondererrors mod/mod_ssl.html#sslstaplingreturnrespondererrors +sslstaplingstandardcachetimeout mod/mod_ssl.html#sslstaplingstandardcachetimeout +sslstrictsnivhostcheck mod/mod_ssl.html#sslstrictsnivhostcheck +sslusername mod/mod_ssl.html#sslusername +sslusestapling mod/mod_ssl.html#sslusestapling +sslverifyclient mod/mod_ssl.html#sslverifyclient +sslverifydepth mod/mod_ssl.html#sslverifydepth +startservers mod/mpm_common.html#startservers +startthreads mod/mpm_common.html#startthreads +stricthostcheck mod/core.html#stricthostcheck +substitute mod/mod_substitute.html#substitute +substituteinheritbefore mod/mod_substitute.html#substituteinheritbefore +substitutemaxlinelength mod/mod_substitute.html#substitutemaxlinelength +suexec mod/mod_unixd.html#suexec +suexecusergroup mod/mod_suexec.html#suexecusergroup +threadlimit mod/mpm_common.html#threadlimit +threadsperchild mod/mpm_common.html#threadsperchild +threadstacksize mod/mpm_common.html#threadstacksize +timeout mod/core.html#timeout +tlscertificate mod/mod_tls.html#tlscertificate +tlsciphersprefer mod/mod_tls.html#tlsciphersprefer +tlscipherssuppress mod/mod_tls.html#tlscipherssuppress +tlsengine mod/mod_tls.html#tlsengine +tlshonorclientorder mod/mod_tls.html#tlshonorclientorder +tlsoptions mod/mod_tls.html#tlsoptions +tlsprotocol mod/mod_tls.html#tlsprotocol +tlsproxyca mod/mod_tls.html#tlsproxyca +tlsproxyciphersprefer mod/mod_tls.html#tlsproxyciphersprefer +tlsproxycipherssuppress mod/mod_tls.html#tlsproxycipherssuppress +tlsproxyengine mod/mod_tls.html#tlsproxyengine +tlsproxymachinecertificate mod/mod_tls.html#tlsproxymachinecertificate +tlsproxyprotocol mod/mod_tls.html#tlsproxyprotocol +tlssessioncache mod/mod_tls.html#tlssessioncache +tlsstrictsni mod/mod_tls.html#tlsstrictsni +traceenable mod/core.html#traceenable +transferlog mod/mod_log_config.html#transferlog +typesconfig mod/mod_mime.html#typesconfig +undefine mod/core.html#undefine +undefmacro mod/mod_macro.html#undefmacro +unsetenv mod/mod_env.html#unsetenv +use mod/mod_macro.html#use +usecanonicalname mod/core.html#usecanonicalname +usecanonicalphysicalport mod/core.html#usecanonicalphysicalport +user mod/mod_unixd.html#user +userdir mod/mod_userdir.html#userdir +vhostcgimode mod/mod_privileges.html#vhostcgimode +vhostcgiprivs mod/mod_privileges.html#vhostcgiprivs +vhostgroup mod/mod_privileges.html#vhostgroup +vhostprivs mod/mod_privileges.html#vhostprivs +vhostsecure mod/mod_privileges.html#vhostsecure +vhostuser mod/mod_privileges.html#vhostuser +virtualdocumentroot mod/mod_vhost_alias.html#virtualdocumentroot +virtualdocumentrootip mod/mod_vhost_alias.html#virtualdocumentrootip +virtualhost mod/core.html#virtualhost +virtualscriptalias mod/mod_vhost_alias.html#virtualscriptalias +virtualscriptaliasip mod/mod_vhost_alias.html#virtualscriptaliasip +watchdoginterval mod/mod_watchdog.html#watchdoginterval +xbithack mod/mod_include.html#xbithack +xml2encalias mod/mod_xml2enc.html#xml2encalias +xml2encdefault mod/mod_xml2enc.html#xml2encdefault +xml2startparse mod/mod_xml2enc.html#xml2startparse diff --git a/docs/manual/custom-error.html b/docs/manual/custom-error.html new file mode 100644 index 0000000..9f0e635 --- /dev/null +++ b/docs/manual/custom-error.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: custom-error.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: custom-error.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: custom-error.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: custom-error.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: custom-error.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: custom-error.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/custom-error.html.en b/docs/manual/custom-error.html.en new file mode 100644 index 0000000..8e07f9c --- /dev/null +++ b/docs/manual/custom-error.html.en @@ -0,0 +1,237 @@ + + + + + +Custom Error Responses - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Custom Error Responses

    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + + +

    Although the Apache HTTP Server provides generic error responses + in the event of 4xx or 5xx HTTP status codes, these responses are + rather stark, uninformative, and can be intimidating to site users. + You may wish to provide custom error responses which are either + friendlier, or in some language other than English, or perhaps which + are styled more in line with your site layout.

    + +

    Customized error responses can be defined for any HTTP status + code designated as an error condition - that is, any 4xx or 5xx + status.

    + +

    Additionally, a set of values are provided, so + that the error document can be customized further based on the + values of these variables, using Server + Side Includes. Or, you can have error conditions handled by a + cgi program, or other dynamic handler (PHP, mod_perl, etc) which + makes use of these variables.

    + +
    + +
    top
    +
    +

    Configuration

    + +

    Custom error documents are configured using the ErrorDocument directive, + which may be used in global, + virtualhost, or directory context. It may be used in .htaccess files + if AllowOverride is set to + FileInfo.

    + +
    ErrorDocument 500 "Sorry, our script crashed. Oh dear"
    +ErrorDocument 500 /cgi-bin/crash-recover
    +ErrorDocument 500 http://error.example.com/server_error.html
    +ErrorDocument 404 /errors/not_found.html
    +ErrorDocument 401 /subscription/how_to_subscribe.html
    + + +

    The syntax of the ErrorDocument directive is:

    + +
    ErrorDocument <3-digit-code> <action>
    + + +

    where the action will be treated as:

    + +
      +
    1. A local URL to redirect to (if the action begins with a "/").
    2. +
    3. An external URL to redirect to (if the action is a valid URL).
    4. +
    5. Text to be displayed (if none of the above). The text must be + wrapped in quotes (") if it consists of more than one word.
    6. +
    + +

    When redirecting to a local URL, additional environment variables + are set so that the response can be further customized. They are not sent to + external URLs.

    + +
    top
    +
    +

    Available Variables

    + +

    Redirecting to another URL can be useful, but only if some + information can be passed which can then be used to explain or log + the error condition more clearly.

    + +

    To achieve this, when the error redirect is sent, additional + environment variables will be set, which will be generated from + the headers provided to the original request by prepending + 'REDIRECT_' onto the original header name. This provides the error + document the context of the original request.

    + +

    For example, you might receive, in addition to more usual + environment variables, the following.

    + +

    + REDIRECT_HTTP_ACCEPT=*/*, image/gif, image/jpeg, image/png
    + REDIRECT_HTTP_USER_AGENT=Mozilla/5.0 Fedora/3.5.8-1.fc12 Firefox/3.5.8
    + REDIRECT_PATH=.:/bin:/usr/local/bin:/sbin
    + REDIRECT_QUERY_STRING=
    + REDIRECT_REMOTE_ADDR=121.345.78.123
    + REDIRECT_REMOTE_HOST=client.example.com
    + REDIRECT_SERVER_NAME=www.example.edu
    + REDIRECT_SERVER_PORT=80
    + REDIRECT_SERVER_SOFTWARE=Apache/2.2.15
    + REDIRECT_URL=/cgi-bin/buggy.pl +

    + +

    REDIRECT_ environment variables are created from + the environment variables which existed prior to the + redirect. They are renamed with a REDIRECT_ + prefix, i.e., HTTP_USER_AGENT becomes + REDIRECT_HTTP_USER_AGENT.

    + +

    REDIRECT_URL, REDIRECT_STATUS, and + REDIRECT_QUERY_STRING are guaranteed to be set, and + the other headers will be set only if they existed prior to the + error condition.

    + +

    None of these will be + set if the ErrorDocument target is an + external redirect (anything starting with a + scheme name like http:, even if it refers to the same host + as the server).

    +
    top
    +
    +

    Customizing Error Responses

    + +

    If you point your ErrorDocument to some variety of + dynamic handler such as a server-side include document, CGI + script, or some variety of other handler, you may wish to use the + available custom environment variables to customize this + response.

    + +

    If the ErrorDocument specifies a local redirect to a CGI + script, the script should include a "Status:" + header field in its output in order to ensure the propagation + all the way back to the client of the error condition that + caused it to be invoked. For instance, a Perl ErrorDocument + script might include the following:

    + +
    ...
    +print  "Content-type: text/html\n";
    +printf "Status: %s Condition Intercepted\n", $ENV{"REDIRECT_STATUS"};
    +...
    + + +

    If the script is dedicated to handling a particular error + condition, such as 404 Not Found, it can + use the specific code and error text instead.

    + +

    Note that if the response contains Location: + header (in order to issue a client-side redirect), the script + must emit an appropriate Status: header + (such as 302 Found). Otherwise the + Location: header may have no effect.

    + +
    top
    +
    +

    Multi Language Custom Error Documents

    + +

    Provided with your installation of the Apache HTTP Server is a + directory of custom error documents translated into 16 different + languages. There's also a configuration file in the + conf/extra configuration directory that can be included + to enable this feature.

    + +

    In your server configuration file, you'll see a line such as:

    + +
    # Multi-language error messages
    +#Include conf/extra/httpd-multilang-errordoc.conf
    + + +

    Uncommenting this Include line will enable this + feature, and provide language-negotiated error messages, based on + the language preference set in the client browser.

    + +

    Additionally, these documents contain various of the + REDIRECT_ variables, so that additional information can + be provided to the end-user about what happened, and what they can + do now.

    + +

    These documents can be customized to whatever degree you wish to + provide more useful information to users about your site, and what + they can expect to find there.

    + +

    mod_include and mod_negotiation + must be enabled to use this feature.

    + +
    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/custom-error.html.es b/docs/manual/custom-error.html.es new file mode 100644 index 0000000..e19197e --- /dev/null +++ b/docs/manual/custom-error.html.es @@ -0,0 +1,249 @@ + + + + + +Respuestas de error personalizadas - Servidor HTTP Apache Versión 2.4 + + + + + + + +
    <-
    +

    Respuestas de error personalizadas

    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Apache ofrece la posibilidad de que los webmasters puedan + configurar las respuestas que muestra el servidor Apache cuando se + producen algunos errores o problemas.

    + +

    Las respuestas personalizadas pueden definirse para activarse + en caso de que el servidor detecte un error o problema.

    + +

    Si un script termina de forma anormal y se produce una respuesta + "500 Server Error", esta respuesta puede ser sustituida por otro + texto de su elección o por una redirección a otra URL + (local o externa).

    +
    + +
    top
    +
    +

    Comportamiento

    + + +

    Comportamiento anterior

    + + +

    NCSA httpd 1.3 devolvía mensajes antiguos del error o + problema encontrado que con frecuencia no tenían + significado alguno para el usuario, y que no incluían en + los logs información que diera pistas sobre las causas de + lo sucedido.

    + + +

    Comportamiento actual

    + + +

    Se puede hacer que el servidor siga uno de los siguientes + comportamientos:

    + +
      +
    1. Desplegar un texto diferente, en lugar de los mensajes de + la NCSA, o
    2. + +
    3. redireccionar la petición a una URL local, o
    4. + +
    5. redireccionar la petición a una URL externa.
    6. +
    + +

    Redireccionar a otra URL puede resultar de utilidad, pero + solo si con ello se puede también pasar alguna + información que pueda explicar el error o problema y/o + registrarlo en el log correspondiente más claramente.

    + +

    Para conseguir esto, Apache define ahora variables de entorno + similares a las de los CGI:

    + +

    + REDIRECT_HTTP_ACCEPT=*/*, image/gif, image/x-xbitmap, + image/jpeg
    + REDIRECT_HTTP_USER_AGENT=Mozilla/1.1b2 (X11; I; HP-UX A.09.05 + 9000/712)
    + REDIRECT_PATH=.:/bin:/usr/local/bin:/etc
    + REDIRECT_QUERY_STRING=
    + REDIRECT_REMOTE_ADDR=121.345.78.123
    + REDIRECT_REMOTE_HOST=ooh.ahhh.com
    + REDIRECT_SERVER_NAME=crash.bang.edu
    + REDIRECT_SERVER_PORT=80
    + REDIRECT_SERVER_SOFTWARE=Apache/0.8.15
    + REDIRECT_URL=/cgi-bin/buggy.pl +

    + +

    Tenga en cuenta el prefijo REDIRECT_.

    + +

    Al menos REDIRECT_URL y + REDIRECT_QUERY_STRING se pasarán a la nueva + URL (asumiendo que es un cgi-script o un cgi-include). Las otras + variables existirán solo si existían antes de aparecer + el error o problema. Ninguna de estas variables + se creará si en la directiva ErrorDocument ha especificado una + redirección externa (cualquier cosa que empiece + por un nombre de esquema del tipo http:, incluso si + se refiere al mismo servidor).

    + +
    top
    +
    +

    Configuración

    + + +

    El uso de ErrorDocument + está activado para los ficheros .htaccess cuando AllowOverride tiene el valor + adecuado.

    + +

    Aquí hay algunos ejemplos más...

    + +

    + ErrorDocument 500 /cgi-bin/crash-recover
    + ErrorDocument 500 "Sorry, our script crashed. Oh dear"
    + ErrorDocument 500 http://xxx/
    + ErrorDocument 404 /Lame_excuses/not_found.html
    + ErrorDocument 401 /Subscription/how_to_subscribe.html +

    + +

    La sintaxis es,

    + +

    + ErrorDocument <3-digit-code> <action> +

    + +

    donde action puede ser,

    + +
      +
    1. Texto a mostrar. Ponga antes del texto que quiere que se + muestre unas comillas ("). Lo que sea que siga a las comillas se + mostrará. Nota: las comillas (") no se + muestran.
    2. + +
    3. Una URL local a la que se redireccionará la + petición.
    4. + +
    5. Una URL externa a la que se redireccionará la + petición.
    6. +
    +
    top
    +
    +

    Mesajes de error personalizados y redirecciones

    + + +

    El comportamiento de Apache en cuanto a las redirecciones ha + cambiado para que puedan usarse más variables de entorno con + los script/server-include.

    + +

    Antiguo comportamiento

    + + +

    Las variables CGI estándar estaban disponibles para el + script al que se hacía la redirección. No se incluía + ninguna indicación sobre la precedencia de la + redirección.

    + + +

    Nuevo comportamiento

    + + +

    Un nuevo grupo de variables de entorno se inicializa para que + las use el script al que ha sido redireccionado. Cada + nueva variable tendrá el prefijo REDIRECT_. + Las variables de entorno REDIRECT_ se crean a + partir de de las variables de entorno CGI que existen antes de + la redirección, se les cambia el nombre + añadiéndoles el prefijo REDIRECT_, por + ejemplo, HTTP_USER_AGENT pasa a ser + REDIRECT_HTTP_USER_AGENT. Además, para esas + nuevas variables, Apache definirá REDIRECT_URL + y REDIRECT_STATUS para ayudar al script a seguir su + origen. Tanto la URL original como la URL a la que es redirigida + la petición pueden almacenarse en los logs de acceso.

    + +

    Si ErrorDocument especifica una redirección local a un + script CGI, el script debe incluir una campo de cabeceraa + "Status:" en el resultado final para asegurar que + es posible hacer llegar al cliente de vuelta la condición + de error que lo provocó. Por ejemplo, un script en Perl + para usar con ErrorDocument podría incluir lo + siguiente:

    + +

    + ...
    + print "Content-type: text/html\n";
    + printf "Status: %s Condition Intercepted\n", $ENV{"REDIRECT_STATUS"};
    + ... +

    + +

    Si el script tiene como fin tratar una determinada + condición de error, por ejemplo + 404 Not Found, se pueden usar los + códigos de error y textos específicos en su lugar.

    + +

    Tenga en cuenta que el script debe incluir un campo + de cabecera Status: apropiado (como + 302 Found), si la respuesta contiene un campo de + cabecera Location: (para poder enviar una + redirección que se interprete en el cliente). De otra + manera, la cabecera + Location: puede que no tenga efecto.

    + +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comentarios

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/custom-error.html.fr.utf8 b/docs/manual/custom-error.html.fr.utf8 new file mode 100644 index 0000000..0f5e897 --- /dev/null +++ b/docs/manual/custom-error.html.fr.utf8 @@ -0,0 +1,250 @@ + + + + + +Messages d'erreur personnalisés - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Messages d'erreur personnalisés

    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Le serveur HTTP Apache fournit des messages d'erreur génériques + pour les codes de statut 4xx ou 5xx ; ces messages sont cependant + relativement austères, imprécis, et peuvent s'avérer intimidants + pour les visiteurs du site. Si vous le souhaitez, vous pouvez + afficher des messages d'erreur plus conviviaux, dans un langage + autre que l'anglais, ou même sous une forme plus en adéquation avec + le style de votre site.

    + +

    Il est possible de définir des messages d'erreur personnalisés + pour chaque code de statut HTTP associé à une condition d'erreur - + c'est à dire tout code de statut 4xx ou 5xx.

    + +

    De plus, il est possible de + personnaliser le message d'erreur en fonction d'un jeu de valeurs + fourni, en utilisant les Inclusions Côté + Serveur (SSI). Un programme CGI ou un autre gestionnaire + dynamique (PHP, mod_perl, etc...) peut aussi utiliser ces variables + pour gérer les conditions d'erreur.

    + + +
    + +
    top
    +
    +

    Configuration

    + +

    Les messages d'erreur personnalisés sont configurés via la + directive ErrorDocument, qui + peut être utilisée dans un contexte global, serveur virtuel ou + répertoire. On peut utiliser cette directive dans les fichiers + .htaccess si AllowOverride est + définie à FileInfo.

    + +
    ErrorDocument 500 "Désolé, notre script s'est
    +crashé ; comme c'est dommage !"
    +ErrorDocument 500 /cgi-bin/crash-recover
    +ErrorDocument 500 http://error.example.com/server_error.html
    +ErrorDocument 404 /errors/not_found.html 
    +ErrorDocument 401 /subscription/how_to_subscribe.html
    + + +

    La syntaxe de la directive ErrorDocument est :

    +
    ErrorDocument <code_3_chiffres> <action>
    + +

    où action peut être traitée comme :

    +
      +
    1. Une URL de redirection local (si l'action commence par un "/").
    2. +
    3. Une URL de redirection externe (si action est une URL valide).
    4. +
    5. Le texte à afficher (si l'action ne répond à aucune des + deux conditions précédentes). Entourez le texte de guillemets (") + s'il contient plusieurs mots.
    6. +
    + +

    Dans le cas d'une redirection vers une URL locale, des variables + d'environnement supplémentaires sont définies de façon à ce que la + réponse puisse être personnalisée par la suite. Elles ne sont pas + envoyées aux URLs externes.

    + +
    top
    +
    +

    Variables disponibles

    + +

    La redirection vers une autre URL peut être utile, mais + seulement s'il est possible de transmettre certaines informations + qui pourront être utilisées pour expliquer ou journaliser + la condition d'erreur ou le problème plus clairement.

    + +

    Pour y parvenir, lorsque la redirection d'erreur est envoyée, + des variables d'environnement supplémentaires sont définies à + partir des en-têtes de la requête originale en préfixant le nom + d'origine de l'en-tête par 'REDIRECT_', ce qui permet de fournir au + message d'erreur le contexte de la requête originelle.

    + +

    Par exemple, en plus des variables d'environnement habituelles, + vous pouvez recevoir ce qui suit :

    + + +

    + REDIRECT_HTTP_ACCEPT=*/*, image/gif, image/jpeg, image/png
    + REDIRECT_HTTP_USER_AGENT=Mozilla/5.0 Fedora/3.5.8-1.fc12 Firefox/3.5.8
    + REDIRECT_PATH=.:/bin:/usr/local/bin:/sbin
    + REDIRECT_QUERY_STRING=
    + REDIRECT_REMOTE_ADDR=121.345.78.123
    + REDIRECT_REMOTE_HOST=client.example.com
    + REDIRECT_SERVER_NAME=www.example.edu
    + REDIRECT_SERVER_PORT=80
    + REDIRECT_SERVER_SOFTWARE=Apache/2.2.15
    + REDIRECT_URL=/cgi-bin/buggy.pl +

    + +

    Les variables d'environnement REDIRECT_ sont + créées à partir des variables d'environnement préexistantes à la + redirection qui sont préfixées par la chaîne REDIRECT_ ; + par exemple, HTTP_USER_AGENT devient + REDIRECT_HTTP_USER_AGENT.

    + +

    REDIRECT_URL, REDIRECT_STATUS, et + REDIRECT_QUERY_STRING sont systématiquement définies, + les autres variables n'étant définies que si l'en-tête + correspondant existait avant la condition d'erreur.

    + +

    Aucune d'entre elles ne sera définie si votre + directive ErrorDocument + spécifie une redirection externe (toute URL commençant + par un protocole du style http:, même si elle fait + référence au même hôte que le serveur).

    + +
    top
    +
    +

    Personnalisation des messages d'erreur

    + + +

    Si vous faites pointer votre directive + ErrorDocument vers certains gestionnaires + dynamiques comme les inclusions côté serveur, les scripts CGI ou + d'autres gestionnaires, vous pouvez utiliser les variables + d'environnement supplémentaires disponibles pour personnaliser + le message.

    + + +

    Si la directive ErrorDname-basedocument spécifie une redirection locale + vers un script CGI, ce dernier doit ajouter un en-tête + "Status:" dans sa sortie afin de s'assurer du bon + acheminement jusqu'au client de la condition d'erreur qui a + provoqué cette redirection. Par exemple, un script Perl spécifié + par une directive ErrorDocument pourrait contenir ce qui suit + :

    + +
    ...
    +print  "Content-type: text/html\n"; 
    +printf "Status: %s Condition Intercepted\n", $ENV{"REDIRECT_STATUS"}; 
    +...
    + + +

    Si un script est dédié à la gestion d'une condition d'erreur + spécifique, telle que 404 Not Found, il + peut utiliser le code et le texte de l'erreur spécifiques à la + place.

    + +

    Notez que si la réponse contient un en-tête + Location: (afin d'initier une redirection côté + client), le script doit émettre un en-tête approprié + (comme 302 Found). Dans le cas contraire, + l'en-tête Location: ne produira aucun effet.

    +
    top
    +
    +

    Messages d'erreur personnalisés + multilingues

    + +

    Vous trouverez dans la distribution du serveur HTTP Apache un + répertoire contenant des messages d'erreur personnalisés traduits en + 16 langues différentes. Pour activer cette fonctionnalité, vous + pouvez aussi inclure un fichier de configuration qui se trouve dans + le répertoire de configuration conf/extra.

    + +

    Dans le fichier de configuration de votre serveur, vous trouverez + un groupe de lignes du style :

    + +
        # Multi-language error messages
    +    #Include conf/extra/httpd-multilang-errordoc.conf
    + + +

    Décommentez la ligne Include pour activer cette + fonctionnalité, et présenter des messages d'erreur dont le langage + sera négocié en fonction du langage préféré défini au niveau du + navigateur du client.

    + +

    De plus, ces documents contiennent diverses variables + REDIRECT_, de façon à ce que l'utilisateur final + dispose d'informations supplémentaires à propos de ce qui a pu se + produire, et de ce qu'il est susceptible de faire maintenant.

    + +

    Ces documents peuvent être personnalisés en fournissant autant + d'informations utiles que vous le souhaitez aux utilisateurs à + propos de votre site, et de ce qu'ils sont susceptibles d'y trouver.

    + +

    Pour pouvoir utiliser cette fonctionnalité, vous devez activer + mod_include et mod_negotiation.

    + +
    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/custom-error.html.ja.utf8 b/docs/manual/custom-error.html.ja.utf8 new file mode 100644 index 0000000..e8cea7b --- /dev/null +++ b/docs/manual/custom-error.html.ja.utf8 @@ -0,0 +1,229 @@ + + + + + +カスタムエラーレスãƒãƒ³ã‚¹ - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    カスタムエラーレスãƒãƒ³ã‚¹

    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + +

    ウェブマスターãŒä½•らã‹ã®ã‚¨ãƒ©ãƒ¼ã‚„å•題ã«å¯¾ã™ã‚‹ + Apache ã®å応を設定ã§ãるよã†ã«ã™ã‚‹è¿½åŠ æ©Ÿèƒ½ã‚’æä¾›ã—ã¾ã™ã€‚

    + +

    サーãƒãŒã‚¨ãƒ©ãƒ¼ã‚„å•題を発見ã—ãŸå ´åˆã®å応を〠+ カスタマイズã—ã¦å®šç¾©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    スクリプトã®å®Ÿè¡ŒãŒå¤±æ•—ã—㦠"500 Server Error" + を発生ã•ã›ãŸã¨ã—ã¾ã™ã€‚ã“ã®å ´åˆã®å応をã€ã‚ˆã‚Šå¥½ã¾ã—ã„テキストやã€åˆ¥ã® + URL (内部åŠã³å¤–部) ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã«ç½®ãæ›ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +

    +
    + +
    top
    +
    +

    動作

    + + +

    å¤ã„動作

    + + +

    NCSA httpd 1.3 ã¯ã€å¤ãã¦é€€å±ˆãªã‚¨ãƒ©ãƒ¼/å•題メッセージを + è¿”ã—ã¦ã„ã¾ã—ãŸã€‚ãれã¯ã—ã°ã—ã°ãƒ¦ãƒ¼ã‚¶ã«ã¯ç„¡æ„味ã§ã‚り〠+ ã¾ãŸãれを発生ã•ã›ãŸåŽŸå› ã‚’è¨˜éŒ²ã™ã‚‹æ–¹æ³•ã‚‚æä¾›ã—ã¦ã„ã¾ã›ã‚“ã§ã—ãŸã€‚

    + + +

    æ–°ã—ã„動作

    + + +
      +
    1. NCSA ã®ãƒãƒ¼ãƒ‰ã‚³ãƒ¼ãƒ‰ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä»£ã‚り㫠+ ä»–ã®ãƒ†ã‚­ã‚¹ãƒˆã‚’表示
    2. + +
    3. ローカル㮠URL ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ
    4. + +
    5. 外部㮠URL ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ
    6. +
    + +

    ã™ã‚‹ã‚ˆã†ã«ã‚µãƒ¼ãƒã‚’設定ã§ãã¾ã™ã€‚

    + +

    別㮠URL ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã™ã‚‹ã“ã¨ã¯å½¹ã«ç«‹ã¡ã¾ã™ãŒã€ + ãれã¯èª¬æ˜Žã‚’ã—ãŸã‚Šã€ã‚ˆã‚Šæ˜Žç¢ºã«èª¤ã‚Š/å•題を記録ã—ãŸã‚Šã™ã‚‹ãŸã‚ã« + ä½•ã‹æƒ…報をä¼ãˆã‚‰ã‚Œã‚‹ã¨ãã«é™ã‚Šã¾ã™ã€‚

    + +

    ã“れを実ç¾ã™ã‚‹ãŸã‚ã«ã€ Apache ã¯æ–°ã—ã CGI ã®ã‚ˆã†ãªç’°å¢ƒå¤‰æ•°ã‚’ + 定義ã—ã¾ã™:

    + +

    + REDIRECT_HTTP_ACCEPT=*/*, image/gif, + image/x-xbitmap, image/jpeg
    + REDIRECT_HTTP_USER_AGENT=Mozilla/1.1b2 (X11; I; HP-UX + A.09.05 9000/712)
    + REDIRECT_PATH=.:/bin:/usr/local/bin:/etc
    + REDIRECT_QUERY_STRING=
    + REDIRECT_REMOTE_ADDR=121.345.78.123
    + REDIRECT_REMOTE_HOST=ooh.ahhh.com
    + REDIRECT_SERVER_NAME=crash.bang.edu
    + REDIRECT_SERVER_PORT=80
    + REDIRECT_SERVER_SOFTWARE=Apache/0.8.15
    + REDIRECT_URL=/cgi-bin/buggy.pl +

    + +

    é ­ã«ä»˜ã REDIRECT_ ã«æ³¨ç›®ã—ã¦ãã ã•ã„。

    + +

    å°‘ãªãã¨ã‚‚ REDIRECT_URL 㨠+ REDIRECT_QUERY_STRING ã¯æ–°ã—ã„ URL (CGI スクリプト㋠+ CGI インクルードã§ã‚ã‚‹ã¨ä»®å®šã•れã¾ã™) ã«æ¸¡ã•れã¾ã™ã€‚ + ä»–ã®å¤‰æ•°ã¯ã€ã‚¨ãƒ©ãƒ¼ã‚„å•題ãŒèµ·ãã‚‹å‰ã«å­˜åœ¨ã—ãŸå ´åˆã«ã ã‘存在ã—ã¾ã™ã€‚ + ã‚‚ã—ã‚ãªãŸã®è¨­å®šã—㟠ErrorDocument ㌠外部リダイレクト + (ã™ãªã‚ã¡ã€http: + ã®ã‚ˆã†ãªä½“ç³»åã‹ã‚‰å§‹ã¾ã‚‹ã™ã¹ã¦ã®ã‚‚ã®ã€‚ãŸã¨ãˆåŒã˜ãƒ›ã‚¹ãƒˆã‚’指ã—ã¦ã„ã¦ã‚‚) + ãªã‚‰ã°ã€ã“れらã¯ã¾ã£ãŸã設定ã•れã¾ã›ã‚“。

    + +
    top
    +
    +

    設定

    + + +

    AllowOverride ãŒé©åˆ‡ã«è¨­å®šã•れã¦ã„れã°ã€ + .htaccess ファイル㧠ErrorDocument + を使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    ã“ã“ã«ã€ã„ãã¤ã‹ã®ä¾‹ã‚’挙ã’ã¾ã™ã€‚

    + +

    + ErrorDocument 500 /cgi-bin/crash-recover
    + ErrorDocument 500 "Sorry, our script crashed. Oh dear"
    + ErrorDocument 500 http://xxx/
    + ErrorDocument 404 /Lame_excuses/not_found.html
    + ErrorDocument 401 /Subscription/how_to_subscribe.html +

    + +

    æ§‹æ–‡

    + +

    + ErrorDocument <3-digit-code> <action> +

    + +

    action (動作) ã¯ã€ä¸‹è¨˜ã®ã„ãšã‚Œã‹ã§ã™

    + +
      +
    1. 表示ã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆã€‚テキストã¯å¼•用符 (") ã§å›²ã‚“ã§æŒ‡å®šã—ã¾ã™ã€‚
    2. + +
    3. リダイレクト先ã®å¤–部 URL
    4. + +
    5. リダイレクト先ã®ãƒ­ãƒ¼ã‚«ãƒ« URL
    6. +
    +
    top
    +
    +

    カスタムエラーレスãƒãƒ³ã‚¹ã¨ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ

    + + +

    スクリプト/SSI ã«è¿½åŠ ã®ç’°å¢ƒå¤‰æ•°ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚‹ã‚ˆã†ã«ã€ + リダイレクトã•れ㟠URL ã«å¯¾ã™ã‚‹ Apache ã®å‹•作ãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚

    + +

    å¤ã„動作

    + + +

    リダイレクトã•れãŸã‚¹ã‚¯ãƒªãƒ—ãƒˆã¯æ¨™æº–ã® CGI + 環境変数を利用å¯èƒ½ã§ã—ãŸã€‚ã—ã‹ã—ã€ã©ã“ã‹ã‚‰ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ + ã•れãŸã‹ã®æƒ…å ±ã¯æä¾›ã•れã¦ã„ã¾ã›ã‚“ã§ã—ãŸã€‚

    + + +

    æ–°ã—ã„動作

    + + +

    リダイレクトã•れãŸå…ˆã®ã‚¹ã‚¯ãƒªãƒ—トãŒä½¿ç”¨å¯èƒ½ãªã‚ˆã†ã«ã€ + æ–°ã—ã„ãŸãã•ã‚“ã®ç’°å¢ƒå¤‰æ•°ãŒåˆæœŸåŒ–ã•れã¾ã™ã€‚æ–°ã—ã„変数ã¯ã€ãれãžã‚Œ + REDIRECT_ ã§å§‹ã¾ã‚Šã¾ã™ã€‚ + REDIRECT_ ã§å§‹ã¾ã‚‹ç’°å¢ƒå¤‰æ•°ã¯ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã•れるå‰ã«å­˜åœ¨ã—ã¦ã„㟠+ CGI 環境変数ã®é ­ã« REDIRECT_ を付ã‘ã¦ä½œæˆã•れã¾ã™ã€‚ + ã™ãªã‚ã¡ã€HTTP_USER_AGENT 㯠+ REDIRECT_HTTP_USER_AGENT ã«ãªã‚Šã¾ã™ã€‚ + ã“ã‚Œã‚‰ã®æ–°ã—ã„変数ã«åŠ ãˆã¦ã€Apache ã¯ã€ + スクリプトãŒãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆå…ƒã®ãƒˆãƒ¬ãƒ¼ã‚¹ã‚’助ã‘ã‚‹ãŸã‚ã« + REDIRECT_URL 㨠REDIRECT_STATUS + を定義ã—ã¾ã™ã€‚アクセスログã«ã¯å…ƒã® URL ã¨ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã•れ㟠URL + ã®ä¸¡æ–¹ãŒè¨˜éŒ²ã•れã¾ã™ã€‚

    + +

    ErrorDocument ㌠CGI スクリプトã¸ã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’ + 指定ã—ã¦ã„ã‚‹å ´åˆã¯ã€ãれを起動ã™ã‚‹ã“ã¨ã«ãªã£ãŸã‚¨ãƒ©ãƒ¼ã®çŠ¶æ…‹ã‚’ + クライアントã¾ã§ç¢ºå®Ÿã«ä¼ãˆã‚‹ãŸã‚ã« "Status:" + ヘッダをå«ã‚€ã¹ãã§ã™ã€‚例ãˆã°ã€ErrorDocument 用㮠Perl + スクリプトã¯ä»¥ä¸‹ã®ã‚ˆã†ãªã‚‚ã®ã‚’å«ã‚€ã‹ã‚‚ã—れã¾ã›ã‚“。 +

    + +

    + ...
    + print "Content-type: text/html\n";
    + printf "Status: %s Condition Intercepted\n", $ENV{"REDIRECT_STATUS"};
    + ... +

    + +

    スクリプト㌠404 Not Found ã®ã‚ˆã†ãª + 特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ³ãƒ‡ã‚£ã‚·ãƒ§ãƒ³ã‚’扱ã†ãŸã‚ã ã‘ã«ä½¿ã‚れる場åˆã¯ã€ + 代ã‚りã«ç‰¹å®šã®ã‚³ãƒ¼ãƒ‰ã¨ã‚¨ãƒ©ãƒ¼ãƒ†ã‚­ã‚¹ãƒˆã‚’使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +
    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/custom-error.html.ko.euc-kr b/docs/manual/custom-error.html.ko.euc-kr new file mode 100644 index 0000000..8fb73a8 --- /dev/null +++ b/docs/manual/custom-error.html.ko.euc-kr @@ -0,0 +1,230 @@ + + + + + +»ç¿ëÀÚÁ¤ÀÇ ¿À·ù ÀÀ´ä - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    »ç¿ëÀÚÁ¤ÀÇ ¿À·ù ÀÀ´ä

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + +

    À¥¸¶½ºÅÍ´Â ¿À·ù³ª ¹®Á¦°¡ ¹ß»ýÇßÀ»¶§ ¾ÆÆÄÄ¡ÀÇ ÀÀ´äÀ» + ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.

    + +

    ¼­¹ö°¡ ¿À·ù³ª ¹®Á¦¸¦ ¹ß°ßÇßÀ»¶§ º¸³¾ »ç¿ëÀÚÁ¤ÀÇ ÀÀ´äÀ» + Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.

    + +

    ½ºÅ©¸³Æ®°¡ Á×Àº °æ¿ì "500 Server Error" ÀÀ´ä ´ë½Å »ç¿ëÀÚ¿¡°Ô + ´õ Ä£±ÙÇÑ ¹®±¸¸¦ »ç¿ëÇϰųª ´Ù¸¥ (°°Àº »çÀÌÆ®³ª ¿ÜºÎ »çÀÌÆ®ÀÇ) + URL·Î ¸®´ÙÀÌ·º¼ÇÀ» ÇÒ ¼ö ÀÖ´Ù.

    +
    + +
    top
    +
    +

    Çൿ

    + + +

    ÀÌÀü Çൿ

    + + +

    NCSA httpd 1.3Àº »ç¿ëÀÚ¿¡°Ô ¹«ÀǹÌÇϰí Áö·çÇÑ ¿À·ù¹®À» + º¸³Â´Ù. ¹®Á¦°¡ ¹ß»ýÇÑ ÀÌÀ¯¸¦ ·Î±×¿¡ ³²±æ ¼öµµ ¾ø¾ú´Ù.

    + + +

    »õ·Î¿î Çൿ

    + + +

    ¼­¹ö´Â ´ÙÀ½°ú °°Àº ÀÏÀ» ÇÒ ¼ö ÀÖ´Ù:

    + +
      +
    1. NCSAÀÇ °íÁ¤µÈ ¹®±¸ ´ë½Å ´Ù¸¥ ¹®±¸¸¦ º¸¿©Áְųª
    2. + +
    3. °°Àº »çÀÌÆ®ÀÇ URL·Î ¸®´ÙÀÌ·º¼ÇÇϰųª
    4. + +
    5. ¿ÜºÎ »çÀÌÆ®ÀÇ URL·Î ¸®´ÙÀÌ·º¼ÇÇÑ´Ù.
    6. +
    + +

    ´Ù¸¥ »çÀÌÆ®ÀÇ URL·Î ¸®´ÙÀÌ·º¼ÇÇÏ´Â °ÍÀÌ À¯¿ëÇÒ ¼ö ÀÖÁö¸¸, + ÀÌ °æ¿ì ¹®Á¦¸¦ ¼³¸íÇϰųª ·Î±×Çϴµ¥ ÇÊ¿äÇÑ Á¤º¸Áß ÀϺθ¸ + Àü´ÞµÈ´Ù.

    + +

    ¿À·ù¿¡ ´ëÇÑ Á¤º¸¸¦ Àü´ÞÇϱâÀ§ÇØ ¾ÆÆÄÄ¡´Â CGI½ÄÀÇ »õ·Î¿î + ȯ°æº¯¼ö¸¦ Á¤ÀÇÇÑ´Ù:

    + +

    + REDIRECT_HTTP_ACCEPT=*/*, image/gif, image/x-xbitmap, + image/jpeg
    + REDIRECT_HTTP_USER_AGENT=Mozilla/1.1b2 (X11; I; HP-UX A.09.05 + 9000/712)
    + REDIRECT_PATH=.:/bin:/usr/local/bin:/etc
    + REDIRECT_QUERY_STRING=
    + REDIRECT_REMOTE_ADDR=121.345.78.123
    + REDIRECT_REMOTE_HOST=ooh.ahhh.com
    + REDIRECT_SERVER_NAME=crash.bang.edu
    + REDIRECT_SERVER_PORT=80
    + REDIRECT_SERVER_SOFTWARE=Apache/0.8.15
    + REDIRECT_URL=/cgi-bin/buggy.pl +

    + +

    REDIRECT_ Á¢µÎ»ç¿¡ ÁÖ¸ñÇ϶ó.

    + +

    ÃÖ¼ÒÇÑ REDIRECT_URL°ú + REDIRECT_QUERY_STRINGÀº (cgi-script³ª + cgi-includeÀÏ) »õ URL·Î ³Ñ°ÜÁø´Ù. ´Ù¸¥ º¯¼ö´Â ¿À·ù°¡ + ¹ß»ýÇϱâ ÀÌÀü¿¡ (¿ªÁÖ; À̸§¿¡¼­ REDIRECT_¸¦ + »« ȯ°æº¯¼ö°¡) Á¸ÀçÇÑ °æ¿ì¿¡¸¸ ÀÖ´Ù. + ErrorDocument°¡ + ¿ÜºÎ·Î (°°Àº ¼­¹ö¶óµµ http:¿Í + °°Àº ½ºÅ´(scheme)À¸·Î ½ÃÀÛÇÑ´Ù¸é) ¸®´ÙÀÌ·º¼ÇÇÑ´Ù¸é + ÀÌÁß ¾î¶² °Íµµ ¼³Á¤µÇÁö ¾Ê´Â´Ù.

    + +
    top
    +
    +

    ¼³Á¤

    + + +

    AllowOverride°¡ + ÀûÀýÈ÷ ¼³Á¤µÇ¾ú´Ù¸é .htaccess ÆÄÀÏ¿¡¼­ + ErrorDocument¸¦ »ç¿ëÇÒ + ¼ö ÀÖ´Ù.

    + +

    ´ÙÀ½Àº ¿¹ÀÌ´Ù...

    + +

    + ErrorDocument 500 /cgi-bin/crash-recover
    + ErrorDocument 500 "Sorry, our script crashed. Oh dear"
    + ErrorDocument 500 http://xxx/
    + ErrorDocument 404 /Lame_excuses/not_found.html
    + ErrorDocument 401 /Subscription/how_to_subscribe.html +

    + +

    ¹®¹ýÀº,

    + +

    + ErrorDocument <3-digit-code> <action> +

    + +

    °¡´ÉÇÑ actionÀº,

    + +
      +
    1. Ãâ·ÂÇÒ ¹®±¸. µû¿ÈÇ¥ (")¸¦ ¹®±¸ ¾Õ¿¡ ºÙÀδÙ. µÚ¿¡ ³ª¿À´Â + µû¿ÈÇ¥´Â Ãâ·ÂµÈ´Ù. ÁÖÀÇ: ¾Õ¿¡ ºÙÀº µû¿ÈÇ¥ (")´Â Ãâ·ÂµÇÁö + ¾Ê´Â´Ù.
    2. + +
    3. ¸®´ÙÀÌ·º¼ÇÇÒ ¿ÜºÎ URL.
    4. + +
    5. ¸®´ÙÀÌ·º¼ÇÇÒ ³»ºÎ URL.
    6. +
    +
    top
    +
    +

    »ç¿ëÀÚÁ¤ÀÇ ¿À·ù ÀÀ´ä°ú ¸®´ÙÀÌ·º¼Ç

    + + +

    URL·Î ¸®´ÙÀÌ·º¼ÇÇÏ´Â ¾ÆÆÄÄ¡ ÇൿÀº + ½ºÅ©¸³Æ®/server-include¿¡ ȯ°æº¯¼ö¸¦ ´õ ³Ñ°ÜÁÖµµ·Ï º¯°æµÇ¾ú´Ù.

    + +

    ÀÌÀü Çൿ

    + + +

    ¸®´ÙÀÌ·º¼ÇµÇ´Â ½ºÅ©¸³Æ®¿¡ Ç¥ÁØ CGI º¯¼öµéÀÌ ³Ñ¾î°£´Ù. + ¾îµð¿¡¼­ ¸®´ÙÀÌ·º¼ÇÀÌ ÀϾ´ÂÁö ¾Ë ¼ö ¾ø´Ù.

    + + +

    »õ·Î¿î Çൿ

    + + +

    ¸®´ÙÀÌ·º¼ÇµÈ ½ºÅ©¸³Æ®´Â »õ·Î¿î ȯ°æº¯¼öµéÀ» »ç¿ëÇÒ + ¼ö ÀÖ´Ù. ¸ðµÎ ¾Õ¿¡ REDIRECT_°¡ ºÙ¾îÀÖ´Ù. + REDIRECT_ ȯ°æº¯¼ö´Â ¿ø·¡ CGI ȯ°æº¯¼ö¸í + ¾Õ¿¡ REDIRECT_¸¦ ºÙ¿©¼­ ¸¸µç´Ù. ¿¹¸¦ + µé¾î, HTTP_USER_AGENT´Â + REDIRECT_HTTP_USER_AGENT°¡ µÇ¾ú´Ù. ÀÌ·± º¯¼ö¿¡ + Ãß°¡·Î ½ºÅ©¸³Æ®°¡ ¿ø·¡ URLÀ» ¾Ëµµ·Ï ¾ÆÆÄÄ¡´Â + REDIRECT_URL°ú REDIRECT_STATUS¸¦ + Á¤ÀÇÇÑ´Ù. ¿ø·¡ URL°ú ¸®´ÙÀÌ·º¼ÇµÈ URL ¸ðµÎ Á¢±Ù ·Î±×¿¡ + ±â·ÏÇÒ ¼ö ÀÖ´Ù.

    + +

    ErrorDocument°¡ °°Àº ¼­¹ö¿¡ ÀÖ´Â CGI ½ºÅ©¸³Æ®·Î + ¸®´ÙÀÌ·º¼ÇÇÑ´Ù¸é, ½ºÅ©¸³Æ®´Â Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ¿À·ù »óȲÀ» + È®½ÇÈ÷ Àü´ÞÇϱâÀ§ÇØ Ãâ·Â¿¡ "Status:" Çì´õ + Çʵ带 Æ÷ÇÔÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î, Perl·Î ÀÛ¼ºÇÑ ErrorDocument + ½ºÅ©¸³Æ®´Â ´ÙÀ½°ú °°´Ù:

    + +

    + ...
    + print "Content-type: text/html\n";
    + printf "Status: %s Condition Intercepted\n", $ENV{"REDIRECT_STATUS"};
    + ... +

    + +

    404 Not Found¿Í °°Àº ƯÁ¤ ¿À·ù + »óȲ¿¡ ´ëÇÑ ½ºÅ©¸³Æ®¶ó¸é, ´ë½Å (¿ªÁÖ; °íÁ¤µÈ) + ƯÁ¤ »óÅÂÄÚµå¿Í ¿À·ù¹®À» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    (Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ¸®´ÙÀÌ·º¼ÇÀ» ¿äûÇϱâÀ§ÇØ) ÀÀ´ä¿¡ + Location: Çì´õ¸¦ Æ÷ÇÔÇÑ´Ù¸é, ½ºÅ©¸³Æ®´Â + ¹Ýµå½Ã (302 Found °°Àº) ÀûÀýÇÑ + Status: Çì´õ¸¦ Ãâ·ÂÇØ¾ß ÇÔÀ» ÁÖÀÇÇ϶ó. ±×·¸Áö¾ÊÀ¸¸é + Location: Çì´õ°¡ ¾Æ¹« ¼Ò¿ë¾ø°Ô µÉ ¼ö ÀÖ´Ù.

    + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/custom-error.html.tr.utf8 b/docs/manual/custom-error.html.tr.utf8 new file mode 100644 index 0000000..686df38 --- /dev/null +++ b/docs/manual/custom-error.html.tr.utf8 @@ -0,0 +1,233 @@ + + + + + +Hata Yanıtlarının Kişiselleştirilmesi - Apache HTTP Sunucusu Sürüm 2.4 + + + + + + + +
    <-
    +

    Hata Yanıtlarının Kişiselleştirilmesi

    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + + +

    Apache HTTP Sunucusu 4xx veya 5xx HTTP durum kodları ile ilgili + olaylarda soysal hata yanıtları üretse de bu yanıtlar site + kullanıcılarına aşırı sade, bilgi vermez ve hatta korkutucu gelebilir. + Daha dostça yazılmış, İngilizce değil de kendi dilinizde ve belki + sayfalarınızın yerleşimine uygun daha hoş satırlarda özel hata yanıtları + üretmek isteyebilirsiniz.

    + +

    Kişiselleştirilmiş hata yanıtları, bir hata durumuna göre tasarlanmış + herhangi bir HTTP durum kodu (yani 4xx ve 5xx kodlarından biri) için + tanımlanabilir.

    + +

    Ek olarak bir değer kümesi de sağlanmıştır. Böylece hata belgeleri, Sunucu taraflı İçerik Yerleştirme kullanılarak + bu değişkenlerin değerlerine göre özelleştirilebilir. İsterseniz bunun + yerine bir CGI programı veya devingen bir eylemci (PHP, mod_perl, vs.) + kullanarak da bu değişkenlerin değerlerine göre hata sayfalarınızı + üretebilirsiniz.

    + +
    + +
    top
    +
    +

    Yapılandırma

    + +

    Kişiselleştirilmiş hata belgeleri ErrorDocument yönergesi kullanılarak yapılandırılabilir. Bu + yönerge küresel bağlamda olabileceği gibi sanal konak ve dizin + bağlamlarında da kullanılabilir. AllowOverride yönergesine FileInfo + atanarak .htaccess dosyalarında da kullanılabilir.

    + +
    ErrorDocument 500 "Pardon, galiba bizim betik hata verdi."
    +ErrorDocument 500 /cgi-bin/hata-kurtarma
    +ErrorDocument 500 http://error.example.com/server_error.html
    +ErrorDocument 404 /ozuru_kabahatinden_buyuk/yok.html
    +ErrorDocument 401 /Uyeler/NASIL_uye_olunur.html
    + + +

    ErrorDocument yönergesinin sözdizimi:

    + +
    ErrorDocument <3-rakamlı-kod> <eylem>
    + + +

    eylem ÅŸunlardan biri olabilir:

    + +
      +
    1. Yönlendirmenin yapılacağı dahili adres (eylem bir "/" ile + başlıyorsa).
    2. +
    3. Yönlendirmenin yapılacağı harici adres (eylem geçerli bir + URL ise).
    4. +
    5. Gösterilecek metin (yukardakilerin hiçbiri yoksa). Birden fazla + sözcük içeriyorsa tırnak (") içine alınmalıdır.
    6. +
    + +

    Yerel bir adrese yönlendirme yapılırken ek ortam değişkenleri de + atanarak yanıt daha da özelleştirilebilir. Bunlar harici URL'lere + gönderilmez.

    + +
    top
    +
    +

    Kullanılabilen Değişkenler

    + +

    Hata durumunu açıklayacak veya hata günlüğüne daha açıkça + kaydedilebilecek bazı bilgilerin aktarılması koşuluyla, başka bir + adrese yönlendirme kullanışlı olabilir

    + +

    Hata yönlendirmesi yapılırken bunu sağlamak için ek ortam değişkenleri + tanımlanır. Bu değişkenlerin isimleri, özgün istekle sağlanan + başlık isimlerinin önüne 'REDIRECT_' dizgesi getirilerek üretilir. + Böylece özgün istek bağlamından hata belgesi üretilebilir.

    + +

    Örneğin, aşağıdaki gibi, daha yararlı olacak ek ortam değişkenleri + alabilirsiniz.

    + +

    + REDIRECT_HTTP_ACCEPT=*/*, image/gif, image/jpeg, image/png
    + REDIRECT_HTTP_USER_AGENT=Mozilla/5.0 Fedora/3.5.8-1.fc12 Firefox/3.5.8
    + REDIRECT_PATH=.:/bin:/usr/local/bin:/sbin
    + REDIRECT_QUERY_STRING=
    + REDIRECT_REMOTE_ADDR=121.345.78.123
    + REDIRECT_REMOTE_HOST=client.example.com
    + REDIRECT_SERVER_NAME=www.example.edu
    + REDIRECT_SERVER_PORT=80
    + REDIRECT_SERVER_SOFTWARE=Apache/2.2.15
    + REDIRECT_URL=/cgi-bin/buggy.pl +

    + +

    REDIRECT_ ortam değişkenleri, yönlendirme öncesi varolan + ortam değişkenlerinden üretilir. Bunlar önlerine REDIRECT_ + getirilerek yeniden isimlendirilir. Örneğin, + HTTP_USER_AGENT değişkeni + REDIRECT_HTTP_USER_AGENT haline gelir.

    + +

    REDIRECT_URL, REDIRECT_STATUS ve + REDIRECT_QUERY_STRING mutlaka atanır. Diğer başlıklarla + ilgili olanlar ise hata durumu öncesinde mevcut oldukları takdirde + üretilirler.

    + +

    Eğer ErrorDocument hedefi bir + harici yönlendirme ise bunların hiçbiri + üretilmez (sunucunun bulunduğu konağı hedeflese bile http: + ile başlayan herşey harici yönlendirme sayılır).

    +
    top
    +
    +

    Özel Hata Yanıtları

    + +

    Hata yanıtınızı üretmek için sunucu taraflı içerik yerleştirme, bir + CGI betiği veya başka bir eylemciyi devingen eylemci olarak + kullanıyorsanız, bu yanıtı özelleştirmek için bu kullanıma özel + üretilmiş ortam değişkenlerini kullanmak isteyebilirsiniz.

    + +

    ErrorDocument yönergesi bir CGI + betiğine bir yerel yönlendirme belirtiyorsa, hatanın kaynağı hakkında + istemciye bilgi vermek amacıyla betiğin çıktısında bir + "Status:" başlık alanına yer verilmelidir. Örneğin, bir + Perl betiği şunları içerebilirdi:

    + +
    ...
    +print  "Content-type: text/html\n";
    +printf "Status: %s durumu saptandı.\n", $ENV{"REDIRECT_STATUS"};
    +...
    + + +

    EÄŸer betik, 404 Not Found gibi, belli bir hata + durumunu ele almaya adanmışsa duruma özel kod ve hata metni + kullanılabilir.

    + +

    EÄŸer yanıt, (istemci taraflı yönlendirme yapılırken) bir + Location: baÅŸlığı da içeriyorsa betiÄŸin çıktıya uygun bir + Status: baÅŸlığı (302 Found) eklemesinin + gerekli oluÅŸuna dikkat ediniz. Aksi takdirde, Location: + baÅŸlığı etkisiz olabilir.

    + +
    top
    +
    +

    Çok Dilli Özel Hata Belgeleri

    + +

    Apache HTTP Sunucusunun kurulumunda, 16 dile çevrilmiş özel hata + iletileri belgeleri içeren bir dizin bulunmaktadır. Ayrıca, + conf/extra yaplandırma dizininde bu özelliği etkin kılmak + için yapılandırmaya dahil edilebilecek bir yapılandırma dosyası + vardır.

    + +

    Sunucu yapılandırma dosyanızda şöyle satırlar görebilirsiniz:

    + +
    # Multi-language error messages
    +#Include conf/extra/httpd-multilang-errordoc.conf
    + + +

    Bu Include satırını açıklama olmaktan çıkarırsanız + bu özelliği etkinleştirmiş olursunuz. Böylece, istemcinin tarayıcısında + belirtilmiş dil tercihine uygun dil uzlaşımlı hata iletileri + sağlanır.

    + +

    Ek olarak, bu belgeler çeşitli REDIRECT_ değişkenleri + içerir. Böylece, son kullanıcıya neler olduğu ve şimdi ne yapması + beklendiği hakkında ek bilgiler sağlanabilir.

    + +

    Bu belgeleri istediğiniz kadar özelleştirebilir, kullanıcıya siteniz + hakkında ve orada bulabilecekleri şeylere dair faydalı bilgiler de + sağlayabilirsiniz.

    + +

    Bu özelliği kullanmak için mod_include ve + mod_negotiation etkin kılınmalıdır.

    + +
    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Yorumlar

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/developer/API.html b/docs/manual/developer/API.html new file mode 100644 index 0000000..f178e90 --- /dev/null +++ b/docs/manual/developer/API.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: API.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/developer/API.html.en b/docs/manual/developer/API.html.en new file mode 100644 index 0000000..4308b60 --- /dev/null +++ b/docs/manual/developer/API.html.en @@ -0,0 +1,1245 @@ + + + + + +Apache 1.3 API notes - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Apache 1.3 API notes

    +
    +

    Available Languages:  en 

    +
    + +

    Warning

    +

    This document has not been updated to take into account changes made + in the 2.0 version of the Apache HTTP Server. Some of the information may + still be relevant, but please use it with care.

    +
    + +

    These are some notes on the Apache API and the data structures you have + to deal with, etc. They are not yet nearly complete, but hopefully, + they will help you get your bearings. Keep in mind that the API is still + subject to change as we gain experience with it. (See the TODO file for + what might be coming). However, it will be easy to adapt modules + to any changes that are made. (We have more modules to adapt than you + do).

    + +

    A few notes on general pedagogical style here. In the interest of + conciseness, all structure declarations here are incomplete -- the real + ones have more slots that I'm not telling you about. For the most part, + these are reserved to one component of the server core or another, and + should be altered by modules with caution. However, in some cases, they + really are things I just haven't gotten around to yet. Welcome to the + bleeding edge.

    + +

    Finally, here's an outline, to give you some bare idea of what's coming + up, and in what order:

    + + +
    + +
    top
    +
    +

    Basic concepts

    +

    We begin with an overview of the basic concepts behind the API, and how + they are manifested in the code.

    + +

    Handlers, Modules, and Requests

    +

    Apache breaks down request handling into a series of steps, more or + less the same way the Netscape server API does (although this API has a + few more stages than NetSite does, as hooks for stuff I thought might be + useful in the future). These are:

    + +
      +
    • URI -> Filename translation
    • +
    • Auth ID checking [is the user who they say they are?]
    • +
    • Auth access checking [is the user authorized here?]
    • +
    • Access checking other than auth
    • +
    • Determining MIME type of the object requested
    • +
    • `Fixups' -- there aren't any of these yet, but the phase is intended + as a hook for possible extensions like SetEnv, which don't really fit well elsewhere.
    • +
    • Actually sending a response back to the client.
    • +
    • Logging the request
    • +
    + +

    These phases are handled by looking at each of a succession of + modules, looking to see if each of them has a handler for the + phase, and attempting invoking it if so. The handler can typically do one + of three things:

    + +
      +
    • Handle the request, and indicate that it has done so by + returning the magic constant OK.
    • + +
    • Decline to handle the request, by returning the magic integer + constant DECLINED. In this case, the server behaves in all + respects as if the handler simply hadn't been there.
    • + +
    • Signal an error, by returning one of the HTTP error codes. This + terminates normal handling of the request, although an ErrorDocument may + be invoked to try to mop up, and it will be logged in any case.
    • +
    + +

    Most phases are terminated by the first module that handles them; + however, for logging, `fixups', and non-access authentication checking, + all handlers always run (barring an error). Also, the response phase is + unique in that modules may declare multiple handlers for it, via a + dispatch table keyed on the MIME type of the requested object. Modules may + declare a response-phase handler which can handle any request, + by giving it the key */* (i.e., a wildcard MIME type + specification). However, wildcard handlers are only invoked if the server + has already tried and failed to find a more specific response handler for + the MIME type of the requested object (either none existed, or they all + declined).

    + +

    The handlers themselves are functions of one argument (a + request_rec structure. vide infra), which returns an integer, + as above.

    + + +

    A brief tour of a module

    +

    At this point, we need to explain the structure of a module. Our + candidate will be one of the messier ones, the CGI module -- this handles + both CGI scripts and the ScriptAlias config file command. It's actually a great deal + more complicated than most modules, but if we're going to have only one + example, it might as well be the one with its fingers in every place.

    + +

    Let's begin with handlers. In order to handle the CGI scripts, the + module declares a response handler for them. Because of ScriptAlias, it also has handlers for the + name translation phase (to recognize ScriptAliased URIs), the type-checking phase (any + ScriptAliased request is typed + as a CGI script).

    + +

    The module needs to maintain some per (virtual) server information, + namely, the ScriptAliases in + effect; the module structure therefore contains pointers to a functions + which builds these structures, and to another which combines two of them + (in case the main server and a virtual server both have ScriptAliases declared).

    + +

    Finally, this module contains code to handle the ScriptAlias command itself. This particular + module only declares one command, but there could be more, so modules have + command tables which declare their commands, and describe where + they are permitted, and how they are to be invoked.

    + +

    A final note on the declared types of the arguments of some of these + commands: a pool is a pointer to a resource pool + structure; these are used by the server to keep track of the memory which + has been allocated, files opened, etc., either to service a + particular request, or to handle the process of configuring itself. That + way, when the request is over (or, for the configuration pool, when the + server is restarting), the memory can be freed, and the files closed, + en masse, without anyone having to write explicit code to track + them all down and dispose of them. Also, a cmd_parms + structure contains various information about the config file being read, + and other status information, which is sometimes of use to the function + which processes a config-file command (such as ScriptAlias). With no further ado, the + module itself:

    + +

    + /* Declarations of handlers. */
    +
    + int translate_scriptalias (request_rec *);
    + int type_scriptalias (request_rec *);
    + int cgi_handler (request_rec *);
    +
    + /* Subsidiary dispatch table for response-phase
    +  * handlers, by MIME type */
    +
    + handler_rec cgi_handlers[] = {
    + + { "application/x-httpd-cgi", cgi_handler },
    + { NULL }
    +
    + };
    +
    + /* Declarations of routines to manipulate the
    +  * module's configuration info. Note that these are
    +  * returned, and passed in, as void *'s; the server
    +  * core keeps track of them, but it doesn't, and can't,
    +  * know their internal structure.
    +  */
    +
    + void *make_cgi_server_config (pool *);
    + void *merge_cgi_server_config (pool *, void *, void *);
    +
    + /* Declarations of routines to handle config-file commands */
    +
    + extern char *script_alias(cmd_parms *, void *per_dir_config, char *fake, + char *real);
    +
    + command_rec cgi_cmds[] = {
    + + { "ScriptAlias", script_alias, NULL, RSRC_CONF, TAKE2,
    + "a fakename and a realname"},
    + { NULL }
    +
    + };
    +
    + module cgi_module = { +

      STANDARD_MODULE_STUFF,
    +  NULL,                     /* initializer */
    +  NULL,                     /* dir config creator */
    +  NULL,                     /* dir merger */
    +  make_cgi_server_config,   /* server config */
    +  merge_cgi_server_config,  /* merge server config */
    +  cgi_cmds,                 /* command table */
    +  cgi_handlers,             /* handlers */
    +  translate_scriptalias,    /* filename translation */
    +  NULL,                     /* check_user_id */
    +  NULL,                     /* check auth */
    +  NULL,                     /* check access */
    +  type_scriptalias,         /* type_checker */
    +  NULL,                     /* fixups */
    +  NULL,                     /* logger */
    +  NULL                      /* header parser */
    +};
    + +
    top
    +
    +

    How handlers work

    +

    The sole argument to handlers is a request_rec structure. + This structure describes a particular request which has been made to the + server, on behalf of a client. In most cases, each connection to the + client generates only one request_rec structure.

    + +

    A brief tour of the request_rec

    +

    The request_rec contains pointers to a resource pool + which will be cleared when the server is finished handling the request; + to structures containing per-server and per-connection information, and + most importantly, information on the request itself.

    + +

    The most important such information is a small set of character strings + describing attributes of the object being requested, including its URI, + filename, content-type and content-encoding (these being filled in by the + translation and type-check handlers which handle the request, + respectively).

    + +

    Other commonly used data items are tables giving the MIME headers on + the client's original request, MIME headers to be sent back with the + response (which modules can add to at will), and environment variables for + any subprocesses which are spawned off in the course of servicing the + request. These tables are manipulated using the ap_table_get + and ap_table_set routines.

    + +
    +

    Note that the Content-type header value cannot + be set by module content-handlers using the ap_table_*() + routines. Rather, it is set by pointing the content_type + field in the request_rec structure to an appropriate + string. e.g.,

    +

    + r->content_type = "text/html"; +

    +
    + +

    Finally, there are pointers to two data structures which, in turn, + point to per-module configuration structures. Specifically, these hold + pointers to the data structures which the module has built to describe + the way it has been configured to operate in a given directory (via + .htaccess files or <Directory> sections), for private data it has built in the + course of servicing the request (so modules' handlers for one phase can + pass `notes' to their handlers for other phases). There is another such + configuration vector in the server_rec data structure pointed + to by the request_rec, which contains per (virtual) server + configuration data.

    + +

    Here is an abridged declaration, giving the fields most commonly + used:

    + +

    + struct request_rec {
    +
    + pool *pool;
    + conn_rec *connection;
    + server_rec *server;
    +
    + /* What object is being requested */
    +
    + char *uri;
    + char *filename;
    + char *path_info; +

    char *args;           /* QUERY_ARGS, if any */
    +struct stat finfo;    /* Set by server core;
    +                       * st_mode set to zero if no such file */

    + char *content_type;
    + char *content_encoding;
    +
    + /* MIME header environments, in and out. Also,
    +  * an array containing environment variables to
    +  * be passed to subprocesses, so people can write
    +  * modules to add to that environment.
    +  *
    +  * The difference between headers_out and
    +  * err_headers_out is that the latter are printed
    +  * even on error, and persist across internal
    +  * redirects (so the headers printed for
    +  * ErrorDocument handlers will have + them).
    +  */
    +
    + table *headers_in;
    + table *headers_out;
    + table *err_headers_out;
    + table *subprocess_env;
    +
    + /* Info about the request itself... */
    +
    +

    int header_only;     /* HEAD request, as opposed to GET */
    +char *protocol;      /* Protocol, as given to us, or HTTP/0.9 */
    +char *method;        /* GET, HEAD, POST, etc. */
    +int method_number;   /* M_GET, M_POST, etc. */

    + /* Info for logging */
    +
    + char *the_request;
    + int bytes_sent;
    +
    + /* A flag which modules can set, to indicate that
    +  * the data being returned is volatile, and clients
    +  * should be told not to cache it.
    +  */
    +
    + int no_cache;
    +
    + /* Various other config info which may change
    +  * with .htaccess files
    +  * These are config vectors, with one void*
    +  * pointer for each module (the thing pointed
    +  * to being the module's business).
    +  */
    +
    +

    void *per_dir_config;   /* Options set in config files, etc. */
    +void *request_config;   /* Notes on *this* request */

    + }; +

    + + +

    Where request_rec structures come from

    +

    Most request_rec structures are built by reading an HTTP + request from a client, and filling in the fields. However, there are a + few exceptions:

    + +
      +
    • If the request is to an imagemap, a type map (i.e., a + *.var file), or a CGI script which returned a local + `Location:', then the resource which the user requested is going to be + ultimately located by some URI other than what the client originally + supplied. In this case, the server does an internal redirect, + constructing a new request_rec for the new URI, and + processing it almost exactly as if the client had requested the new URI + directly.
    • + +
    • If some handler signaled an error, and an ErrorDocument + is in scope, the same internal redirect machinery comes into play.
    • + +
    • Finally, a handler occasionally needs to investigate `what would + happen if' some other request were run. For instance, the directory + indexing module needs to know what MIME type would be assigned to a + request for each directory entry, in order to figure out what icon to + use.

      + +

      Such handlers can construct a sub-request, using the + functions ap_sub_req_lookup_file, + ap_sub_req_lookup_uri, and ap_sub_req_method_uri; + these construct a new request_rec structure and processes it + as you would expect, up to but not including the point of actually sending + a response. (These functions skip over the access checks if the + sub-request is for a file in the same directory as the original + request).

      + +

      (Server-side includes work by building sub-requests and then actually + invoking the response handler for them, via the function + ap_run_sub_req).

      +
    • +
    + + +

    Handling requests, declining, and returning + error codes

    +

    As discussed above, each handler, when invoked to handle a particular + request_rec, has to return an int to indicate + what happened. That can either be

    + +
      +
    • OK -- the request was handled successfully. This may or + may not terminate the phase.
    • + +
    • DECLINED -- no erroneous condition exists, but the module + declines to handle the phase; the server tries to find another.
    • + +
    • an HTTP error code, which aborts handling of the request.
    • +
    + +

    Note that if the error code returned is REDIRECT, then + the module should put a Location in the request's + headers_out, to indicate where the client should be + redirected to.

    + + +

    Special considerations for response + handlers

    +

    Handlers for most phases do their work by simply setting a few fields + in the request_rec structure (or, in the case of access + checkers, simply by returning the correct error code). However, response + handlers have to actually send a request back to the client.

    + +

    They should begin by sending an HTTP response header, using the + function ap_send_http_header. (You don't have to do anything + special to skip sending the header for HTTP/0.9 requests; the function + figures out on its own that it shouldn't do anything). If the request is + marked header_only, that's all they should do; they should + return after that, without attempting any further output.

    + +

    Otherwise, they should produce a request body which responds to the + client as appropriate. The primitives for this are ap_rputc + and ap_rprintf, for internally generated output, and + ap_send_fd, to copy the contents of some FILE * + straight to the client.

    + +

    At this point, you should more or less understand the following piece + of code, which is the handler which handles GET requests + which have no more specific handler; it also shows how conditional + GETs can be handled, if it's desirable to do so in a + particular response handler -- ap_set_last_modified checks + against the If-modified-since value supplied by the client, + if any, and returns an appropriate code (which will, if nonzero, be + USE_LOCAL_COPY). No similar considerations apply for + ap_set_content_length, but it returns an error code for + symmetry.

    + +

    + int default_handler (request_rec *r)
    + {
    + + int errstatus;
    + FILE *f;
    +
    + if (r->method_number != M_GET) return DECLINED;
    + if (r->finfo.st_mode == 0) return NOT_FOUND;
    +
    + if ((errstatus = ap_set_content_length (r, r->finfo.st_size))
    +     || + (errstatus = ap_set_last_modified (r, r->finfo.st_mtime)))
    + return errstatus;
    +
    + f = fopen (r->filename, "r");
    +
    + if (f == NULL) {
    + + log_reason("file permissions deny server access", r->filename, r);
    + return FORBIDDEN;
    +
    + }
    +
    + register_timeout ("send", r);
    + ap_send_http_header (r);
    +
    + if (!r->header_only) send_fd (f, r);
    + ap_pfclose (r->pool, f);
    + return OK;
    +
    + } +

    + +

    Finally, if all of this is too much of a challenge, there are a few + ways out of it. First off, as shown above, a response handler which has + not yet produced any output can simply return an error code, in which + case the server will automatically produce an error response. Secondly, + it can punt to some other handler by invoking + ap_internal_redirect, which is how the internal redirection + machinery discussed above is invoked. A response handler which has + internally redirected should always return OK.

    + +

    (Invoking ap_internal_redirect from handlers which are + not response handlers will lead to serious confusion).

    + + +

    Special considerations for authentication + handlers

    +

    Stuff that should be discussed here in detail:

    + +
      +
    • Authentication-phase handlers not invoked unless auth is + configured for the directory.
    • + +
    • Common auth configuration stored in the core per-dir + configuration; it has accessors ap_auth_type, + ap_auth_name, and ap_requires.
    • + +
    • Common routines, to handle the protocol end of things, at + least for HTTP basic authentication + (ap_get_basic_auth_pw, which sets the + connection->user structure field + automatically, and ap_note_basic_auth_failure, + which arranges for the proper WWW-Authenticate: + header to be sent back).
    • +
    + + +

    Special considerations for logging + handlers

    +

    When a request has internally redirected, there is the question of + what to log. Apache handles this by bundling the entire chain of redirects + into a list of request_rec structures which are threaded + through the r->prev and r->next pointers. + The request_rec which is passed to the logging handlers in + such cases is the one which was originally built for the initial request + from the client; note that the bytes_sent field will only be + correct in the last request in the chain (the one for which a response was + actually sent).

    + +
    top
    +
    +

    Resource allocation and resource pools

    +

    One of the problems of writing and designing a server-pool server is + that of preventing leakage, that is, allocating resources (memory, open + files, etc.), without subsequently releasing them. The resource + pool machinery is designed to make it easy to prevent this from happening, + by allowing resource to be allocated in such a way that they are + automatically released when the server is done with them.

    + +

    The way this works is as follows: the memory which is allocated, file + opened, etc., to deal with a particular request are tied to a + resource pool which is allocated for the request. The pool is a + data structure which itself tracks the resources in question.

    + +

    When the request has been processed, the pool is cleared. At + that point, all the memory associated with it is released for reuse, all + files associated with it are closed, and any other clean-up functions which + are associated with the pool are run. When this is over, we can be confident + that all the resource tied to the pool have been released, and that none of + them have leaked.

    + +

    Server restarts, and allocation of memory and resources for per-server + configuration, are handled in a similar way. There is a configuration + pool, which keeps track of resources which were allocated while reading + the server configuration files, and handling the commands therein (for + instance, the memory that was allocated for per-server module configuration, + log files and other files that were opened, and so forth). When the server + restarts, and has to reread the configuration files, the configuration pool + is cleared, and so the memory and file descriptors which were taken up by + reading them the last time are made available for reuse.

    + +

    It should be noted that use of the pool machinery isn't generally + obligatory, except for situations like logging handlers, where you really + need to register cleanups to make sure that the log file gets closed when + the server restarts (this is most easily done by using the function ap_pfopen, which also arranges for the + underlying file descriptor to be closed before any child processes, such as + for CGI scripts, are execed), or in case you are using the + timeout machinery (which isn't yet even documented here). However, there are + two benefits to using it: resources allocated to a pool never leak (even if + you allocate a scratch string, and just forget about it); also, for memory + allocation, ap_palloc is generally faster than + malloc.

    + +

    We begin here by describing how memory is allocated to pools, and then + discuss how other resources are tracked by the resource pool machinery.

    + +

    Allocation of memory in pools

    +

    Memory is allocated to pools by calling the function + ap_palloc, which takes two arguments, one being a pointer to + a resource pool structure, and the other being the amount of memory to + allocate (in chars). Within handlers for handling requests, + the most common way of getting a resource pool structure is by looking at + the pool slot of the relevant request_rec; hence + the repeated appearance of the following idiom in module code:

    + +

    + int my_handler(request_rec *r)
    + {
    + + struct my_structure *foo;
    + ...
    +
    + foo = (foo *)ap_palloc (r->pool, sizeof(my_structure));
    +
    + } +

    + +

    Note that there is no ap_pfree -- + ap_palloced memory is freed only when the associated resource + pool is cleared. This means that ap_palloc does not have to + do as much accounting as malloc(); all it does in the typical + case is to round up the size, bump a pointer, and do a range check.

    + +

    (It also raises the possibility that heavy use of + ap_palloc could cause a server process to grow excessively + large. There are two ways to deal with this, which are dealt with below; + briefly, you can use malloc, and try to be sure that all of + the memory gets explicitly freed, or you can allocate a + sub-pool of the main pool, allocate your memory in the sub-pool, and clear + it out periodically. The latter technique is discussed in the section + on sub-pools below, and is used in the directory-indexing code, in order + to avoid excessive storage allocation when listing directories with + thousands of files).

    + + +

    Allocating initialized memory

    +

    There are functions which allocate initialized memory, and are + frequently useful. The function ap_pcalloc has the same + interface as ap_palloc, but clears out the memory it + allocates before it returns it. The function ap_pstrdup + takes a resource pool and a char * as arguments, and + allocates memory for a copy of the string the pointer points to, returning + a pointer to the copy. Finally ap_pstrcat is a varargs-style + function, which takes a pointer to a resource pool, and at least two + char * arguments, the last of which must be + NULL. It allocates enough memory to fit copies of each of + the strings, as a unit; for instance:

    + +

    + ap_pstrcat (r->pool, "foo", "/", "bar", NULL); +

    + +

    returns a pointer to 8 bytes worth of memory, initialized to + "foo/bar".

    + + +

    Commonly-used pools in the Apache Web + server

    +

    A pool is really defined by its lifetime more than anything else. + There are some static pools in http_main which are passed to various + non-http_main functions as arguments at opportune times. Here they + are:

    + +
    +
    permanent_pool
    +
    never passed to anything else, this is the ancestor of all pools
    + +
    pconf
    +
    +
      +
    • subpool of permanent_pool
    • + +
    • created at the beginning of a config "cycle"; exists + until the server is terminated or restarts; passed to all + config-time routines, either via cmd->pool, or as the + "pool *p" argument on those which don't take pools
    • + +
    • passed to the module init() functions
    • +
    +
    + +
    ptemp
    +
    +
      +
    • sorry I lie, this pool isn't called this currently in + 1.3, I renamed it this in my pthreads development. I'm + referring to the use of ptrans in the parent... contrast + this with the later definition of ptrans in the + child.
    • + +
    • subpool of permanent_pool
    • + +
    • created at the beginning of a config "cycle"; exists + until the end of config parsing; passed to config-time + routines via cmd->temp_pool. Somewhat of a + "bastard child" because it isn't available everywhere. + Used for temporary scratch space which may be needed by + some config routines but which is deleted at the end of + config.
    • +
    +
    + +
    pchild
    +
    +
      +
    • subpool of permanent_pool
    • + +
    • created when a child is spawned (or a thread is + created); lives until that child (thread) is + destroyed
    • + +
    • passed to the module child_init functions
    • + +
    • destruction happens right after the child_exit + functions are called... (which may explain why I think + child_exit is redundant and unneeded)
    • +
    +
    + +
    ptrans
    +
    +
      +
    • should be a subpool of pchild, but currently is a + subpool of permanent_pool, see above
    • + +
    • cleared by the child before going into the accept() + loop to receive a connection
    • + +
    • used as connection->pool
    • +
    +
    + +
    r->pool
    +
    +
      +
    • for the main request this is a subpool of + connection->pool; for subrequests it is a subpool of + the parent request's pool.
    • + +
    • exists until the end of the request (i.e., + ap_destroy_sub_req, or in child_main after + process_request has finished)
    • + +
    • note that r itself is allocated from r->pool; + i.e., r->pool is first created and then r is + the first thing palloc()d from it
    • +
    +
    +
    + +

    For almost everything folks do, r->pool is the pool to + use. But you can see how other lifetimes, such as pchild, are useful to + some modules... such as modules that need to open a database connection + once per child, and wish to clean it up when the child dies.

    + +

    You can also see how some bugs have manifested themself, such as + setting connection->user to a value from + r->pool -- in this case connection exists for the + lifetime of ptrans, which is longer than + r->pool (especially if r->pool is a + subrequest!). So the correct thing to do is to allocate from + connection->pool.

    + +

    And there was another interesting bug in mod_include + / mod_cgi. You'll see in those that they do this test + to decide if they should use r->pool or + r->main->pool. In this case the resource that they are + registering for cleanup is a child process. If it were registered in + r->pool, then the code would wait() for the + child when the subrequest finishes. With mod_include this + could be any old #include, and the delay can be up to 3 + seconds... and happened quite frequently. Instead the subprocess is + registered in r->main->pool which causes it to be + cleaned up when the entire request is done -- i.e., after the + output has been sent to the client and logging has happened.

    + + +

    Tracking open files, etc.

    +

    As indicated above, resource pools are also used to track other sorts + of resources besides memory. The most common are open files. The routine + which is typically used for this is ap_pfopen, which takes a + resource pool and two strings as arguments; the strings are the same as + the typical arguments to fopen, e.g.,

    + +

    + ...
    + FILE *f = ap_pfopen (r->pool, r->filename, "r");
    +
    + if (f == NULL) { ... } else { ... }
    +

    + +

    There is also a ap_popenf routine, which parallels the + lower-level open system call. Both of these routines arrange + for the file to be closed when the resource pool in question is + cleared.

    + +

    Unlike the case for memory, there are functions to close files + allocated with ap_pfopen, and ap_popenf, namely + ap_pfclose and ap_pclosef. (This is because, on + many systems, the number of files which a single process can have open is + quite limited). It is important to use these functions to close files + allocated with ap_pfopen and ap_popenf, since to + do otherwise could cause fatal errors on systems such as Linux, which + react badly if the same FILE* is closed more than once.

    + +

    (Using the close functions is not mandatory, since the + file will eventually be closed regardless, but you should consider it in + cases where your module is opening, or could open, a lot of files).

    + + +

    Other sorts of resources -- cleanup functions

    +

    More text goes here. Describe the cleanup primitives in terms of + which the file stuff is implemented; also, spawn_process.

    + +

    Pool cleanups live until clear_pool() is called: + clear_pool(a) recursively calls destroy_pool() + on all subpools of a; then calls all the cleanups for + a; then releases all the memory for a. + destroy_pool(a) calls clear_pool(a) and then + releases the pool structure itself. i.e., + clear_pool(a) doesn't delete a, it just frees + up all the resources and you can start using it again immediately.

    + + +

    Fine control -- creating and dealing with sub-pools, with + a note on sub-requests

    +

    On rare occasions, too-free use of ap_palloc() and the + associated primitives may result in undesirably profligate resource + allocation. You can deal with such a case by creating a sub-pool, + allocating within the sub-pool rather than the main pool, and clearing or + destroying the sub-pool, which releases the resources which were + associated with it. (This really is a rare situation; the only + case in which it comes up in the standard module set is in case of listing + directories, and then only with very large directories. + Unnecessary use of the primitives discussed here can hair up your code + quite a bit, with very little gain).

    + +

    The primitive for creating a sub-pool is ap_make_sub_pool, + which takes another pool (the parent pool) as an argument. When the main + pool is cleared, the sub-pool will be destroyed. The sub-pool may also be + cleared or destroyed at any time, by calling the functions + ap_clear_pool and ap_destroy_pool, respectively. + (The difference is that ap_clear_pool frees resources + associated with the pool, while ap_destroy_pool also + deallocates the pool itself. In the former case, you can allocate new + resources within the pool, and clear it again, and so forth; in the + latter case, it is simply gone).

    + +

    One final note -- sub-requests have their own resource pools, which are + sub-pools of the resource pool for the main request. The polite way to + reclaim the resources associated with a sub request which you have + allocated (using the ap_sub_req_... functions) is + ap_destroy_sub_req, which frees the resource pool. Before + calling this function, be sure to copy anything that you care about which + might be allocated in the sub-request's resource pool into someplace a + little less volatile (for instance, the filename in its + request_rec structure).

    + +

    (Again, under most circumstances, you shouldn't feel obliged to call + this function; only 2K of memory or so are allocated for a typical sub + request, and it will be freed anyway when the main request pool is + cleared. It is only when you are allocating many, many sub-requests for a + single main request that you should seriously consider the + ap_destroy_... functions).

    + +
    top
    +
    +

    Configuration, commands and the like

    +

    One of the design goals for this server was to maintain external + compatibility with the NCSA 1.3 server --- that is, to read the same + configuration files, to process all the directives therein correctly, and + in general to be a drop-in replacement for NCSA. On the other hand, another + design goal was to move as much of the server's functionality into modules + which have as little as possible to do with the monolithic server core. The + only way to reconcile these goals is to move the handling of most commands + from the central server into the modules.

    + +

    However, just giving the modules command tables is not enough to divorce + them completely from the server core. The server has to remember the + commands in order to act on them later. That involves maintaining data which + is private to the modules, and which can be either per-server, or + per-directory. Most things are per-directory, including in particular access + control and authorization information, but also information on how to + determine file types from suffixes, which can be modified by + AddType and ForceType directives, and so forth. In general, + the governing philosophy is that anything which can be made + configurable by directory should be; per-server information is generally + used in the standard set of modules for information like + Aliases and Redirects which come into play before the + request is tied to a particular place in the underlying file system.

    + +

    Another requirement for emulating the NCSA server is being able to handle + the per-directory configuration files, generally called + .htaccess files, though even in the NCSA server they can + contain directives which have nothing at all to do with access control. + Accordingly, after URI -> filename translation, but before performing any + other phase, the server walks down the directory hierarchy of the underlying + filesystem, following the translated pathname, to read any + .htaccess files which might be present. The information which + is read in then has to be merged with the applicable information + from the server's own config files (either from the <Directory> sections in + access.conf, or from defaults in srm.conf, which + actually behaves for most purposes almost exactly like <Directory + />).

    + +

    Finally, after having served a request which involved reading + .htaccess files, we need to discard the storage allocated for + handling them. That is solved the same way it is solved wherever else + similar problems come up, by tying those structures to the per-transaction + resource pool.

    + +

    Per-directory configuration structures

    +

    Let's look out how all of this plays out in mod_mime.c, + which defines the file typing handler which emulates the NCSA server's + behavior of determining file types from suffixes. What we'll be looking + at, here, is the code which implements the AddType and AddEncoding commands. These commands can appear in + .htaccess files, so they must be handled in the module's + private per-directory data, which in fact, consists of two separate + tables for MIME types and encoding information, and is declared as + follows:

    + +
    typedef struct {
    +    table *forced_types;      /* Additional AddTyped stuff */
    +    table *encoding_types;    /* Added with AddEncoding... */
    +} mime_dir_config;
    + +

    When the server is reading a configuration file, or <Directory> section, which includes + one of the MIME module's commands, it needs to create a + mime_dir_config structure, so those commands have something + to act on. It does this by invoking the function it finds in the module's + `create per-dir config slot', with two arguments: the name of the + directory to which this configuration information applies (or + NULL for srm.conf), and a pointer to a + resource pool in which the allocation should happen.

    + +

    (If we are reading a .htaccess file, that resource pool + is the per-request resource pool for the request; otherwise it is a + resource pool which is used for configuration data, and cleared on + restarts. Either way, it is important for the structure being created to + vanish when the pool is cleared, by registering a cleanup on the pool if + necessary).

    + +

    For the MIME module, the per-dir config creation function just + ap_pallocs the structure above, and a creates a couple of + tables to fill it. That looks like this:

    + +

    + void *create_mime_dir_config (pool *p, char *dummy)
    + {
    + + mime_dir_config *new =
    + + (mime_dir_config *) ap_palloc (p, sizeof(mime_dir_config));
    +
    +
    + new->forced_types = ap_make_table (p, 4);
    + new->encoding_types = ap_make_table (p, 4);
    +
    + return new;
    +
    + } +

    + +

    Now, suppose we've just read in a .htaccess file. We + already have the per-directory configuration structure for the next + directory up in the hierarchy. If the .htaccess file we just + read in didn't have any AddType + or AddEncoding commands, its + per-directory config structure for the MIME module is still valid, and we + can just use it. Otherwise, we need to merge the two structures + somehow.

    + +

    To do that, the server invokes the module's per-directory config merge + function, if one is present. That function takes three arguments: the two + structures being merged, and a resource pool in which to allocate the + result. For the MIME module, all that needs to be done is overlay the + tables from the new per-directory config structure with those from the + parent:

    + +

    + void *merge_mime_dir_configs (pool *p, void *parent_dirv, void *subdirv)
    + {
    + + mime_dir_config *parent_dir = (mime_dir_config *)parent_dirv;
    + mime_dir_config *subdir = (mime_dir_config *)subdirv;
    + mime_dir_config *new =
    + + (mime_dir_config *)ap_palloc (p, sizeof(mime_dir_config));
    +
    +
    + new->forced_types = ap_overlay_tables (p, subdir->forced_types,
    + + parent_dir->forced_types);
    +
    + new->encoding_types = ap_overlay_tables (p, subdir->encoding_types,
    + + parent_dir->encoding_types);
    +
    +
    + return new;
    +
    + } +

    + +

    As a note -- if there is no per-directory merge function present, the + server will just use the subdirectory's configuration info, and ignore + the parent's. For some modules, that works just fine (e.g., for + the includes module, whose per-directory configuration information + consists solely of the state of the XBITHACK), and for those + modules, you can just not declare one, and leave the corresponding + structure slot in the module itself NULL.

    + + +

    Command handling

    +

    Now that we have these structures, we need to be able to figure out how + to fill them. That involves processing the actual AddType and AddEncoding commands. To find commands, the server looks in + the module's command table. That table contains information on how many + arguments the commands take, and in what formats, where it is permitted, + and so forth. That information is sufficient to allow the server to invoke + most command-handling functions with pre-parsed arguments. Without further + ado, let's look at the AddType + command handler, which looks like this (the AddEncoding command looks basically the same, and won't be + shown here):

    + +

    + char *add_type(cmd_parms *cmd, mime_dir_config *m, char *ct, char *ext)
    + {
    + + if (*ext == '.') ++ext;
    + ap_table_set (m->forced_types, ext, ct);
    + return NULL;
    +
    + } +

    + +

    This command handler is unusually simple. As you can see, it takes + four arguments, two of which are pre-parsed arguments, the third being the + per-directory configuration structure for the module in question, and the + fourth being a pointer to a cmd_parms structure. That + structure contains a bunch of arguments which are frequently of use to + some, but not all, commands, including a resource pool (from which memory + can be allocated, and to which cleanups should be tied), and the (virtual) + server being configured, from which the module's per-server configuration + data can be obtained if required.

    + +

    Another way in which this particular command handler is unusually + simple is that there are no error conditions which it can encounter. If + there were, it could return an error message instead of NULL; + this causes an error to be printed out on the server's + stderr, followed by a quick exit, if it is in the main config + files; for a .htaccess file, the syntax error is logged in + the server error log (along with an indication of where it came from), and + the request is bounced with a server error response (HTTP error status, + code 500).

    + +

    The MIME module's command table has entries for these commands, which + look like this:

    + +

    + command_rec mime_cmds[] = {
    + + { "AddType", add_type, NULL, OR_FILEINFO, TAKE2,
    + "a mime type followed by a file extension" },
    + { "AddEncoding", add_encoding, NULL, OR_FILEINFO, TAKE2,
    + + "an encoding (e.g., gzip), followed by a file extension" },
    +
    + { NULL }
    +
    + }; +

    + +

    The entries in these tables are:

    +
      +
    • The name of the command
    • +
    • The function which handles it
    • +
    • a (void *) pointer, which is passed in the + cmd_parms structure to the command handler --- + this is useful in case many similar commands are handled by + the same function.
    • + +
    • A bit mask indicating where the command may appear. There + are mask bits corresponding to each + AllowOverride option, and an additional mask + bit, RSRC_CONF, indicating that the command may + appear in the server's own config files, but not in + any .htaccess file.
    • + +
    • A flag indicating how many arguments the command handler + wants pre-parsed, and how they should be passed in. + TAKE2 indicates two pre-parsed arguments. Other + options are TAKE1, which indicates one + pre-parsed argument, FLAG, which indicates that + the argument should be On or Off, + and is passed in as a boolean flag, RAW_ARGS, + which causes the server to give the command the raw, unparsed + arguments (everything but the command name itself). There is + also ITERATE, which means that the handler looks + the same as TAKE1, but that if multiple + arguments are present, it should be called multiple times, + and finally ITERATE2, which indicates that the + command handler looks like a TAKE2, but if more + arguments are present, then it should be called multiple + times, holding the first argument constant.
    • + +
    • Finally, we have a string which describes the arguments + that should be present. If the arguments in the actual config + file are not as required, this string will be used to help + give a more specific error message. (You can safely leave + this NULL).
    • +
    + +

    Finally, having set this all up, we have to use it. This is ultimately + done in the module's handlers, specifically for its file-typing handler, + which looks more or less like this; note that the per-directory + configuration structure is extracted from the request_rec's + per-directory configuration vector by using the + ap_get_module_config function.

    + +

    + int find_ct(request_rec *r)
    + {
    + + int i;
    + char *fn = ap_pstrdup (r->pool, r->filename);
    + mime_dir_config *conf = (mime_dir_config *)
    + + ap_get_module_config(r->per_dir_config, &mime_module);
    +
    + char *type;
    +
    + if (S_ISDIR(r->finfo.st_mode)) {
    + + r->content_type = DIR_MAGIC_TYPE;
    + return OK;
    +
    + }
    +
    + if((i=ap_rind(fn,'.')) < 0) return DECLINED;
    + ++i;
    +
    + if ((type = ap_table_get (conf->encoding_types, &fn[i])))
    + {
    + + r->content_encoding = type;
    +
    + /* go back to previous extension to try to use it as a type */
    + fn[i-1] = '\0';
    + if((i=ap_rind(fn,'.')) < 0) return OK;
    + ++i;
    +
    + }
    +
    + if ((type = ap_table_get (conf->forced_types, &fn[i])))
    + {
    + + r->content_type = type;
    +
    + }
    +
    + return OK; +
    + } +

    + + +

    Side notes -- per-server configuration, + virtual servers, etc.

    +

    The basic ideas behind per-server module configuration are basically + the same as those for per-directory configuration; there is a creation + function and a merge function, the latter being invoked where a virtual + server has partially overridden the base server configuration, and a + combined structure must be computed. (As with per-directory configuration, + the default if no merge function is specified, and a module is configured + in some virtual server, is that the base configuration is simply + ignored).

    + +

    The only substantial difference is that when a command needs to + configure the per-server private module data, it needs to go to the + cmd_parms data to get at it. Here's an example, from the + alias module, which also indicates how a syntax error can be returned + (note that the per-directory configuration argument to the command + handler is declared as a dummy, since the module doesn't actually have + per-directory config data):

    + +

    + char *add_redirect(cmd_parms *cmd, void *dummy, char *f, char *url)
    + {
    + + server_rec *s = cmd->server;
    + alias_server_conf *conf = (alias_server_conf *)
    + + ap_get_module_config(s->module_config,&alias_module);
    +
    + alias_entry *new = ap_push_array (conf->redirects);
    +
    + if (!ap_is_url (url)) return "Redirect to non-URL";
    +
    + new->fake = f; new->real = url;
    + return NULL;
    +
    + } +

    + +
    +
    +

    Available Languages:  en 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/developer/debugging.html b/docs/manual/developer/debugging.html new file mode 100644 index 0000000..83dcee2 --- /dev/null +++ b/docs/manual/developer/debugging.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: debugging.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/developer/debugging.html.en b/docs/manual/developer/debugging.html.en new file mode 100644 index 0000000..19fa8c6 --- /dev/null +++ b/docs/manual/developer/debugging.html.en @@ -0,0 +1,60 @@ + + + + + +Debugging Memory Allocation in APR - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Debugging Memory Allocation in APR

    +
    +

    Available Languages:  en 

    +
    + +

    + This document has been removed. +

    +
    +
    +
    +

    Available Languages:  en 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/developer/documenting.html b/docs/manual/developer/documenting.html new file mode 100644 index 0000000..fef7894 --- /dev/null +++ b/docs/manual/developer/documenting.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: documenting.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: documenting.html.zh-cn.utf8 +Content-Language: zh-cn +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/developer/documenting.html.en b/docs/manual/developer/documenting.html.en new file mode 100644 index 0000000..9893850 --- /dev/null +++ b/docs/manual/developer/documenting.html.en @@ -0,0 +1,112 @@ + + + + + +Documenting code in Apache 2.4 - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Documenting code in Apache 2.4

    +
    +

    Available Languages:  en  | + zh-cn 

    +
    + +

    Apache 2.4 uses Doxygen to + document the APIs and global variables in the code. This will explain + the basics of how to document using Doxygen.

    +
    +
    top
    +
    +

    Brief Description

    +

    To start a documentation block, use /**
    + To end a documentation block, use */

    + +

    In the middle of the block, there are multiple tags we can + use:

    + +

    + Description of this functions purpose
    + @param parameter_name description
    + @return description
    + @deffunc signature of the function
    +

    + +

    The deffunc is not always necessary. DoxyGen does not + have a full parser in it, so any prototype that use a macro in the + return type declaration is too complex for scandoc. Those functions + require a deffunc. An example (using &gt; rather + than >):

    + +

    + /**
    +  * return the final element of the pathname
    +  * @param pathname The path to get the final element of
    +  * @return the final element of the path
    +  * @tip Examples:
    +  * <pre>
    +  * "/foo/bar/gum" -&gt; "gum"
    +  * "/foo/bar/gum/" -&gt; ""
    +  * "gum" -&gt; "gum"
    +  * "wi\\n32\\stuff" -&gt; "stuff"
    +  * </pre>
    +  * @deffunc const char * ap_filename_of_pathname(const char *pathname)
    +  */ +

    + +

    At the top of the header file, always include:

    +

    + /**
    +  * @package Name of library header
    +  */ +

    + +

    Doxygen uses a new HTML file for each package. The HTML files are named + {Name_of_library_header}.html, so try to be concise with your names.

    + +

    For a further discussion of the possibilities please refer to + the Doxygen site.

    +
    +
    +

    Available Languages:  en  | + zh-cn 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/developer/documenting.html.zh-cn.utf8 b/docs/manual/developer/documenting.html.zh-cn.utf8 new file mode 100644 index 0000000..9f27aed --- /dev/null +++ b/docs/manual/developer/documenting.html.zh-cn.utf8 @@ -0,0 +1,109 @@ + + + + + +Apache 2.0 文档 - Apache HTTP æœåС噍 版本 2.4 + + + + + + + +
    <-
    +

    Apache 2.0 文档

    +
    +

    å¯ç”¨è¯­è¨€:  en  | + zh-cn 

    +
    +
    此翻译å¯èƒ½è¿‡æœŸã€‚è¦äº†è§£æœ€è¿‘的更改,请阅读英文版。
    + +

    Apache 2.0 使用 Doxygen 从代ç ä¸­ + ç”Ÿæˆ API 和全局å˜é‡çš„æ–‡æ¡£ã€‚䏋颿˜¯å¯¹ä½¿ç”¨ Doxygen ç”Ÿæˆæ–‡æ¡£çš„简介。

    +
    +
    top
    +
    +

    简è¦è¯´æ˜Ž

    +

    使用 /** 开始文档å—
    + 使用 */ ç»“æŸæ–‡æ¡£å—

    + +

    在文档å—中,我们å¯ä»¥ä½¿ç”¨å¤šä¸ªæ ‡ç­¾:

    + +

    + Description of this functions purpose
    + @param parameter_name description
    + @return description
    + @deffunc signature of the function
    +

    + +

    一般ä¸éœ€è¦ deffunc 。DoxyGen 没有完整的解æžå™¨ï¼Œæ‰€ä»¥ä»»ä½• + 在返回类型声明中使用å®çš„åŽŸåž‹ï¼Œéƒ½æ˜¯å¤ªå¤æ‚了。这些函数就需è¦ä½¿ç”¨ deffunc。 + 例如 (使用 &gt; è€Œä¸æ˜¯ >):

    + +

    + /**
    +  * return the final element of the pathname
    +  * @param pathname The path to get the final element of
    +  * @return the final element of the path
    +  * @tip Examples:
    +  * <pre>
    +  * "/foo/bar/gum" -&gt; "gum"
    +  * "/foo/bar/gum/" -&gt; ""
    +  * "gum" -&gt; "gum"
    +  * "wi\\n32\\stuff" -&gt; "stuff"
    +  * </pre>
    +  * @deffunc const char * ap_filename_of_pathname(const char *pathname)
    +  */ +

    + +

    总是在头文件开始包å«:

    +

    + /**
    +  * @package Name of library header
    +  */ +

    + +

    Doxygen 为æ¯ä¸ªåŒ…生æˆä¸€ä¸ªæ–°çš„ HTML 文件,å字是 + {Name_of_library_header}.html,所以请简化å称。

    + +

    更深入的讨论,请å‚è§ + Doxygen 站点。

    +
    +
    +

    å¯ç”¨è¯­è¨€:  en  | + zh-cn 

    +
    top

    评论

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/developer/filters.html b/docs/manual/developer/filters.html new file mode 100644 index 0000000..48559da --- /dev/null +++ b/docs/manual/developer/filters.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: filters.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/developer/filters.html.en b/docs/manual/developer/filters.html.en new file mode 100644 index 0000000..c57f4bc --- /dev/null +++ b/docs/manual/developer/filters.html.en @@ -0,0 +1,234 @@ + + + + + +How filters work in Apache 2.0 - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    How filters work in Apache 2.0

    +
    +

    Available Languages:  en 

    +
    + +

    Warning

    +

    This is a cut 'n paste job from an email + (<022501c1c529$f63a9550$7f00000a@KOJ>) and only reformatted for + better readability. It's not up to date but may be a good start for + further research.

    +
    +
    + +
    top
    +
    +

    Filter Types

    +

    There are three basic filter types (each of these is actually broken + down into two categories, but that comes later).

    + +
    +
    CONNECTION
    +
    Filters of this type are valid for the lifetime of this connection. + (AP_FTYPE_CONNECTION, AP_FTYPE_NETWORK)
    + +
    PROTOCOL
    +
    Filters of this type are valid for the lifetime of this request from + the point of view of the client, this means that the request is valid + from the time that the request is sent until the time that the response + is received. (AP_FTYPE_PROTOCOL, + AP_FTYPE_TRANSCODE)
    + +
    RESOURCE
    +
    Filters of this type are valid for the time that this content is used + to satisfy a request. For simple requests, this is identical to + PROTOCOL, but internal redirects and sub-requests can change + the content without ending the request. (AP_FTYPE_RESOURCE, + AP_FTYPE_CONTENT_SET)
    +
    + +

    It is important to make the distinction between a protocol and a + resource filter. A resource filter is tied to a specific resource, it + may also be tied to header information, but the main binding is to a + resource. If you are writing a filter and you want to know if it is + resource or protocol, the correct question to ask is: "Can this filter + be removed if the request is redirected to a different resource?" If + the answer is yes, then it is a resource filter. If it is no, then it + is most likely a protocol or connection filter. I won't go into + connection filters, because they seem to be well understood. With this + definition, a few examples might help:

    + +
    +
    Byterange
    +
    We have coded it to be inserted for all requests, and it is removed + if not used. Because this filter is active at the beginning of all + requests, it can not be removed if it is redirected, so this is a + protocol filter.
    + +
    http_header
    +
    This filter actually writes the headers to the network. This is + obviously a required filter (except in the asis case which is special + and will be dealt with below) and so it is a protocol filter.
    + +
    Deflate
    +
    The administrator configures this filter based on which file has been + requested. If we do an internal redirect from an autoindex page to an + index.html page, the deflate filter may be added or removed based on + config, so this is a resource filter.
    +
    + +

    The further breakdown of each category into two more filter types is + strictly for ordering. We could remove it, and only allow for one + filter type, but the order would tend to be wrong, and we would need to + hack things to make it work. Currently, the RESOURCE filters + only have one filter type, but that should change.

    +
    top
    +
    +

    How are filters inserted?

    +

    This is actually rather simple in theory, but the code is + complex. First of all, it is important that everybody realize that + there are three filter lists for each request, but they are all + concatenated together:

    +
      +
    • r->output_filters (corresponds to RESOURCE)
    • +
    • r->proto_output_filters (corresponds to PROTOCOL)
    • +
    • r->connection->output_filters (corresponds to CONNECTION)
    • +
    + +

    The problem previously, was that we used a singly linked list to create the filter stack, and we + started from the "correct" location. This means that if I had a + RESOURCE filter on the stack, and I added a + CONNECTION filter, the CONNECTION filter would + be ignored. This should make sense, because we would insert the connection + filter at the top of the c->output_filters list, but the end + of r->output_filters pointed to the filter that used to be + at the front of c->output_filters. This is obviously wrong. + The new insertion code uses a doubly linked list. This has the advantage + that we never lose a filter that has been inserted. Unfortunately, it comes + with a separate set of headaches.

    + +

    The problem is that we have two different cases were we use subrequests. + The first is to insert more data into a response. The second is to + replace the existing response with an internal redirect. These are two + different cases and need to be treated as such.

    + +

    In the first case, we are creating the subrequest from within a handler + or filter. This means that the next filter should be passed to + make_sub_request function, and the last resource filter in the + sub-request will point to the next filter in the main request. This + makes sense, because the sub-request's data needs to flow through the + same set of filters as the main request. A graphical representation + might help:

    + +
    Default_handler --> includes_filter --> byterange --> ...
    + +

    If the includes filter creates a sub request, then we don't want the + data from that sub-request to go through the includes filter, because it + might not be SSI data. So, the subrequest adds the following:

    + +
    Default_handler --> includes_filter -/-> byterange --> ...
    +                                    /
    +Default_handler --> sub_request_core
    + +

    What happens if the subrequest is SSI data? Well, that's easy, the + includes_filter is a resource filter, so it will be added to + the sub request in between the Default_handler and the + sub_request_core filter.

    + +

    The second case for sub-requests is when one sub-request is going to + become the real request. This happens whenever a sub-request is created + outside of a handler or filter, and NULL is passed as the next filter to + the make_sub_request function.

    + +

    In this case, the resource filters no longer make sense for the new + request, because the resource has changed. So, instead of starting from + scratch, we simply point the front of the resource filters for the + sub-request to the front of the protocol filters for the old request. + This means that we won't lose any of the protocol filters, neither will + we try to send this data through a filter that shouldn't see it.

    + +

    The problem is that we are using a doubly-linked list for our filter + stacks now. But, you should notice that it is possible for two lists to + intersect in this model. So, you do you handle the previous pointer? + This is a very difficult question to answer, because there is no "right" + answer, either method is equally valid. I looked at why we use the + previous pointer. The only reason for it is to allow for easier + addition of new servers. With that being said, the solution I chose was + to make the previous pointer always stay on the original request.

    + +

    This causes some more complex logic, but it works for all cases. My + concern in having it move to the sub-request, is that for the more + common case (where a sub-request is used to add data to a response), the + main filter chain would be wrong. That didn't seem like a good idea to + me.

    +
    top
    +
    +

    Asis

    +

    The final topic. :-) Mod_Asis is a bit of a hack, but the + handler needs to remove all filters except for connection filters, and + send the data. If you are using mod_asis, all other + bets are off.

    +
    top
    +
    +

    Explanations

    +

    The absolutely last point is that the reason this code was so hard to + get right, was because we had hacked so much to force it to work. I + wrote most of the hacks originally, so I am very much to blame. + However, now that the code is right, I have started to remove some + hacks. Most people should have seen that the reset_filters + and add_required_filters functions are gone. Those inserted + protocol level filters for error conditions, in fact, both functions did + the same thing, one after the other, it was really strange. Because we + don't lose protocol filters for error cases any more, those hacks went away. + The HTTP_HEADER, Content-length, and + Byterange filters are all added in the + insert_filters phase, because if they were added earlier, we + had some interesting interactions. Now, those could all be moved to be + inserted with the HTTP_IN, CORE, and + CORE_IN filters. That would make the code easier to + follow.

    +
    +
    +

    Available Languages:  en 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/developer/hooks.html b/docs/manual/developer/hooks.html new file mode 100644 index 0000000..75c3cad --- /dev/null +++ b/docs/manual/developer/hooks.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: hooks.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/developer/hooks.html.en b/docs/manual/developer/hooks.html.en new file mode 100644 index 0000000..c0d30ae --- /dev/null +++ b/docs/manual/developer/hooks.html.en @@ -0,0 +1,261 @@ + + + + + +Hook Functions in the Apache HTTP Server 2.x - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Hook Functions in the Apache HTTP Server 2.x

    +
    +

    Available Languages:  en 

    +
    + +

    Warning

    +

    This document is still in development and may be partially out of + date.

    +
    + +

    In general, a hook function is one that the Apache HTTP Server + will call at some point during the processing of a request. + Modules can provide functions that are called, and specify when + they get called in comparison to other modules.

    +
    + +
    top
    +
    +

    Core Hooks

    +

    The httpd's core modules offer a predefinined list of hooks + used during the standard request processing + phase. Creating a new hook will expose a function that + implements it (see sections below) but it is essential to understand that you will not + extend the httpd's core hooks. Their presence and order in the request processing is in fact + a consequence of how they are called in server/request.c + (check this section + for an overview). The core hooks are listed in the + doxygen documentation.

    + +

    Reading guide for developing modules and + request processing before proceeding is + highly recommended. +

    +
    top
    +
    +

    Creating a hook function

    +

    In order to create a new hook, four things need to be + done:

    + +

    Declare the hook function

    +

    Use the AP_DECLARE_HOOK macro, which needs to be given + the return type of the hook function, the name of the hook, and the + arguments. For example, if the hook returns an int and + takes a request_rec * and an int and is + called do_something, then declare it like this:

    +
    AP_DECLARE_HOOK(int, do_something, (request_rec *r, int n))
    + + +

    This should go in a header which modules will include if + they want to use the hook.

    + + +

    Create the hook structure

    +

    Each source file that exports a hook has a private structure + which is used to record the module functions that use the hook. + This is declared as follows:

    + +
    APR_HOOK_STRUCT(
    +  APR_HOOK_LINK(do_something)
    +  ...
    +)
    + + + +

    Implement the hook caller

    +

    The source file that exports the hook has to implement a + function that will call the hook. There are currently three + possible ways to do this. In all cases, the calling function is + called ap_run_hookname().

    + +

    Void hooks

    +

    If the return value of a hook is void, then all the + hooks are called, and the caller is implemented like this:

    + +
    AP_IMPLEMENT_HOOK_VOID(do_something, (request_rec *r, int n), (r, n))
    + + +

    The second and third arguments are the dummy argument + declaration and the dummy arguments as they will be used when + calling the hook. In other words, this macro expands to + something like this:

    + +
    void ap_run_do_something(request_rec *r, int n)
    +{
    +    ...
    +    do_something(r, n);
    +}
    + + + +

    Hooks that return a value

    +

    If the hook returns a value, then it can either be run until + the first hook that does something interesting, like so:

    + +
    AP_IMPLEMENT_HOOK_RUN_FIRST(int, do_something, (request_rec *r, int n), (r, n), DECLINED)
    + + +

    The first hook that does not return DECLINED + stops the loop and its return value is returned from the hook + caller. Note that DECLINED is the traditional + hook return value meaning "I didn't do anything", but it can be + whatever suits you.

    + +

    Alternatively, all hooks can be run until an error occurs. + This boils down to permitting two return values, one of + which means "I did something, and it was OK" and the other + meaning "I did nothing". The first function that returns a + value other than one of those two stops the loop, and its + return is the return value. Declare these like so:

    + +
    AP_IMPLEMENT_HOOK_RUN_ALL(int, do_something, (request_rec *r, int n), (r, n), OK, DECLINED)
    + + +

    Again, OK and DECLINED are the traditional + values. You can use what you want.

    + + + +

    Call the hook callers

    +

    At appropriate moments in the code, call the hook caller, + like so:

    + +
    int n, ret;
    +request_rec *r;
    +
    +ret=ap_run_do_something(r, n);
    + + +
    top
    +
    +

    Hooking the hook

    +

    A module that wants a hook to be called needs to do two + things.

    + +

    Implement the hook function

    +

    Include the appropriate header, and define a static function + of the correct type:

    + +
    static int my_something_doer(request_rec *r, int n)
    +{
    +    ...
    +    return OK;
    +}
    + + + +

    Add a hook registering function

    +

    During initialisation, the server will call each modules hook + registering function, which is included in the module + structure:

    + +
    static void my_register_hooks()
    +{
    +    ap_hook_do_something(my_something_doer, NULL, NULL, APR_HOOK_MIDDLE);
    +}
    +
    +mode MODULE_VAR_EXPORT my_module =
    +{
    +    ...
    +    my_register_hooks       /* register hooks */
    +};
    + + + +

    Controlling hook calling order

    +

    In the example above, we didn't use the three arguments in + the hook registration function that control calling order of + all the functions registered within the hook. + There are two mechanisms for doing this. The first, rather + crude, method, allows us to specify roughly where the hook is + run relative to other modules. The final argument control this. + There are three possible values: APR_HOOK_FIRST, + APR_HOOK_MIDDLE and APR_HOOK_LAST.

    + +

    All modules using any particular value may be run in any + order relative to each other, but, of course, all modules using + APR_HOOK_FIRST will be run before APR_HOOK_MIDDLE + which are before APR_HOOK_LAST. Modules that don't care + when they are run should use APR_HOOK_MIDDLE. These + values are spaced out, so that positions like APR_HOOK_FIRST-2 + are possible to hook slightly earlier than other functions.

    + +

    Note that there are two more values, + APR_HOOK_REALLY_FIRST and APR_HOOK_REALLY_LAST. These + should only be used by the hook exporter.

    + +

    The other method allows finer control. When a module knows + that it must be run before (or after) some other modules, it + can specify them by name. The second (third) argument is a + NULL-terminated array of strings consisting of the names of + modules that must be run before (after) the current module. For + example, suppose we want "mod_xyz.c" and "mod_abc.c" to run + before we do, then we'd hook as follows:

    + +
    static void register_hooks()
    +{
    +    static const char * const aszPre[] = { "mod_xyz.c", "mod_abc.c", NULL };
    +
    +    ap_hook_do_something(my_something_doer, aszPre, NULL, APR_HOOK_MIDDLE);
    +}
    + + +

    Note that the sort used to achieve this is stable, so + ordering set by APR_HOOK_ORDER is preserved, as far + as is possible.

    + + +
    +
    +

    Available Languages:  en 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/developer/index.html b/docs/manual/developer/index.html new file mode 100644 index 0000000..d79f31b --- /dev/null +++ b/docs/manual/developer/index.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: index.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: index.html.zh-cn.utf8 +Content-Language: zh-cn +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/developer/index.html.en b/docs/manual/developer/index.html.en new file mode 100644 index 0000000..40a7fb3 --- /dev/null +++ b/docs/manual/developer/index.html.en @@ -0,0 +1,89 @@ + + + + + +Developer Documentation for the Apache HTTP Server 2.4 - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Developer Documentation for the Apache HTTP Server 2.4

    +
    +

    Available Languages:  en  | + zh-cn 

    +
    + +

    Warning

    +

    Many of the documents listed here are in need of update. + They are in different stages of progress. + Please be patient and follow this link + to propose a fix or point out any error/discrepancy.

    +
    +
    + +
    top
    +
    top
    +
    top
    +
    +
    +

    Available Languages:  en  | + zh-cn 

    +
    + \ No newline at end of file diff --git a/docs/manual/developer/index.html.zh-cn.utf8 b/docs/manual/developer/index.html.zh-cn.utf8 new file mode 100644 index 0000000..e1c8a94 --- /dev/null +++ b/docs/manual/developer/index.html.zh-cn.utf8 @@ -0,0 +1,88 @@ + + + + + +Apache 2.0 å¼€å‘者文档 - Apache HTTP æœåС噍 版本 2.4 + + + + + + + +
    <-
    +

    Apache 2.0 å¼€å‘者文档

    +
    +

    å¯ç”¨è¯­è¨€:  en  | + zh-cn 

    +
    +
    此翻译å¯èƒ½è¿‡æœŸã€‚è¦äº†è§£æœ€è¿‘的更改,请阅读英文版。
    + +

    å¼€å‘者页é¢çš„许多文档都æ¥è‡ªäºŽ Apache 1.3。当更新到 Apache 2 + 时,它们å¯èƒ½ä½äºŽä¸åŒçš„阶段。请è€å¿ƒç­‰å¾…ï¼Œæˆ–è€…ç›´æŽ¥å‘ + dev@httpd.apache.org 邮件列表报告开å‘者页é¢çš„差异或错误。

    +
    + +
    top
    +
    top
    +
    +
    +

    å¯ç”¨è¯­è¨€:  en  | + zh-cn 

    +
    + \ No newline at end of file diff --git a/docs/manual/developer/modguide.html b/docs/manual/developer/modguide.html new file mode 100644 index 0000000..3e5c834 --- /dev/null +++ b/docs/manual/developer/modguide.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: modguide.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/developer/modguide.html.en b/docs/manual/developer/modguide.html.en new file mode 100644 index 0000000..1a52dbc --- /dev/null +++ b/docs/manual/developer/modguide.html.en @@ -0,0 +1,1739 @@ + + + + + +Developing modules for the Apache HTTP Server 2.4 - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Developing modules for the Apache HTTP Server 2.4

    +
    +

    Available Languages:  en 

    +
    + +

    This document explains how you can develop modules for the Apache HTTP +Server 2.4

    +
    + +
    top
    +
    +

    Introduction

    +

    What we will be discussing in this document

    +

    +This document will discuss how you can create modules for the Apache +HTTP Server 2.4, by exploring an example module called +mod_example. In the first part of this document, the purpose +of this module will be to calculate and print out various digest values for +existing files on your web server, whenever we access the URL +http://hostname/filename.sum. For instance, if we want to know the +MD5 digest value of the file located at +http://www.example.com/index.html, we would visit +http://www.example.com/index.html.sum. +

    + +

    +In the second part of this document, which deals with configuration +directive and context awareness, we will be looking at a module that simply +writes out its own configuration to the client. +

    + + +

    Prerequisites

    +

    +First and foremost, you are expected to have a basic knowledge of how the C +programming language works. In most cases, we will try to be as pedagogical +as possible and link to documents describing the functions used in the +examples, but there are also many cases where it is necessary to either +just assume that "it works" or do some digging yourself into what the hows +and whys of various function calls. +

    +

    +Lastly, you will need to have a basic understanding of how modules are +loaded and configured in the Apache HTTP Server, as well as how to get the headers for +Apache if you do not have them already, as these are needed for compiling +new modules. +

    + +

    Compiling your module

    +

    +To compile the source code we are building in this document, we will be +using APXS. Assuming your source file +is called mod_example.c, compiling, installing and activating the module is +as simple as: +

    +
    apxs -i -a -c mod_example.c
    + + +
    top
    +
    +

    Defining a module

    +

    +Module name tags
    +Every module starts with the same declaration, or name tag if you will, +that defines a module as a separate entity within Apache:

    + + + +
    module AP_MODULE_DECLARE_DATA   example_module =
    +{ 
    +    STANDARD20_MODULE_STUFF,
    +    create_dir_conf, /* Per-directory configuration handler */
    +    merge_dir_conf,  /* Merge handler for per-directory configurations */
    +    create_svr_conf, /* Per-server configuration handler */
    +    merge_svr_conf,  /* Merge handler for per-server configurations */
    +    directives,      /* Any directives we may have for httpd */
    +    register_hooks   /* Our hook registering function */
    +};
    + + + +

    +This bit of code lets the server know that we have now registered a new module +in the system, and that its name is example_module. The name +of the module is used primarily for two things:
    +

    +
      +
    • Letting the server know how to load the module using the LoadModule
    • +
    • Setting up a namespace for the module to use in configurations
    • +
    +

    +For now, we're only concerned with the first purpose of the module name, +which comes into play when we need to load the module: +

    +
    LoadModule example_module modules/mod_example.so
    + +

    +In essence, this tells the server to open up mod_example.so and look for a module +called example_module. +

    +

    +Within this name tag of ours is also a bunch of references to how we would +like to handle things: Which directives do we respond to in a configuration +file or .htaccess, how do we operate within specific contexts, and what +handlers are we interested in registering with the Apache HTTP service. We'll +return to all these elements later in this document. +

    +
    top
    +
    +

    Getting started: Hooking into the server

    +

    An introduction to hooks

    +

    +When handling requests in Apache HTTP Server 2.4, the first thing you will need to do is +create a hook into the request handling process. A hook is essentially a +message telling the server that you are willing to either serve or at least +take a glance at certain requests given by clients. All handlers, whether +it's mod_rewrite, mod_authn_*, mod_proxy and so on, are hooked into +specific parts of the request process. As you are probably aware, modules +serve different purposes; Some are authentication/authorization handlers, +others are file or script handlers while some third modules rewrite URIs or +proxies content. Furthermore, in the end, it is up to the user of the server +how and when each module will come into place. Thus, the server itself does not +presume to know which module is responsible for handling a specific +request, and will ask each module whether they have an interest in a given +request or not. It is then up to each module to either gently decline +serving a request, accept serving it or flat out deny the request from +being served, as authentication/authorization modules do:
    +Hook handling in httpd
    +To make it a bit easier for handlers such as our mod_example to know +whether the client is requesting content we should handle or not, the server +has directives for hinting to modules whether their assistance is needed or +not. Two of these are AddHandler +and SetHandler. Let's take a look at +an example using AddHandler. In +our example case, we want every request ending with .sum to be served by +mod_example, so we'll add a configuration directive that tells +the server to do just that: +

    +
    AddHandler example-handler .sum
    + +

    +What this tells the server is the following: Whenever we receive a request +for a URI ending in .sum, we are to let all modules know that we are +looking for whoever goes by the name of "example-handler" . +Thus, when a request is being served that ends in .sum, the server will let all +modules know, that this request should be served by "example-handler +". As you will see later, when we start building mod_example, we will +check for this handler tag relayed by AddHandler and reply to +the server based on the value of this tag. +

    + +

    Hooking into httpd

    +

    +To begin with, we only want to create a simple handler that replies to the +client browser when a specific URL is requested, so we won't bother setting +up configuration handlers and directives just yet. Our initial module +definition will look like this:

    + + + +
    module AP_MODULE_DECLARE_DATA   example_module =
    +{
    +    STANDARD20_MODULE_STUFF,
    +    NULL,
    +    NULL,
    +    NULL,
    +    NULL,
    +    NULL,
    +    register_hooks   /* Our hook registering function */
    +};
    + + + + +

    This lets the server know that we are not interested in anything fancy, we +just want to hook onto the requests and possibly handle some of them.

    + +

    The reference in our example declaration, register_hooks +is the name of a function we will create to manage how we hook onto the +request process. In this example module, the function has just one purpose; +To create a simple hook that gets called after all the rewrites, access +control etc has been handled. Thus, we will let the server know that we want +to hook into its process as one of the last modules: +

    + + +
    static void register_hooks(apr_pool_t *pool)
    +{
    +    /* Create a hook in the request handler, so we get called when a request arrives */
    +    ap_hook_handler(example_handler, NULL, NULL, APR_HOOK_LAST);
    +}
    + + + +

    +The example_handler reference is the function that will handle +the request. We will discuss how to create a handler in the next chapter. +

    + +

    Other useful hooks

    +

    +Hooking into the request handling phase is but one of many hooks that you +can create. Some other ways of hooking are: +

    +
      +
    • ap_hook_child_init: Place a hook that executes when a child process is spawned (commonly used for initializing modules after the server has forked)
    • +
    • ap_hook_pre_config: Place a hook that executes before any configuration data has been read (very early hook)
    • +
    • ap_hook_post_config: Place a hook that executes after configuration has been parsed, but before the server has forked
    • +
    • ap_hook_pre_translate_name: Place a hook that executes when a URI needs to be translated into a filename on the server, before decoding
    • +
    • ap_hook_translate_name: Place a hook that executes when a URI needs to be translated into a filename on the server (think mod_rewrite)
    • +
    • ap_hook_quick_handler: Similar to ap_hook_handler, except it is run before any other request hooks (translation, auth, fixups etc)
    • +
    • ap_hook_log_transaction: Place a hook that executes when the server is about to add a log entry of the current request
    • +
    + + +
    top
    +
    +

    Building a handler

    +

    +A handler is essentially a function that receives a callback when a request +to the server is made. It is passed a record of the current request (how it was +made, which headers and requests were passed along, who's giving the +request and so on), and is put in charge of either telling the server that it's +not interested in the request or handle the request with the tools provided. +

    +

    A simple "Hello, world!" +handler

    +

    Let's start off by making a very simple request handler +that does the following: +

    +
      +
    1. Check that this is a request that should be served by "example-handler"
    2. +
    3. Set the content type of our output to text/html
    4. +
    5. Write "Hello, world!" back to the client browser
    6. +
    7. Let the server know that we took care of this request and everything went fine
    8. +
    +

    +In C code, our example handler will now look like this: +

    + + +
    static int example_handler(request_rec *r)
    +{
    +    /* First off, we need to check if this is a call for the "example-handler" handler.
    +     * If it is, we accept it and do our things, if not, we simply return DECLINED,
    +     * and the server will try somewhere else.
    +     */
    +    if (!r->handler || strcmp(r->handler, "example-handler")) return (DECLINED);
    +    
    +    /* Now that we are handling this request, we'll write out "Hello, world!" to the client.
    +     * To do so, we must first set the appropriate content type, followed by our output.
    +     */
    +    ap_set_content_type(r, "text/html");
    +    ap_rprintf(r, "Hello, world!");
    +    
    +    /* Lastly, we must tell the server that we took care of this request and everything went fine.
    +     * We do so by simply returning the value OK to the server.
    +     */
    +    return OK;
    +}
    + + + +

    +Now, we put all we have learned together and end up with a program that +looks like +mod_example_1.c +. The functions used in this example will be explained later in the section +"Some useful functions you should know". +

    + +

    The request_rec structure

    +

    The most essential part of any request is the request record +. In a call to a handler function, this is represented by the +request_rec* structure passed along with every call that is made. +This struct, typically just referred to as r in modules, +contains all the information you need for your module to fully process any +HTTP request and respond accordingly.

    Some key elements of the +request_rec structure are: +

    +
      +
    • r->handler (char*): Contains the name of the handler the server is currently asking to do the handling of this request
    • +
    • r->method (char*): Contains the HTTP method being used, f.x. GET or POST
    • +
    • r->filename (char*): Contains the translated filename the client is requesting
    • +
    • r->args (char*): Contains the query string of the request, if any
    • +
    • r->headers_in (apr_table_t*): Contains all the headers sent by the client
    • +
    • r->connection (conn_rec*): A record containing information about the current connection
    • +
    • r->user (char*): If the URI requires authentication, this is set to the username provided
    • +
    • r->useragent_ip (char*): The IP address of the client connecting to us
    • +
    • r->pool (apr_pool_t*): The memory pool of this request. We'll discuss this in the +"Memory management" chapter.
    • +
    +

    +A complete list of all the values contained within the request_rec structure can be found in +the httpd.h header +file or at http://ci.apache.org/projects/httpd/trunk/doxygen/structrequest__rec.html. +

    + + +

    +Let's try out some of these variables in another example handler:
    +

    + + +
    static int example_handler(request_rec *r)
    +{
    +    /* Set the appropriate content type */
    +    ap_set_content_type(r, "text/html");
    +
    +    /* Print out the IP address of the client connecting to us: */
    +    ap_rprintf(r, "<h2>Hello, %s!</h2>", r->useragent_ip);
    +    
    +    /* If we were reached through a GET or a POST request, be happy, else sad. */
    +    if ( !strcmp(r->method, "POST") || !strcmp(r->method, "GET") ) {
    +        ap_rputs("You used a GET or a POST method, that makes us happy!<br/>", r);
    +    }
    +    else {
    +        ap_rputs("You did not use POST or GET, that makes us sad :(<br/>", r);
    +    }
    +
    +    /* Lastly, if there was a query string, let's print that too! */
    +    if (r->args) {
    +        ap_rprintf(r, "Your query string was: %s", r->args);
    +    }
    +    return OK;
    +}
    + + + + + +

    Return values

    +

    +Apache relies on return values from handlers to signify whether a request +was handled or not, and if so, whether the request went well or not. If a +module is not interested in handling a specific request, it should always +return the value DECLINED. If it is handling a request, it +should either return the generic value OK, or a specific HTTP +status code, for example: +

    + + +
    static int example_handler(request_rec *r)
    +{
    +    /* Return 404: Not found */
    +    return HTTP_NOT_FOUND;
    +}
    + + + +

    +Returning OK or a HTTP status code does not necessarily mean +that the request will end. The server may still have other handlers that are +interested in this request, for instance the logging modules which, upon a +successful request, will write down a summary of what was requested and how +it went. To do a full stop and prevent any further processing after your +module is done, you can return the value DONE to let the server +know that it should cease all activity on this request and carry on with +the next, without informing other handlers. +
    +General response codes: +

    +
      +
    • DECLINED: We are not handling this request
    • +
    • OK: We handled this request and it went well
    • +
    • DONE: We handled this request and the server should just close this thread without further processing
    • +
    +

    +HTTP specific return codes (excerpt): +

    +
      +
    • HTTP_OK (200): Request was okay
    • +
    • HTTP_MOVED_PERMANENTLY (301): The resource has moved to a new URL
    • +
    • HTTP_UNAUTHORIZED (401): Client is not authorized to visit this page
    • +
    • HTTP_FORBIDDEN (403): Permission denied
    • +
    • HTTP_NOT_FOUND (404): File not found
    • +
    • HTTP_INTERNAL_SERVER_ERROR (500): Internal server error (self explanatory)
    • +
    + + +

    Some useful functions you should know

    + +
      +
    • + ap_rputs(const char *string, request_rec *r):
      + Sends a string of text to the client. This is a shorthand version of + ap_rwrite. + + + +
      ap_rputs("Hello, world!", r);
      + + + + +
    • +
    • + + ap_rprintf:
      + This function works just like printf, except it sends the result to the client. + + + +
      ap_rprintf(r, "Hello, %s!", r->useragent_ip);
      + + + +
    • +
    • + + ap_set_content_type(request_rec *r, const char *type):
      + Sets the content type of the output you are sending. + + + +
      ap_set_content_type(r, "text/plain"); /* force a raw text output */
      + + + +
    • + + +
    + + +

    Memory management

    +

    +Managing your resources in Apache HTTP Server 2.4 is quite easy, thanks to the memory pool +system. In essence, each server, connection and request have their own +memory pool that gets cleaned up when its scope ends, e.g. when a request +is done or when a server process shuts down. All your module needs to do is +latch onto this memory pool, and you won't have to worry about having to +clean up after yourself - pretty neat, huh? +

    + +

    +In our module, we will primarily be allocating memory for each request, so +it's appropriate to use the r->pool +reference when creating new objects. A few of the functions for allocating +memory within a pool are: +

    +
      +
    • void* apr_palloc( +apr_pool_t *p, apr_size_t size): Allocates size number of bytes in the pool for you
    • +
    • void* apr_pcalloc( +apr_pool_t *p, apr_size_t size): Allocates size number of bytes in the pool for you and sets all bytes to 0
    • +
    • char* apr_pstrdup( +apr_pool_t *p, const char *s): Creates a duplicate of the string s. This is useful for copying constant values so you can edit them
    • +
    • char* apr_psprintf( +apr_pool_t *p, const char *fmt, ...): Similar to sprintf, except the server supplies you with an appropriately allocated target variable
    • +
    + +

    Let's put these functions into an example handler:

    + + + +
    static int example_handler(request_rec *r)
    +{
    +    const char *original = "You can't edit this!";
    +    char *copy;
    +    int *integers;
    +    
    +    /* Allocate space for 10 integer values and set them all to zero. */
    +    integers = apr_pcalloc(r->pool, sizeof(int)*10); 
    +    
    +    /* Create a copy of the 'original' variable that we can edit. */
    +    copy = apr_pstrdup(r->pool, original);
    +    return OK;
    +}
    + + + +

    +This is all well and good for our module, which won't need any +pre-initialized variables or structures. However, if we wanted to +initialize something early on, before the requests come rolling in, we +could simply add a call to a function in our register_hooks +function to sort it out: +

    + + +
    static void register_hooks(apr_pool_t *pool)
    +{
    +    /* Call a function that initializes some stuff */
    +    example_init_function(pool);
    +    /* Create a hook in the request handler, so we get called when a request arrives */
    +    ap_hook_handler(example_handler, NULL, NULL, APR_HOOK_LAST);
    +}
    + + + +

    +In this pre-request initialization function we would not be using the +same pool as we did when allocating resources for request-based functions. +Instead, we would use the pool given to us by the server for allocating memory +on a per-process based level. +

    + + +

    Parsing request data

    +

    +In our example module, we would like to add a feature, that checks which +type of digest, MD5 or SHA1 the client would like to see. This could be +solved by adding a query string to the request. A query string is typically +comprised of several keys and values put together in a string, for instance +valueA=yes&valueB=no&valueC=maybe. It is up to the +module itself to parse these and get the data it requires. In our example, +we'll be looking for a key called digest, and if set to +md5, we'll produce an MD5 digest, otherwise we'll produce a SHA1 +digest. +

    +

    +Since the introduction of Apache HTTP Server 2.4, parsing request data from GET and +POST requests have never been easier. All we require to parse both GET and +POST data is four simple lines: +

    + + + +
    +apr_table_t *GET; 
    +apr_array_header_t*POST; 
    +
    +
    +
    +ap_args_to_table(r, &GET); 
    +
    +ap_parse_form_data(r, NULL, &POST, -1, 8192);
    + + + +

    +In our specific example module, we're looking for the digest +value from the query string, which now resides inside a table called +GET. To extract this value, we need only perform a simple operation: +

    + + + +
    /* Get the "digest" key from the query string, if any. */
    +const char *digestType = apr_table_get(GET, "digest");
    +
    +/* If no key was returned, we will set a default value instead. */
    +if (!digestType) digestType = "sha1";
    + + + +

    +The structures used for the POST and GET data are not exactly the same, so +if we were to fetch a value from POST data instead of the query string, we +would have to resort to a few more lines, as outlined in this example in the last chapter of this document. +

    + + +

    Making an advanced handler

    +

    +Now that we have learned how to parse form data and manage our resources, +we can move on to creating an advanced version of our module, that spits +out the MD5 or SHA1 digest of files: +

    + + + +
    static int example_handler(request_rec *r)
    +{
    +    int rc, exists;
    +    apr_finfo_t finfo;
    +    apr_file_t *file;
    +    char *filename;
    +    char buffer[256];
    +    apr_size_t readBytes;
    +    int n;
    +    apr_table_t *GET;
    +    apr_array_header_t *POST;
    +    const char *digestType;
    +    
    +    
    +    /* Check that the "example-handler" handler is being called. */
    +    if (!r->handler || strcmp(r->handler, "example-handler")) return (DECLINED);
    +    
    +    /* Figure out which file is being requested by removing the .sum from it */
    +    filename = apr_pstrdup(r->pool, r->filename);
    +    filename[strlen(filename)-4] = 0; /* Cut off the last 4 characters. */
    +    
    +    /* Figure out if the file we request a sum on exists and isn't a directory */
    +    rc = apr_stat(&finfo, filename, APR_FINFO_MIN, r->pool);
    +    if (rc == APR_SUCCESS) {
    +        exists =
    +        (
    +            (finfo.filetype != APR_NOFILE)
    +        &&  !(finfo.filetype & APR_DIR)
    +        );
    +        if (!exists) return HTTP_NOT_FOUND; /* Return a 404 if not found. */
    +    }
    +    /* If apr_stat failed, we're probably not allowed to check this file. */
    +    else return HTTP_FORBIDDEN;
    +    
    +    /* Parse the GET and, optionally, the POST data sent to us */
    +    
    +    ap_args_to_table(r, &GET);
    +    ap_parse_form_data(r, NULL, &POST, -1, 8192);
    +    
    +    /* Set the appropriate content type */
    +    ap_set_content_type(r, "text/html");
    +    
    +    /* Print a title and some general information */
    +    ap_rprintf(r, "<h2>Information on %s:</h2>", filename);
    +    ap_rprintf(r, "<b>Size:</b> %u bytes<br/>", finfo.size);
    +    
    +    /* Get the digest type the client wants to see */
    +    digestType = apr_table_get(GET, "digest");
    +    if (!digestType) digestType = "MD5";
    +    
    +    
    +    rc = apr_file_open(&file, filename, APR_READ, APR_OS_DEFAULT, r->pool);
    +    if (rc == APR_SUCCESS) {
    +        
    +        /* Are we trying to calculate the MD5 or the SHA1 digest? */
    +        if (!strcasecmp(digestType, "md5")) {
    +            /* Calculate the MD5 sum of the file */
    +            union {
    +                char      chr[16];
    +                uint32_t  num[4];
    +            } digest;
    +            apr_md5_ctx_t md5;
    +            apr_md5_init(&md5);
    +            readBytes = 256;
    +            while ( apr_file_read(file, buffer, &readBytes) == APR_SUCCESS ) {
    +                apr_md5_update(&md5, buffer, readBytes);
    +            }
    +            apr_md5_final(digest.chr, &md5);
    +            
    +            /* Print out the MD5 digest */
    +            ap_rputs("<b>MD5: </b><code>", r);
    +            for (n = 0; n < APR_MD5_DIGESTSIZE/4; n++) {
    +                ap_rprintf(r, "%08x", digest.num[n]);
    +            }
    +            ap_rputs("</code>", r);
    +            /* Print a link to the SHA1 version */
    +            ap_rputs("<br/><a href='?digest=sha1'>View the SHA1 hash instead</a>", r);
    +        }
    +        else {
    +            /* Calculate the SHA1 sum of the file */
    +            union {
    +                char      chr[20];
    +                uint32_t  num[5];
    +            } digest;
    +            apr_sha1_ctx_t sha1;
    +            apr_sha1_init(&sha1);
    +            readBytes = 256;
    +            while ( apr_file_read(file, buffer, &readBytes) == APR_SUCCESS ) {
    +                apr_sha1_update(&sha1, buffer, readBytes);
    +            }
    +            apr_sha1_final(digest.chr, &sha1);
    +            
    +            /* Print out the SHA1 digest */
    +            ap_rputs("<b>SHA1: </b><code>", r);
    +            for (n = 0; n < APR_SHA1_DIGESTSIZE/4; n++) {
    +                ap_rprintf(r, "%08x", digest.num[n]);
    +            }
    +            ap_rputs("</code>", r);
    +            
    +            /* Print a link to the MD5 version */
    +            ap_rputs("<br/><a href='?digest=md5'>View the MD5 hash instead</a>", r);
    +        }
    +        apr_file_close(file);
    +        
    +    }    
    +    /* Let the server know that we responded to this request. */
    +    return OK;
    +}
    + + + +

    +This version in its entirety can be found here: +mod_example_2.c. +

    + + +
    top
    +
    +

    Adding configuration options

    +

    +In this next segment of this document, we will turn our eyes away from the +digest module and create a new example module, whose only function is to +write out its own configuration. The purpose of this is to examine how +the server works with configuration, and what happens when you start writing +advanced configurations +for your modules. +

    +

    An introduction to configuration +directives

    +

    +If you are reading this, then you probably already know +what a configuration directive is. Simply put, a directive is a way of +telling an individual module (or a set of modules) how to behave, such as +these directives control how mod_rewrite works: +

    +
    RewriteEngine On
    +RewriteCond "%{REQUEST_URI}" "^/foo/bar"
    +RewriteRule "^/foo/bar/(.*)$" "/foobar?page=$1"
    + +

    +Each of these configuration directives are handled by a separate function, +that parses the parameters given and sets up a configuration accordingly. +

    + +

    Making an example configuration

    +

    To begin with, we'll create a basic configuration in C-space:

    + + + +
    typedef struct {
    +    int         enabled;      /* Enable or disable our module */
    +    const char *path;         /* Some path to...something */
    +    int         typeOfAction; /* 1 means action A, 2 means action B and so on */
    +} example_config;
    + + + +

    +Now, let's put this into perspective by creating a very small module that +just prints out a hard-coded configuration. You'll notice that we use the +register_hooks function for initializing the configuration +values to their defaults: +

    + + +
    typedef struct {
    +    int         enabled;      /* Enable or disable our module */
    +    const char *path;         /* Some path to...something */
    +    int         typeOfAction; /* 1 means action A, 2 means action B and so on */
    +} example_config;
    +
    +static example_config config;
    +
    +static int example_handler(request_rec *r)
    +{
    +    if (!r->handler || strcmp(r->handler, "example-handler")) return(DECLINED);
    +    ap_set_content_type(r, "text/plain");
    +    ap_rprintf(r, "Enabled: %u\n", config.enabled);
    +    ap_rprintf(r, "Path: %s\n", config.path);
    +    ap_rprintf(r, "TypeOfAction: %x\n", config.typeOfAction);
    +    return OK;
    +}
    +
    +static void register_hooks(apr_pool_t *pool) 
    +{
    +    config.enabled = 1;
    +    config.path = "/foo/bar";
    +    config.typeOfAction = 0x00;
    +    ap_hook_handler(example_handler, NULL, NULL, APR_HOOK_LAST);
    +}
    +
    +/* Define our module as an entity and assign a function for registering hooks  */
    +
    +module AP_MODULE_DECLARE_DATA   example_module =
    +{
    +    STANDARD20_MODULE_STUFF,
    +    NULL,            /* Per-directory configuration handler */
    +    NULL,            /* Merge handler for per-directory configurations */
    +    NULL,            /* Per-server configuration handler */
    +    NULL,            /* Merge handler for per-server configurations */
    +    NULL,            /* Any directives we may have for httpd */
    +    register_hooks   /* Our hook registering function */
    +};
    + + + +

    +So far so good. To access our new handler, we could add the following to +our configuration: +

    +
    <Location "/example">
    +    SetHandler example-handler
    +</Location>
    + +

    +When we visit, we'll see our current configuration being spit out by our +module. +

    + + +

    Registering directives with the server

    +

    +What if we want to change our configuration, not by hard-coding new values +into the module, but by using either the httpd.conf file or possibly a +.htaccess file? It's time to let the server know that we want this to be +possible. To do so, we must first change our name tag to include a +reference to the configuration directives we want to register with the server: +

    + + +
    module AP_MODULE_DECLARE_DATA   example_module =
    +{
    +    STANDARD20_MODULE_STUFF,
    +    NULL,               /* Per-directory configuration handler */
    +    NULL,               /* Merge handler for per-directory configurations */
    +    NULL,               /* Per-server configuration handler */
    +    NULL,               /* Merge handler for per-server configurations */
    +    example_directives, /* Any directives we may have for httpd */
    +    register_hooks      /* Our hook registering function */
    +};
    + + + +

    +This will tell the server that we are now accepting directives from the +configuration files, and that the structure called example_directives + holds information on what our directives are and how they work. +Since we have three different variables in our module configuration, we +will add a structure with three directives and a NULL at the end: +

    + + +
    static const command_rec        example_directives[] =
    +{
    +    AP_INIT_TAKE1("exampleEnabled", example_set_enabled, NULL, RSRC_CONF, "Enable or disable mod_example"),
    +    AP_INIT_TAKE1("examplePath", example_set_path, NULL, RSRC_CONF, "The path to whatever"),
    +    AP_INIT_TAKE2("exampleAction", example_set_action, NULL, RSRC_CONF, "Special action value!"),
    +    { NULL }
    +};
    + + + +

    +Directives structure
    +As you can see, each directive needs at least 5 parameters set: +

    +
      +
    1. AP_INIT_TAKE1: This is a macro that tells the server that this directive takes one and only one argument. +If we required two arguments, we could use the macro AP_INIT_TAKE2 and so on (refer to httpd_conf.h +for more macros).
    2. +
    3. exampleEnabled: This is the name of our directive. More precisely, it is what the user must put in his/her +configuration in order to invoke a configuration change in our module.
    4. +
    5. example_set_enabled: This is a reference to a C function that parses the directive and sets the configuration +accordingly. We will discuss how to make this in the following paragraph.
    6. +
    7. RSRC_CONF: This tells the server where the directive is permitted. We'll go into details on this value in the +later chapters, but for now, RSRC_CONF means that the server will only accept these directives in a server context.
    8. +
    9. "Enable or disable....": This is simply a brief description of what the directive does.
    10. +
    +

    +(The "missing" parameter in our definition, which is usually set to +NULL, is an optional function that can be run after the +initial function to parse the arguments have been run. This is usually +omitted, as the function for verifying arguments might as well be used to +set them.) +

    + +

    The directive handler function

    +

    +Now that we have told the server to expect some directives for our module, it's +time to make a few functions for handling these. What the server reads in the +configuration file(s) is text, and so naturally, what it passes along to +our directive handler is one or more strings, that we ourselves need to +recognize and act upon. You'll notice, that since we set our +exampleAction directive to accept two arguments, its C function also +has an additional parameter defined:

    + + +
    /* Handler for the "exampleEnabled" directive */
    +const char *example_set_enabled(cmd_parms *cmd, void *cfg, const char *arg)
    +{
    +    if(!strcasecmp(arg, "on")) config.enabled = 1;
    +    else config.enabled = 0;
    +    return NULL;
    +}
    +
    +/* Handler for the "examplePath" directive */
    +const char *example_set_path(cmd_parms *cmd, void *cfg, const char *arg)
    +{
    +    config.path = arg;
    +    return NULL;
    +}
    +
    +/* Handler for the "exampleAction" directive */
    +/* Let's pretend this one takes one argument (file or db), and a second (deny or allow), */
    +/* and we store it in a bit-wise manner. */
    +const char *example_set_action(cmd_parms *cmd, void *cfg, const char *arg1, const char *arg2)
    +{
    +    if(!strcasecmp(arg1, "file")) config.typeOfAction = 0x01;
    +    else config.typeOfAction = 0x02;
    +    
    +    if(!strcasecmp(arg2, "deny")) config.typeOfAction += 0x10;
    +    else config.typeOfAction += 0x20;
    +    return NULL;
    +}
    + + + + + +

    Putting it all together

    +

    +Now that we have our directives set up, and handlers configured for them, +we can assemble our module into one big file: +

    + + +
    /* mod_example_config_simple.c: */
    +#include <stdio.h>
    +#include "apr_hash.h"
    +#include "ap_config.h"
    +#include "ap_provider.h"
    +#include "httpd.h"
    +#include "http_core.h"
    +#include "http_config.h"
    +#include "http_log.h"
    +#include "http_protocol.h"
    +#include "http_request.h"
    +
    +/*
    + ==============================================================================
    + Our configuration prototype and declaration:
    + ==============================================================================
    + */
    +typedef struct {
    +    int         enabled;      /* Enable or disable our module */
    +    const char *path;         /* Some path to...something */
    +    int         typeOfAction; /* 1 means action A, 2 means action B and so on */
    +} example_config;
    +
    +static example_config config;
    +
    +/*
    + ==============================================================================
    + Our directive handlers:
    + ==============================================================================
    + */
    +/* Handler for the "exampleEnabled" directive */
    +const char *example_set_enabled(cmd_parms *cmd, void *cfg, const char *arg)
    +{
    +    if(!strcasecmp(arg, "on")) config.enabled = 1;
    +    else config.enabled = 0;
    +    return NULL;
    +}
    +
    +/* Handler for the "examplePath" directive */
    +const char *example_set_path(cmd_parms *cmd, void *cfg, const char *arg)
    +{
    +    config.path = arg;
    +    return NULL;
    +}
    +
    +/* Handler for the "exampleAction" directive */
    +/* Let's pretend this one takes one argument (file or db), and a second (deny or allow), */
    +/* and we store it in a bit-wise manner. */
    +const char *example_set_action(cmd_parms *cmd, void *cfg, const char *arg1, const char *arg2)
    +{
    +    if(!strcasecmp(arg1, "file")) config.typeOfAction = 0x01;
    +    else config.typeOfAction = 0x02;
    +    
    +    if(!strcasecmp(arg2, "deny")) config.typeOfAction += 0x10;
    +    else config.typeOfAction += 0x20;
    +    return NULL;
    +}
    +
    +/*
    + ==============================================================================
    + The directive structure for our name tag:
    + ==============================================================================
    + */
    +static const command_rec        example_directives[] =
    +{
    +    AP_INIT_TAKE1("exampleEnabled", example_set_enabled, NULL, RSRC_CONF, "Enable or disable mod_example"),
    +    AP_INIT_TAKE1("examplePath", example_set_path, NULL, RSRC_CONF, "The path to whatever"),
    +    AP_INIT_TAKE2("exampleAction", example_set_action, NULL, RSRC_CONF, "Special action value!"),
    +    { NULL }
    +};
    +/*
    + ==============================================================================
    + Our module handler:
    + ==============================================================================
    + */
    +static int example_handler(request_rec *r)
    +{
    +    if(!r->handler || strcmp(r->handler, "example-handler")) return(DECLINED);
    +    ap_set_content_type(r, "text/plain");
    +    ap_rprintf(r, "Enabled: %u\n", config.enabled);
    +    ap_rprintf(r, "Path: %s\n", config.path);
    +    ap_rprintf(r, "TypeOfAction: %x\n", config.typeOfAction);
    +    return OK;
    +}
    +
    +/*
    + ==============================================================================
    + The hook registration function (also initializes the default config values):
    + ==============================================================================
    + */
    +static void register_hooks(apr_pool_t *pool) 
    +{
    +    config.enabled = 1;
    +    config.path = "/foo/bar";
    +    config.typeOfAction = 3;
    +    ap_hook_handler(example_handler, NULL, NULL, APR_HOOK_LAST);
    +}
    +/*
    + ==============================================================================
    + Our module name tag:
    + ==============================================================================
    + */
    +module AP_MODULE_DECLARE_DATA   example_module =
    +{
    +    STANDARD20_MODULE_STUFF,
    +    NULL,               /* Per-directory configuration handler */
    +    NULL,               /* Merge handler for per-directory configurations */
    +    NULL,               /* Per-server configuration handler */
    +    NULL,               /* Merge handler for per-server configurations */
    +    example_directives, /* Any directives we may have for httpd */
    +    register_hooks      /* Our hook registering function */
    +};
    + + + + +

    +In our httpd.conf file, we can now change the hard-coded configuration by +adding a few lines: +

    +
    ExampleEnabled On
    +ExamplePath "/usr/bin/foo"
    +ExampleAction file allow
    + +

    +And thus we apply the configuration, visit /example on our +web site, and we see the configuration has adapted to what we wrote in our +configuration file. +

    + + + +
    top
    +
    +

    Context aware configurations

    +

    Introduction to context aware configurations

    +

    +In Apache HTTP Server 2.4, different URLs, virtual hosts, directories etc can have very +different meanings to the user of the server, and thus different contexts +within which modules must operate. For example, let's assume you have this +configuration set up for mod_rewrite: +

    +
    <Directory "/var/www">
    +    RewriteCond "%{HTTP_HOST}" "^example.com$"
    +    RewriteRule "(.*)" "http://www.example.com/$1"
    +</Directory>
    +<Directory "/var/www/sub">
    +    RewriteRule "^foobar$" "index.php?foobar=true"
    +</Directory>
    + +

    +In this example, you will have set up two different contexts for +mod_rewrite:

    +
      +
    1. Inside /var/www, all requests for http://example.com must go to http://www.example.com
    2. +
    3. Inside /var/www/sub, all requests for foobar must go to index.php?foobar=true
    4. +
    +

    +If mod_rewrite (or the entire server for that matter) wasn't context aware, then +these rewrite rules would just apply to every and any request made, +regardless of where and how they were made, but since the module can pull +the context specific configuration straight from the server, it does not need +to know itself, which of the directives are valid in this context, since +the server takes care of this.

    + +

    +So how does a module get the specific configuration for the server, +directory or location in question? It does so by making one simple call: +

    + + +
    example_config *config = (example_config*) ap_get_module_config(r->per_dir_config, &example_module);
    + + + +

    +That's it! Of course, a whole lot goes on behind the scenes, which we will +discuss in this chapter, starting with how the server came to know what our +configuration looks like, and how it came to be set up as it is in the +specific context. +

    + + +

    Our basic configuration setup

    +

    In this chapter, we will be working with a slightly modified version of +our previous context structure. We will set a context +variable that we can use to track which context configuration is being +used by the server in various places: +

    + +
    typedef struct {
    +    char        context[256];
    +    char        path[256];
    +    int         typeOfAction;
    +    int         enabled;
    +} example_config;
    + + + +

    Our handler for requests will also be modified, yet still very simple:

    + + + +
    static int example_handler(request_rec *r)
    +{
    +    if(!r->handler || strcmp(r->handler, "example-handler")) return(DECLINED);
    +    example_config *config = (example_config*) ap_get_module_config(r->per_dir_config, &example_module);
    +    ap_set_content_type(r, "text/plain");
    +    ap_rprintf("Enabled: %u\n", config->enabled);
    +    ap_rprintf("Path: %s\n", config->path);
    +    ap_rprintf("TypeOfAction: %x\n", config->typeOfAction);
    +    ap_rprintf("Context: %s\n", config->context);
    +    return OK;
    +}
    + + + + + +

    Choosing a context

    +

    +Before we can start making our module context aware, we must first define, +which contexts we will accept. As we saw in the previous chapter, defining +a directive required five elements be set:

    + + + +
    AP_INIT_TAKE1("exampleEnabled", example_set_enabled, NULL, RSRC_CONF, "Enable or disable mod_example"),
    + + + + +

    The RSRC_CONF definition told the server that we would only allow +this directive in a global server context, but since we are now trying out +a context aware version of our module, we should set this to something +more lenient, namely the value ACCESS_CONF, which lets us use +the directive inside <Directory> and <Location> blocks. For more +control over the placement of your directives, you can combine the following +restrictions together to form a specific rule: +

    +
      +
    • RSRC_CONF: Allow in .conf files (not .htaccess) outside <Directory> or <Location>
    • +
    • ACCESS_CONF: Allow in .conf files (not .htaccess) inside <Directory> or <Location>
    • +
    • OR_OPTIONS: Allow in .conf files and .htaccess when AllowOverride Options is set
    • +
    • OR_FILEINFO: Allow in .conf files and .htaccess when AllowOverride FileInfo is set
    • +
    • OR_AUTHCFG: Allow in .conf files and .htaccess when AllowOverride AuthConfig is set
    • +
    • OR_INDEXES: Allow in .conf files and .htaccess when AllowOverride Indexes is set
    • +
    • OR_ALL: Allow anywhere in .conf files and .htaccess
    • +
    + + +

    Using the server to allocate configuration slots

    +

    A much smarter way to manage your configurations is by letting the server +help you create them. To do so, we must first start off by changing our +name tag to let the server know, that it should assist us in creating +and managing our configurations. Since we have chosen the per-directory +(or per-location) context for our module configurations, we'll add a +per-directory creator and merger function reference in our tag:

    + + +
    module AP_MODULE_DECLARE_DATA   example_module =
    +{
    +    STANDARD20_MODULE_STUFF,
    +    create_dir_conf, /* Per-directory configuration handler */
    +    merge_dir_conf,  /* Merge handler for per-directory configurations */
    +    NULL,            /* Per-server configuration handler */
    +    NULL,            /* Merge handler for per-server configurations */
    +    directives,      /* Any directives we may have for httpd */
    +    register_hooks   /* Our hook registering function */
    +};
    + + + + + + + +

    Creating new context configurations

    +

    +Now that we have told the server to help us create and manage configurations, +our first step is to make a function for creating new, blank +configurations. We do so by creating the function we just referenced in +our name tag as the Per-directory configuration handler:

    + +
    void *create_dir_conf(apr_pool_t *pool, char *context) {
    +    context = context ? context : "(undefined context)";
    +    example_config *cfg = apr_pcalloc(pool, sizeof(example_config));
    +    if(cfg) {
    +        /* Set some default values */
    +        strcpy(cfg->context, context);
    +        cfg->enabled = 0;
    +        cfg->path = "/foo/bar";
    +        cfg->typeOfAction = 0x11;
    +    }
    +    return cfg;
    +}
    + + + + + + +

    Merging configurations

    +

    +Our next step in creating a context aware configuration is merging +configurations. This part of the process particularly applies to scenarios +where you have a parent configuration and a child, such as the following: +

    +
    <Directory "/var/www">
    +    ExampleEnabled On
    +    ExamplePath "/foo/bar"
    +    ExampleAction file allow
    +</Directory>
    +<Directory "/var/www/subdir">
    +    ExampleAction file deny
    +</Directory>
    + +

    +In this example, it is natural to assume that the directory +/var/www/subdir should inherit the values set for the /var/www + directory, as we did not specify an ExampleEnabled nor +an ExamplePath for this directory. The server does not presume to +know if this is true, but cleverly does the following: +

    +
      +
    1. Creates a new configuration for /var/www
    2. +
    3. Sets the configuration values according to the directives given for /var/www
    4. +
    5. Creates a new configuration for /var/www/subdir
    6. +
    7. Sets the configuration values according to the directives given for /var/www/subdir
    8. +
    9. Proposes a merge of the two configurations into a new configuration for /var/www/subdir
    10. +
    +

    +This proposal is handled by the merge_dir_conf function we +referenced in our name tag. The purpose of this function is to assess the +two configurations and decide how they are to be merged:

    + + + +
    void *merge_dir_conf(apr_pool_t *pool, void *BASE, void *ADD) {
    +    example_config *base = (example_config *) BASE ; /* This is what was set in the parent context */
    +    example_config *add = (example_config *) ADD ;   /* This is what is set in the new context */
    +    example_config *conf = (example_config *) create_dir_conf(pool, "Merged configuration"); /* This will be the merged configuration */
    +    
    +    /* Merge configurations */
    +    conf->enabled = ( add->enabled == 0 ) ? base->enabled : add->enabled ;
    +    conf->typeOfAction = add->typeOfAction ? add->typeOfAction : base->typeOfAction;
    +    strcpy(conf->path, strlen(add->path) ? add->path : base->path);
    +    
    +    return conf ;
    +}
    + + + + + + +

    Trying out our new context aware configurations

    +

    +Now, let's try putting it all together to create a new module that is +context aware. First off, we'll create a configuration that lets us test +how the module works: +

    +
    <Location "/a">
    +    SetHandler example-handler
    +    ExampleEnabled on
    +    ExamplePath "/foo/bar"
    +    ExampleAction file allow
    +</Location>
    +
    +<Location "/a/b">
    +    ExampleAction file deny
    +    ExampleEnabled off
    +</Location>
    +
    +<Location "/a/b/c">
    +    ExampleAction db deny
    +    ExamplePath "/foo/bar/baz"
    +    ExampleEnabled on
    +</Location>
    + +

    +Then we'll assemble our module code. Note, that since we are now using our +name tag as reference when fetching configurations in our handler, I have +added some prototypes to keep the compiler happy: +

    + + +
    /*$6
    + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    + * mod_example_config.c
    + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    + */
    +
    +
    +#include <stdio.h>
    +#include "apr_hash.h"
    +#include "ap_config.h"
    +#include "ap_provider.h"
    +#include "httpd.h"
    +#include "http_core.h"
    +#include "http_config.h"
    +#include "http_log.h"
    +#include "http_protocol.h"
    +#include "http_request.h"
    +
    +/*$1
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +    Configuration structure
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + */
    +
    +typedef struct
    +{
    +    char    context[256];
    +    char    path[256];
    +    int     typeOfAction;
    +    int     enabled;
    +} example_config;
    +
    +/*$1
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +    Prototypes
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + */
    +
    +static int    example_handler(request_rec *r);
    +const char    *example_set_enabled(cmd_parms *cmd, void *cfg, const char *arg);
    +const char    *example_set_path(cmd_parms *cmd, void *cfg, const char *arg);
    +const char    *example_set_action(cmd_parms *cmd, void *cfg, const char *arg1, const char *arg2);
    +void          *create_dir_conf(apr_pool_t *pool, char *context);
    +void          *merge_dir_conf(apr_pool_t *pool, void *BASE, void *ADD);
    +static void   register_hooks(apr_pool_t *pool);
    +
    +/*$1
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +    Configuration directives
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + */
    +
    +static const command_rec    directives[] =
    +{
    +    AP_INIT_TAKE1("exampleEnabled", example_set_enabled, NULL, ACCESS_CONF, "Enable or disable mod_example"),
    +    AP_INIT_TAKE1("examplePath", example_set_path, NULL, ACCESS_CONF, "The path to whatever"),
    +    AP_INIT_TAKE2("exampleAction", example_set_action, NULL, ACCESS_CONF, "Special action value!"),
    +    { NULL }
    +};
    +
    +/*$1
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +    Our name tag
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + */
    +
    +module AP_MODULE_DECLARE_DATA    example_module =
    +{
    +    STANDARD20_MODULE_STUFF,
    +    create_dir_conf,    /* Per-directory configuration handler */
    +    merge_dir_conf,     /* Merge handler for per-directory configurations */
    +    NULL,               /* Per-server configuration handler */
    +    NULL,               /* Merge handler for per-server configurations */
    +    directives,         /* Any directives we may have for httpd */
    +    register_hooks      /* Our hook registering function */
    +};
    +
    +/*
    + =======================================================================================================================
    +    Hook registration function
    + =======================================================================================================================
    + */
    +static void register_hooks(apr_pool_t *pool)
    +{
    +    ap_hook_handler(example_handler, NULL, NULL, APR_HOOK_LAST);
    +}
    +
    +/*
    + =======================================================================================================================
    +    Our example web service handler
    + =======================================================================================================================
    + */
    +static int example_handler(request_rec *r)
    +{
    +    if(!r->handler || strcmp(r->handler, "example-handler")) return(DECLINED);
    +
    +    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +    example_config    *config = (example_config *) ap_get_module_config(r->per_dir_config, &example_module);
    +    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +
    +    ap_set_content_type(r, "text/plain");
    +    ap_rprintf(r, "Enabled: %u\n", config->enabled);
    +    ap_rprintf(r, "Path: %s\n", config->path);
    +    ap_rprintf(r, "TypeOfAction: %x\n", config->typeOfAction);
    +    ap_rprintf(r, "Context: %s\n", config->context);
    +    return OK;
    +}
    +
    +/*
    + =======================================================================================================================
    +    Handler for the "exampleEnabled" directive
    + =======================================================================================================================
    + */
    +const char *example_set_enabled(cmd_parms *cmd, void *cfg, const char *arg)
    +{
    +    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +    example_config    *conf = (example_config *) cfg;
    +    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +
    +    if(conf)
    +    {
    +        if(!strcasecmp(arg, "on"))
    +            conf->enabled = 1;
    +        else
    +            conf->enabled = 0;
    +    }
    +
    +    return NULL;
    +}
    +
    +/*
    + =======================================================================================================================
    +    Handler for the "examplePath" directive
    + =======================================================================================================================
    + */
    +const char *example_set_path(cmd_parms *cmd, void *cfg, const char *arg)
    +{
    +    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +    example_config    *conf = (example_config *) cfg;
    +    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +
    +    if(conf)
    +    {
    +        strcpy(conf->path, arg);
    +    }
    +
    +    return NULL;
    +}
    +
    +/*
    + =======================================================================================================================
    +    Handler for the "exampleAction" directive ;
    +    Let's pretend this one takes one argument (file or db), and a second (deny or allow), ;
    +    and we store it in a bit-wise manner.
    + =======================================================================================================================
    + */
    +const char *example_set_action(cmd_parms *cmd, void *cfg, const char *arg1, const char *arg2)
    +{
    +    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +    example_config    *conf = (example_config *) cfg;
    +    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +
    +    if(conf)
    +    {
    +        {
    +            if(!strcasecmp(arg1, "file"))
    +                conf->typeOfAction = 0x01;
    +            else
    +                conf->typeOfAction = 0x02;
    +            if(!strcasecmp(arg2, "deny"))
    +                conf->typeOfAction += 0x10;
    +            else
    +                conf->typeOfAction += 0x20;
    +        }
    +    }
    +
    +    return NULL;
    +}
    +
    +/*
    + =======================================================================================================================
    +    Function for creating new configurations for per-directory contexts
    + =======================================================================================================================
    + */
    +void *create_dir_conf(apr_pool_t *pool, char *context)
    +{
    +    context = context ? context : "Newly created configuration";
    +
    +    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +    example_config    *cfg = apr_pcalloc(pool, sizeof(example_config));
    +    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +
    +    if(cfg)
    +    {
    +        {
    +            /* Set some default values */
    +            strcpy(cfg->context, context);
    +            cfg->enabled = 0;
    +            memset(cfg->path, 0, 256);
    +            cfg->typeOfAction = 0x00;
    +        }
    +    }
    +
    +    return cfg;
    +}
    +
    +/*
    + =======================================================================================================================
    +    Merging function for configurations
    + =======================================================================================================================
    + */
    +void *merge_dir_conf(apr_pool_t *pool, void *BASE, void *ADD)
    +{
    +    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +    example_config    *base = (example_config *) BASE;
    +    example_config    *add = (example_config *) ADD;
    +    example_config    *conf = (example_config *) create_dir_conf(pool, "Merged configuration");
    +    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +
    +    conf->enabled = (add->enabled == 0) ? base->enabled : add->enabled;
    +    conf->typeOfAction = add->typeOfAction ? add->typeOfAction : base->typeOfAction;
    +    strcpy(conf->path, strlen(add->path) ? add->path : base->path);
    +    return conf;
    +}
    + + + + + + + +
    top
    +
    +

    Summing up

    +

    +We have now looked at how to create simple modules for Apache HTTP Server 2.4 and +configuring them. What you do next is entirely up to you, but it is my +hope that something valuable has come out of reading this documentation. +If you have questions on how to further develop modules, you are welcome +to join our mailing lists +or check out the rest of our documentation for further tips. +

    +
    top
    +
    +

    Some useful snippets of code

    + +

    Retrieve variables from POST form data

    + + + +
    typedef struct {
    +    const char *key;
    +    const char *value;
    +} keyValuePair;
    +
    +keyValuePair *readPost(request_rec *r) {
    +    apr_array_header_t *pairs = NULL;
    +    apr_off_t len;
    +    apr_size_t size;
    +    int res;
    +    int i = 0;
    +    char *buffer;
    +    keyValuePair *kvp;
    +
    +    res = ap_parse_form_data(r, NULL, &pairs, -1, HUGE_STRING_LEN);
    +    if (res != OK || !pairs) return NULL; /* Return NULL if we failed or if there are is no POST data */
    +    kvp = apr_pcalloc(r->pool, sizeof(keyValuePair) * (pairs->nelts + 1));
    +    while (pairs && !apr_is_empty_array(pairs)) {
    +        ap_form_pair_t *pair = (ap_form_pair_t *) apr_array_pop(pairs);
    +        apr_brigade_length(pair->value, 1, &len);
    +        size = (apr_size_t) len;
    +        buffer = apr_palloc(r->pool, size + 1);
    +        apr_brigade_flatten(pair->value, buffer, &size);
    +        buffer[len] = 0;
    +        kvp[i].key = apr_pstrdup(r->pool, pair->name);
    +        kvp[i].value = buffer;
    +        i++;
    +    }
    +    return kvp;
    +}
    +
    +static int example_handler(request_rec *r)
    +{
    +    /*~~~~~~~~~~~~~~~~~~~~~~*/
    +    keyValuePair *formData;
    +    /*~~~~~~~~~~~~~~~~~~~~~~*/
    +
    +    formData = readPost(r);
    +    if (formData) {
    +        int i;
    +        for (i = 0; &formData[i]; i++) {
    +            if (formData[i].key && formData[i].value) {
    +                ap_rprintf(r, "%s = %s\n", formData[i].key, formData[i].value);
    +            } else if (formData[i].key) {
    +                ap_rprintf(r, "%s\n", formData[i].key);
    +            } else if (formData[i].value) {
    +                ap_rprintf(r, "= %s\n", formData[i].value);
    +            } else {
    +                break;
    +            }
    +        }
    +    }
    +    return OK;
    +}
    + + + + + + +

    Printing out every HTTP header received

    + + + +
    static int example_handler(request_rec *r)
    +{
    +    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +    const apr_array_header_t    *fields;
    +    int                         i;
    +    apr_table_entry_t           *e = 0;
    +    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +
    +    fields = apr_table_elts(r->headers_in);
    +    e = (apr_table_entry_t *) fields->elts;
    +    for(i = 0; i < fields->nelts; i++) {
    +        ap_rprintf(r, "%s: %s\n", e[i].key, e[i].val);
    +    }
    +    return OK;
    +}
    + + + + + + +

    Reading the request body into memory

    + + + +
    static int util_read(request_rec *r, const char **rbuf, apr_off_t *size)
    +{
    +    /*~~~~~~~~*/
    +    int rc = OK;
    +    /*~~~~~~~~*/
    +
    +    if((rc = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR))) {
    +        return(rc);
    +    }
    +
    +    if(ap_should_client_block(r)) {
    +
    +        /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +        char         argsbuffer[HUGE_STRING_LEN];
    +        apr_off_t    rsize, len_read, rpos = 0;
    +        apr_off_t length = r->remaining;
    +        /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    +
    +        *rbuf = (const char *) apr_pcalloc(r->pool, (apr_size_t) (length + 1));
    +        *size = length;
    +        while((len_read = ap_get_client_block(r, argsbuffer, sizeof(argsbuffer))) > 0) {
    +            if((rpos + len_read) > length) {
    +                rsize = length - rpos;
    +            }
    +            else {
    +                rsize = len_read;
    +            }
    +
    +            memcpy((char *) *rbuf + rpos, argsbuffer, (size_t) rsize);
    +            rpos += rsize;
    +        }
    +    }
    +    return(rc);
    +}
    +
    +static int example_handler(request_rec *r) 
    +{
    +    /*~~~~~~~~~~~~~~~~*/
    +    apr_off_t   size;
    +    const char  *buffer;
    +    /*~~~~~~~~~~~~~~~~*/
    +
    +    if(util_read(r, &buffer, &size) == OK) {
    +        ap_rprintf(r, "We read a request body that was %" APR_OFF_T_FMT " bytes long", size);
    +    }
    +    return OK;
    +}
    + + + + + + + +
    +
    +

    Available Languages:  en 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/developer/modules.html b/docs/manual/developer/modules.html new file mode 100644 index 0000000..ebc705b --- /dev/null +++ b/docs/manual/developer/modules.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: modules.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: modules.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/developer/modules.html.en b/docs/manual/developer/modules.html.en new file mode 100644 index 0000000..94cdf65 --- /dev/null +++ b/docs/manual/developer/modules.html.en @@ -0,0 +1,306 @@ + + + + + +Converting Modules from Apache 1.3 to Apache 2.0 - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Converting Modules from Apache 1.3 to Apache 2.0

    +
    +

    Available Languages:  en  | + ja 

    +
    + +

    This is a first attempt at writing the lessons I learned + when trying to convert the mod_mmap_static module to Apache + 2.0. It's by no means definitive and probably won't even be + correct in some ways, but it's a start.

    +
    + +
    top
    +
    +

    The easier changes ...

    + +

    Cleanup Routines

    +

    These now need to be of type apr_status_t and return a + value of that type. Normally the return value will be + APR_SUCCESS unless there is some need to signal an error in + the cleanup. Be aware that even though you signal an error not all code + yet checks and acts upon the error.

    + + +

    Initialisation Routines

    +

    These should now be renamed to better signify where they sit + in the overall process. So the name gets a small change from + mmap_init to mmap_post_config. The arguments + passed have undergone a radical change and now look like

    + +
      +
    • apr_pool_t *p
    • +
    • apr_pool_t *plog
    • +
    • apr_pool_t *ptemp
    • +
    • server_rec *s
    • +
    + + +

    Data Types

    +

    A lot of the data types have been moved into the APR. This means that some have had + a name change, such as the one shown above. The following is a brief + list of some of the changes that you are likely to have to make.

    + +
      +
    • pool becomes apr_pool_t
    • +
    • table becomes apr_table_t
    • +
    + +
    top
    +
    +

    The messier changes...

    + +

    Register Hooks

    +

    The new architecture uses a series of hooks to provide for + calling your functions. These you'll need to add to your module + by way of a new function, static void register_hooks(void). + The function is really reasonably straightforward once you + understand what needs to be done. Each function that needs + calling at some stage in the processing of a request needs to + be registered, handlers do not. There are a number of phases + where functions can be added, and for each you can specify with + a high degree of control the relative order that the function + will be called in.

    + +

    This is the code that was added to mod_mmap_static:

    +
    static void register_hooks(void)
    +{
    +    static const char * const aszPre[]={ "http_core.c",NULL };
    +    ap_hook_post_config(mmap_post_config,NULL,NULL,HOOK_MIDDLE);
    +    ap_hook_translate_name(mmap_static_xlat,aszPre,NULL,HOOK_LAST);
    +};
    + +

    This registers 2 functions that need to be called, one in + the post_config stage (virtually every module will need this + one) and one for the translate_name phase. note that while + there are different function names the format of each is + identical. So what is the format?

    + +

    + ap_hook_phase_name(function_name, + predecessors, successors, position); +

    + +

    There are 3 hook positions defined...

    + +
      +
    • HOOK_FIRST
    • +
    • HOOK_MIDDLE
    • +
    • HOOK_LAST
    • +
    + +

    To define the position you use the position and then modify + it with the predecessors and successors. Each of the modifiers + can be a list of functions that should be called, either before + the function is run (predecessors) or after the function has + run (successors).

    + +

    In the mod_mmap_static case I didn't care about the + post_config stage, but the mmap_static_xlat + must be called after the core module had done its name + translation, hence the use of the aszPre to define a modifier to the + position HOOK_LAST.

    + + +

    Module Definition

    +

    There are now a lot fewer stages to worry about when + creating your module definition. The old definition looked + like

    + +
    module MODULE_VAR_EXPORT module_name_module =
    +{
    +    STANDARD_MODULE_STUFF,
    +    /* initializer */
    +    /* dir config creater */
    +    /* dir merger --- default is to override */
    +    /* server config */
    +    /* merge server config */
    +    /* command handlers */
    +    /* handlers */
    +    /* filename translation */
    +    /* check_user_id */
    +    /* check auth */
    +    /* check access */
    +    /* type_checker */
    +    /* fixups */
    +    /* logger */
    +    /* header parser */
    +    /* child_init */
    +    /* child_exit */
    +    /* post read-request */
    +};
    + +

    The new structure is a great deal simpler...

    +
    module MODULE_VAR_EXPORT module_name_module =
    +{
    +    STANDARD20_MODULE_STUFF,
    +    /* create per-directory config structures */
    +    /* merge per-directory config structures  */
    +    /* create per-server config structures    */
    +    /* merge per-server config structures     */
    +    /* command handlers */
    +    /* handlers */
    +    /* register hooks */
    +};
    + +

    Some of these read directly across, some don't. I'll try to + summarise what should be done below.

    + +

    The stages that read directly across :

    + +
    +
    /* dir config creater */
    +
    /* create per-directory config structures */
    + +
    /* server config */
    +
    /* create per-server config structures */
    + +
    /* dir merger */
    +
    /* merge per-directory config structures */
    + +
    /* merge server config */
    +
    /* merge per-server config structures */
    + +
    /* command table */
    +
    /* command apr_table_t */
    + +
    /* handlers */
    +
    /* handlers */
    +
    + +

    The remainder of the old functions should be registered as + hooks. There are the following hook stages defined so + far...

    + +
    +
    ap_hook_pre_config
    +
    do any setup required prior to processing configuration + directives
    + +
    ap_hook_check_config
    +
    review configuration directive interdependencies
    + +
    ap_hook_test_config
    +
    executes only with -t option
    + +
    ap_hook_open_logs
    +
    open any specified logs
    + +
    ap_hook_post_config
    +
    this is where the old _init routines get + registered
    + +
    ap_hook_http_method
    +
    retrieve the http method from a request. (legacy)
    + +
    ap_hook_auth_checker
    +
    check if the resource requires authorization
    + +
    ap_hook_access_checker
    +
    check for module-specific restrictions
    + +
    ap_hook_check_user_id
    +
    check the user-id and password
    + +
    ap_hook_default_port
    +
    retrieve the default port for the server
    + +
    ap_hook_pre_connection
    +
    do any setup required just before processing, but after + accepting
    + +
    ap_hook_process_connection
    +
    run the correct protocol
    + +
    ap_hook_child_init
    +
    call as soon as the child is started
    + +
    ap_hook_create_request
    +
    ??
    + +
    ap_hook_fixups
    +
    last chance to modify things before generating content
    + +
    ap_hook_handler
    +
    generate the content
    + +
    ap_hook_header_parser
    +
    lets modules look at the headers, not used by most modules, because + they use post_read_request for this
    + +
    ap_hook_insert_filter
    +
    to insert filters into the filter chain
    + +
    ap_hook_log_transaction
    +
    log information about the request
    + +
    ap_hook_optional_fn_retrieve
    +
    retrieve any functions registered as optional
    + +
    ap_hook_post_read_request
    +
    called after reading the request, before any other phase
    + +
    ap_hook_quick_handler
    +
    called before any request processing, used by cache modules.
    + +
    ap_hook_translate_name
    +
    translate the URI into a filename
    + +
    ap_hook_type_checker
    +
    determine and/or set the doc type
    +
    + +
    +
    +

    Available Languages:  en  | + ja 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/developer/modules.html.ja.utf8 b/docs/manual/developer/modules.html.ja.utf8 new file mode 100644 index 0000000..d9bd11c --- /dev/null +++ b/docs/manual/developer/modules.html.ja.utf8 @@ -0,0 +1,301 @@ + + + + + +モジュール㮠Apache 1.3 ã‹ã‚‰ Apache 2.0 ã¸ã®ç§»æ¤ - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    モジュール㮠Apache 1.3 ã‹ã‚‰ Apache 2.0 ã¸ã®ç§»æ¤

    +
    +

    翻訳済ã¿è¨€èªž:  en  | + ja 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + +

    ã“ã®æ–‡æ›¸ã¯ mod_mmap_static モジュールを Apache 2.0 用ã«ç§»æ¤ã—ãŸæ™‚ã« + 学んã çµŒé¨“ã‚’ã‚‚ã¨ã«æ›¸ã„ãŸã€æœ€åˆã®æ‰‹å¼•ãæ›¸ã§ã™ã€‚ã¾ã ã¾ã å®Œå…¨ã˜ã‚ƒãªã„ã—〠+ ã²ã‚‡ã£ã¨ã™ã‚‹ã¨é–“é•ã£ã¦ã„る部分もã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“ãŒã€ + å–ã£æŽ›ã‚Šã«ã¯ãªã‚‹ã§ã—ょã†ã€‚

    +
    + +
    top
    +
    +

    ç°¡å˜ãªå¤‰æ›´ç‚¹

    + +

    クリーンナップ ルーãƒãƒ³

    +

    クリーンナップルーãƒãƒ³ã¯ apr_status_t åž‹ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + ãã—ã¦ã€apr_status_t åž‹ã®å€¤ã‚’è¿”ã•ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“。 + クリーンナップ中ã®ã‚¨ãƒ©ãƒ¼ã‚’通知ã™ã‚‹å¿…è¦ãŒãªã‘れã°ã€è¿”ã‚Šå€¤ã¯æ™®é€šã€ + ARP_SUCCESS ã§ã™ã€‚ãŸã¨ãˆã‚¨ãƒ©ãƒ¼ã‚’通知ã—ãŸã¨ã—ã¦ã‚‚〠+ ã™ã¹ã¦ã®ã‚³ãƒ¼ãƒ‰ãŒãã®é€šçŸ¥ã‚’ãƒã‚§ãƒƒã‚¯ã—ãŸã‚Šã€ + エラーã«å¿œã˜ãŸå‹•作をã™ã‚‹ã‚ã‘ã§ã¯ãªã„ã“ã¨ã«æ°—ã‚’ã¤ã‘ã¦ãã ã•ã„。

    + + + +

    åˆæœŸåŒ–ルーãƒãƒ³

    + +

    åˆæœŸåŒ–ルーãƒãƒ³ã¯å‡¦ç†å…¨ä½“ã‹ã‚‰è¦‹ã¦ã—ã£ãりãるよã†ãªæ„味を表ã™ã‚ˆã†ã«ã€ + åå‰ãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚ã§ã™ã‹ã‚‰ã€mmap_init ã‹ã‚‰ mmap_post_config + ã®ã‚ˆã†ã«ã¡ã‚‡ã£ã¨å¤‰æ›´ã•れã¾ã—ãŸã€‚ + 渡ã•れる引数ã¯å¤§å¹…ã«å¤‰æ›´ã•ã‚Œã€æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚

    + +
      +
    • apr_pool_t *p
    • +
    • apr_pool_t *plog
    • +
    • apr_pool_t *ptemp
    • +
    • server_rec *s
    • +
    + + +

    データ型

    +

    データ型ã®ã»ã¨ã‚“ã©ã¯ APR ã«ç§»ã•れã¾ã—ãŸã€‚ã¤ã¾ã‚Šã€ + ã„ãã¤ã‹ã®åå‰ãŒå‰è¿°ã®ã‚ˆã†ã«å¤‰æ›´ã•れã¦ã„ã¾ã™ã€‚ + æ–½ã™ã¹ã変更点ã®ç°¡å˜ãªä¸€è¦§ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚

    + +
      +
    • pool becomes apr_pool_t
    • +
    • table becomes apr_table_t
    • +
    + +
    top
    +
    +

    ã‚‚ã£ã¨åބ介ãªå¤‰æ›´ç‚¹â€¦

    + +

    フックã®ç™»éŒ²

    +

    æ–°ã—ã„アーキテクãƒãƒ£ã§ã¯ä½œæˆã—ãŸé–¢æ•°ã‚’呼ã³å‡ºã™ã®ã« + 一連ã®ãƒ•ックを使用ã—ã¾ã™ã€‚ã“ã®ãƒ•ックã¯ã€æ–°ã—ã„関数 + static void register_hooks(void) を使ã£ã¦ç™»éŒ²ã™ã‚‹ã‚ˆã†ã€ + ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã«æ›¸ãè¶³ã•ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“。 + ã“ã®é–¢æ•°ã¯ã€ãªã«ã‚’ã™ã¹ãã‹ä¸€æ—¦ç†è§£ã—ã¦ã—ã¾ãˆã°ã€ + å分ã«ã‚ã‹ã‚Šã‚„ã™ã„ã‚‚ã®ã§ã™ã€‚ + リクエストã®å‡¦ç†ã®ã‚るステージã§å‘¼ã³å‡ºã•ãªãã¦ã¯ãªã‚‰ãªã„ + 関数ã¯ç™»éŒ²ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ãƒãƒ³ãƒ‰ãƒ©ã¯ç™»éŒ²ã™ã‚‹å¿…è¦ã¯ã‚りã¾ã›ã‚“。 + 関数を登録ã§ãるフェーズã¯ãŸãã•ã‚“ã‚りã¾ã™ã€‚ + ãれãžã‚Œã®ãƒ•ェーズã§ã€é–¢æ•°ã‚’呼ã³å‡ºã™ç›¸å¯¾çš„ãªé †ç•ªã¯ã€ + ã‹ãªã‚Šã®ç¨‹åº¦åˆ¶å¾¡ã§ãã¾ã™ã€‚

    + +

    以下ã¯ã€mod_mmap_static ã«è¿½åŠ ã—ãŸã‚³ãƒ¼ãƒ‰ã§ã™:

    + +
    static void register_hooks(void)
    +{
    +    static const char * const aszPre[]={ "http_core.c",NULL };
    +    ap_hook_post_config(mmap_post_config,NULL,NULL,HOOK_MIDDLE);
    +    ap_hook_translate_name(mmap_static_xlat,aszPre,NULL,HOOK_LAST);
    +};
    + +

    ã“ã“ã§ã¯å‘¼ã³ã ã™ã¹ã二ã¤ã®é–¢æ•°ã‚’登録ã—ã¦ã„ã¾ã™ã€‚一ã¤ã¯ + post_config ステージ用 (ã»ã¨ã‚“ã©ã™ã¹ã¦ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ« + ã¯ã“れãŒå¿…è¦ã§ã™) ã§ã€ã‚‚ã†ä¸€ã¤ã¯ translate_name フェーズ用ã§ã™ã€‚ + ãれãžã‚Œã®é–¢æ•°ã¯åå‰ã¯é•ã†ã‘れã©ã‚‚å½¢å¼ã¯åŒã˜ã§ã‚ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。 + ãれã§ã¯ã€å½¢å¼ã¯ã©ã®ã‚ˆã†ã«ãªã£ã¦ã„ã‚‹ã§ã—ょã†ã‹?

    + +

    + ap_hook_phase_name(function_name, + predecessors, successors, position); +

    + +

    三ã¤ã®ä½ç½®ãŒå®šç¾©ã•れã¦ã„ã¾ã™â€¦

    + +
      +
    • HOOK_FIRST
    • +
    • HOOK_MIDDLE
    • +
    • HOOK_LAST
    • +
    + +

    ä½ç½®ã‚’定義ã™ã‚‹ã«ã¯ã€ä¸Šè¨˜ã®ã€Œä½ç½®ã€ã‚’指定ã—〠+ 修飾å­ã§ã‚る「先行ã€ã¨ã€Œå¾Œè¡Œã€ã§æ‰‹ã‚’加ãˆã¾ã™ã€‚ + 「先行ã€ã€Œå¾Œè¡Œã€ã¯ã€å‘¼ã°ã‚Œã‚‹ã¹ã関数ã®ãƒªã‚¹ãƒˆã§ã™ã€‚ + 「先行ã€ã¯é–¢æ•°ã®å®Ÿè¡Œå‰ã«å‘¼ã°ã‚Œã‚‹ã‚‚ã®ã§ã€ + 「後行ã€ã¯å®Ÿè¡Œå¾Œã«å‘¼ã°ã‚Œã‚‹ã‚‚ã®ã§ã™ã€‚

    + +

    mod_mmap_static ã®å ´åˆã€post_config + ステージã§ã¯å¿…è¦ã‚りã¾ã›ã‚“ãŒã€ + mmap_static_xlat ㌠core モジュールãŒåå‰ã®å¤‰æ›ã‚’実行ã—ãŸå¾Œã« + 呼ã°ã‚Œãªã‘れã°ãªã‚Šã¾ã›ã‚“。 + ãã“ã§ aszPre を使ã£ã¦ HOOK_LAST ã®ä¿®é£¾å­ã‚’定義ã—ã¦ã„ã¾ã™ã€‚

    + + +

    モジュールã®å®šç¾©

    +

    モジュールã®å®šç¾©ã‚’作æˆã™ã‚‹éš›ã«æ³¨æ„ã—ãªã‘れã°ãªã‚‰ãªã„ + ã‚¹ãƒ†ãƒ¼ã‚¸ã®æ•°ã¯æ¿€æ¸›ã—ã¦ã„ã¾ã™ã€‚å¤ã„å®šç¾©ã¯æ¬¡ã®ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã—ãŸã€‚

    + +
    module MODULE_VAR_EXPORT module_name_module =
    +{
    +    STANDARD_MODULE_STUFF,
    +    /* initializer */
    +    /* dir config creater */
    +    /* dir merger --- default is to override */
    +    /* server config */
    +    /* merge server config */
    +    /* command handlers */
    +    /* handlers */
    +    /* filename translation */
    +    /* check_user_id */
    +    /* check auth */
    +    /* check access */
    +    /* type_checker */
    +    /* fixups */
    +    /* logger */
    +    /* header parser */
    +    /* child_init */
    +    /* child_exit */
    +    /* post read-request */
    +};
    + +

    æ–°ã—ã„æ§‹é€ ä½“ã¯ã¨ã£ã¦ã‚‚シンプルã§ã™â€¦

    +
    module MODULE_VAR_EXPORT module_name_module =
    +{
    +    STANDARD20_MODULE_STUFF,
    +    /* create per-directory config structures */
    +    /* merge per-directory config structures  */
    +    /* create per-server config structures    */
    +    /* merge per-server config structures     */
    +    /* command handlers */
    +    /* handlers */
    +    /* register hooks */
    +};
    + +

    ã“ã®ã†ã¡ã®ã„ãã¤ã‹ã¯å¤ã„ã‚‚ã®ã‹ã‚‰æ–°ã—ã„ã‚‚ã®ã«ç›´æŽ¥èª­ã¿æ›¿ãˆã‚‰ã‚Œã‚‹ã‚‚ã®ã§ã€ + ã„ãã¤ã‹ã¯ãã†ã§ã¯ã‚りã¾ã›ã‚“。ã©ã†ã™ã‚Œã°ã„ã„ã®ã‹ã‚’è¦ç´„ã—ã¦ã¿ã¾ã™ã€‚

    + +

    ç›´æŽ¥èª­ã¿æ›¿ãˆã‚‰ã‚Œã‚‹ã‚¹ãƒ†ãƒ¼ã‚¸:

    + +
    +
    /* ディレクトリ設定作æˆé–¢æ•° */
    +
    /* ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ¯Žè¨­å®šæ§‹é€ ä½“ä½œæˆ */
    + +
    /* サーãƒè¨­å®šä½œæˆé–¢æ•° */
    +
    /* ã‚µãƒ¼ãƒæ¯Žè¨­å®šæ§‹é€ ä½“ä½œæˆ */
    + +
    /* ディレクトリ設定マージ関数 */
    +
    /* ディレクトリ毎設定構造体マージ */
    + +
    /* サーãƒè¨­å®šãƒžãƒ¼ã‚¸é–¢æ•° */
    +
    /* ã‚µãƒ¼ãƒæ¯Žè¨­å®šæ§‹é€ ä½“作æˆãƒžãƒ¼ã‚¸ */
    + +
    /* コマンド・テーブル */
    +
    /* コマンド apr_table_t */
    + +
    /* ãƒãƒ³ãƒ‰ãƒ© */
    +
    /* ãƒãƒ³ãƒ‰ãƒ© */
    +
    + +

    å¤ã„é–¢æ•°ã®æ®‹ã‚Šã®ã‚‚ã®ã¯ãƒ•ックã¨ã—ã¦ç™»éŒ²ã•れるã¹ãã§ã™ã€‚ + ç¾æ™‚ç‚¹ã§æ¬¡ã®ã‚ˆã†ãªãƒ•ック・ステージãŒå®šç¾©ã•れã¦ã„ã¾ã™â€¦

    + +
    +
    ap_hook_post_config
    +
    (以å‰ã® _init ルーãƒãƒ³ãŒç™»éŒ²ã•れるã¹ã場所ã§ã™)
    + +
    ap_hook_http_method
    +
    (リクエストã‹ã‚‰ HTTP メソッドをå–å¾—ã—ã¾ã™ (互æ›ç”¨))
    + +
    ap_hook_open_logs
    +
    (特定ã®ãƒ­ã‚°ã®ã‚ªãƒ¼ãƒ—ン)
    + +
    ap_hook_auth_checker
    +
    (ãƒªã‚½ãƒ¼ã‚¹ãŒæ¨©é™ã‚’å¿…è¦ã¨ã™ã‚‹ã‹ã©ã†ã‹ã®ç¢ºèª)
    + +
    ap_hook_access_checker
    +
    (モジュール固有ã®åˆ¶ç´„ã®ç¢ºèª)
    + +
    ap_hook_check_user_id
    +
    (ユーザ ID ã¨ãƒ‘スワードã®ç¢ºèª)
    + +
    ap_hook_default_port
    +
    (サーãƒã®ãƒ‡ãƒ•ォルト・ãƒãƒ¼ãƒˆã®å–å¾—)
    + +
    ap_hook_pre_connection
    +
    (処ç†ã®ç›´å‰ã«å¿…è¦ãªã“ã¨ã‚’実行。ãŸã ã— accept 直後ã«å‘¼ã°ã‚Œã‚‹)
    + +
    ap_hook_process_connection
    +
    (プロトコルã®å‡¦ç†)
    + +
    ap_hook_child_init
    +
    (å­ãƒ—ロセル起動直後)
    + +
    ap_hook_create_request
    +
    (??)
    + +
    ap_hook_fixups
    +
    (応答内容ã®ç”Ÿæˆã‚’変更ã™ã‚‹ãƒ©ã‚¹ãƒˆãƒ»ãƒãƒ£ãƒ³ã‚¹)
    + +
    ap_hook_handler
    +
    (応答内容ã®ç”Ÿæˆ)
    + +
    ap_hook_header_parser
    +
    (モジュールã«ãƒ˜ãƒƒãƒ€ã®ç…§ä¼šã‚’ã•ã›ã‚‹ã€‚ã»ã¨ã‚“ã©ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã§ã¯ä½¿ã‚れã¾ã›ã‚“。post_read_request を使ã„ã¾ã™)
    + +
    ap_hook_insert_filter
    +
    (フィルタ・ãƒã‚§ã‚¤ãƒ³ã«ãƒ•ィルタを挿入)
    + +
    ap_hook_log_transaction
    +
    (リクエストã«ã¤ã„ã¦ã®æƒ…報を記録ã™ã‚‹)
    + +
    ap_hook_optional_fn_retrieve
    +
    (オプションã¨ã—ã¦ç™»éŒ²ã•れãŸé–¢æ•°ã®å–å¾—)
    + +
    ap_hook_post_read_request
    +
    (リクエストを読ã¿ã“ã‚“ã å¾Œã€ä»–ã®ãƒ•ェーズã®å‰ã«å‘¼ã°ã‚Œã‚‹)
    + +
    ap_hook_quick_handler
    +
    リクエストã®å‡¦ç†ãŒå§‹ã¾ã‚‹å‰ã«å‘¼ã°ã‚Œã‚‹ã€‚キャッシュモジュール㌠+ 使用ã—ã¦ã„ã‚‹
    + +
    ap_hook_translate_name
    +
    (URI をファイルåã«å¤‰æ›ã™ã‚‹)
    + +
    ap_hook_type_checker
    +
    (æ–‡æ›¸åž‹ã®æ±ºå®šã¨è¨­å®šã€‚ã‚ã‚‹ã„ã¯ãã®ç‰‡æ–¹)
    +
    + +
    +
    +

    翻訳済ã¿è¨€èªž:  en  | + ja 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/developer/new_api_2_4.html b/docs/manual/developer/new_api_2_4.html new file mode 100644 index 0000000..e79fd3c --- /dev/null +++ b/docs/manual/developer/new_api_2_4.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: new_api_2_4.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/developer/new_api_2_4.html.en b/docs/manual/developer/new_api_2_4.html.en new file mode 100644 index 0000000..ae5f644 --- /dev/null +++ b/docs/manual/developer/new_api_2_4.html.en @@ -0,0 +1,601 @@ + + + + + +API Changes in Apache HTTP Server 2.4 since 2.2 - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    API Changes in Apache HTTP Server 2.4 since 2.2

    +
    +

    Available Languages:  en 

    +
    + +

    This document describes changes to the Apache HTTPD API from + version 2.2 to 2.4, that may be of interest to module/application + developers and core hacks. As of the first GA release of the + 2.4 branch API compatibility is preserved for the life of the + 2.4 branch. (The + VERSIONING + description for the 2.4 release provides more information about API + compatibility.)

    + +

    API changes fall into two categories: APIs that are altogether new, + and existing APIs that are expanded or changed. The latter are + further divided into those where all changes are backwards-compatible + (so existing modules can ignore them), and those that might + require attention by maintainers. As with the transition from + HTTPD 2.0 to 2.2, existing modules and applications will require + recompiling and may call for some attention, but most should not + require any substantial updating (although some may be able to + take advantage of API changes to offer significant improvements).

    +

    For the purpose of this document, the API is split according + to the public header files. These headers are themselves the + reference documentation, and can be used to generate a browsable + HTML reference with make docs.

    +
    + +
    top
    +
    +

    Changed APIs

    + + +

    ap_expr (NEW!)

    + +

    Introduces a new API to parse and evaluate boolean and algebraic + expressions, including provision for a standard syntax and + customised variants.

    + + +

    ap_listen (changed; backwards-compatible)

    + +

    Introduces a new API to enable httpd child processes to serve + different purposes.

    + + +

    ap_mpm (changed)

    + +

    ap_mpm_run is replaced by a new mpm hook. + Also ap_graceful_stop_signalled is lost, and + ap_mpm_register_timed_callback is new.

    + + +

    ap_regex (changed)

    + +

    In addition to the existing regexp wrapper, a new higher-level API + ap_rxplus is now provided. This provides the capability to + compile Perl-style expressions like s/regexp/replacement/flags + and to execute them against arbitrary strings. Support for regexp + backreferences is also added.

    + + +

    ap_slotmem (NEW!)

    + +

    Introduces an API for modules to allocate and manage memory slots, + most commonly for shared memory.

    + + +

    ap_socache (NEW!)

    + +

    API to manage a shared object cache.

    + + +

    heartbeat (NEW!)

    + +

    common structures for heartbeat modules

    + + +

    ap_parse_htaccess (changed)

    + +

    The function signature for ap_parse_htaccess has been + changed. A apr_table_t of individual directives allowed + for override must now be passed (override remains).

    + + +

    http_config (changed)

    + +
      +
    • Introduces per-module, per-directory loglevels, including macro wrappers.
    • +
    • New AP_DECLARE_MODULE macro to declare all modules.
    • +
    • New APLOG_USE_MODULE macro necessary for per-module loglevels in + multi-file modules.
    • +
    • New API to retain data across module unload/load
    • +
    • New check_config hook
    • +
    • New ap_process_fnmatch_configs() function to process wildcards
    • +
    • Change ap_configfile_t, ap_cfg_getline(), + ap_cfg_getc() to return error codes, and add + ap_pcfg_strerror() for retrieving an error description.
    • +
    • Any config directive permitted in ACCESS_CONF context must now + correctly handle being called from an .htaccess file via the new + AllowOverrideList directive. + ap_check_cmd_context() accepts a new flag NOT_IN_HTACCESS to detect + this case.
    • +
    + + +

    http_core (changed)

    + +
      +
    • REMOVED ap_default_type, ap_requires, all + 2.2 authnz API
    • +
    • Introduces Optional Functions for logio and authnz
    • +
    • New function ap_get_server_name_for_url to support IPv6 + literals.
    • +
    • New function ap_register_errorlog_handler to register error log + format string handlers.
    • +
    • Arguments of error_log hook have changed. Declaration has moved to + http_core.h.
    • +
    • New function ap_state_query to determine if the server is in the + initial configuration preflight phase or not. This is both easier to + use and more correct than the old method of creating a pool userdata + entry in the process pool.
    • +
    • New function ap_get_conn_socket to get the socket descriptor for a + connection. This should be used instead of accessing the core + connection config directly.
    • +
    + + +

    httpd (changed)

    + +
      +
    • Introduce per-directory, per-module loglevel
    • +
    • New loglevels APLOG_TRACEn
    • +
    • Introduce errorlog ids for requests and connections
    • +
    • Support for mod_request kept_body
    • +
    • Support buffering filter data for async requests
    • +
    • New CONN_STATE values
    • +
    • Function changes: ap_escape_html updated; + ap_unescape_all, ap_escape_path_segment_buffer
    • +
    • Modules that load other modules later than the EXEC_ON_READ config + reading stage need to call ap_reserve_module_slots() or + ap_reserve_module_slots_directive() in their + pre_config hook.
    • +
    • The useragent IP address per request can now be tracked + independently of the client IP address of the connection, for + support of deployments with load balancers.
    • +
    + + +

    http_log (changed)

    + +
      +
    • Introduce per-directory, per-module loglevel
    • +
    • New loglevels APLOG_TRACEn
    • +
    • ap_log_*error become macro wrappers (backwards-compatible if + APLOG_MARK macro is used, except that is no longer possible to + use #ifdef inside the argument list)
    • +
    • piped logging revamped
    • +
    • module_index added to error_log hook
    • +
    • new function: ap_log_command_line
    • +
    + + +

    http_request (changed)

    + +
      +
    • New auth_internal API and auth_provider API
    • +
    • New EOR bucket type
    • +
    • New function ap_process_async_request
    • +
    • New flags AP_AUTH_INTERNAL_PER_CONF and + AP_AUTH_INTERNAL_PER_URI
    • +
    • New access_checker_ex hook to apply additional access control + and/or bypass authentication.
    • +
    • New functions ap_hook_check_access_ex, + ap_hook_check_access, ap_hook_check_authn, + ap_hook_check_authz which accept + AP_AUTH_INTERNAL_PER_* flags
    • +
    • DEPRECATED direct use of ap_hook_access_checker, + access_checker_ex, ap_hook_check_user_id, + ap_hook_auth_checker
    • +
    +

    When possible, registering all access control hooks (including + authentication and authorization hooks) using AP_AUTH_INTERNAL_PER_CONF + is recommended. If all modules' access control hooks are registered + with this flag, then whenever the server handles an internal + sub-request that matches the same set of access control configuration + directives as the initial request (which is the common case), it can + avoid invoking the access control hooks another time.

    +

    If your module requires the old behavior and must perform access + control checks on every sub-request with a different URI from the + initial request, even if that URI matches the same set of access + control configuration directives, then use + AP_AUTH_INTERNAL_PER_URI.

    + + +

    mod_auth (NEW!)

    + +

    Introduces the new provider framework for authn and authz

    + + +

    mod_cache (changed)

    + +

    Introduces a commit_entity() function to the cache provider + interface, allowing atomic writes to cache. Add a cache_status() + hook to report the cache decision. All private structures and functions were + removed.

    + + +

    mod_core (NEW!)

    + +

    This introduces low-level APIs to send arbitrary headers, + and exposes functions to handle HTTP OPTIONS and TRACE.

    + + +

    mod_cache_disk (changed)

    + +

    Changes the disk format of the disk cache to support atomic cache + updates without locking. The device/inode pair of the body file is + embedded in the header file, allowing confirmation that the header + and body belong to one another.

    + + +

    mod_disk_cache (renamed)

    + +

    The mod_disk_cache module has been renamed to mod_cache_disk in + order to be consistent with the naming of other modules within the + server.

    + + +

    mod_request (NEW!)

    + +

    The API for mod_request, to make input data + available to multiple application/handler modules where required, + and to parse HTML form data.

    + + +

    mpm_common (changed)

    + +
      +
    • REMOVES: accept, lockfile, lock_mech, + set_scoreboard (locking uses the new ap_mutex API)
    • +
    • NEW API to drop privileges (delegates this platform-dependent + function to modules)
    • +
    • NEW Hooks: mpm_query, timed_callback, and + get_name
    • +
    • CHANGED interfaces: monitor hook, + ap_reclaim_child_processes, + ap_relieve_child_processes
    • +
    + + +

    scoreboard (changed)

    + +

    ap_get_scoreboard_worker is made non-backwards-compatible + as an alternative version is introduced. Additional proxy_balancer + support. Child status stuff revamped.

    + + +

    util_cookies (NEW!)

    + +

    Introduces a new API for managing HTTP Cookies.

    + + +

    util_ldap (changed)

    + +

    no description available

    + + +

    util_mutex (NEW!)

    + +

    A wrapper for APR proc and global mutexes in httpd, providing + common configuration for the underlying mechanism and location + of lock files.

    + + +

    util_script (changed)

    + +

    NEW: ap_args_to_table

    + + +

    util_time (changed)

    + +

    NEW: ap_recent_ctime_ex

    + + +
    top
    +
    +

    Specific information on upgrading modules from 2.2

    + + +

    Logging

    + +

    In order to take advantage of per-module loglevel configuration, any + source file that calls the ap_log_* functions should declare + which module it belongs to. If the module's module_struct is called + foo_module, the following code can be used to remain + backward compatible with HTTPD 2.0 and 2.2:

    +

    + #include <http_log.h>
    +
    + #ifdef APLOG_USE_MODULE
    + APLOG_USE_MODULE(foo);
    + #endif +

    +

    Note: This is absolutely required for C++-language modules. It + can be skipped for C-language modules, though that breaks + module-specific log level support for files without it.

    +

    The number of parameters of the ap_log_* functions and the + definition of APLOG_MARK has changed. Normally, the change + is completely transparent. However, changes are required if a + module uses APLOG_MARK as a parameter to its own functions + or if a module calls ap_log_* without passing + APLOG_MARK. A module which uses wrappers + around ap_log_* typically uses both of these constructs.

    + +

    The easiest way to change code which passes APLOG_MARK to + its own functions is to define and use a different macro that expands to + the parameters required by those functions, as APLOG_MARK + should only be used when calling ap_log_* + directly. In this way, the code will remain compatible with HTTPD 2.0 + and 2.2.

    + +

    Code which calls ap_log_* without passing + APLOG_MARK will necessarily differ between 2.4 and earlier + releases, as 2.4 requires a new third argument, + APLOG_MODULE_INDEX.

    + +

    + /* code for httpd 2.0/2.2 */
    + ap_log_perror(file, line, APLOG_ERR, 0, p, "Failed to allocate dynamic lock structure");
    +
    + /* code for httpd 2.4 */
    + ap_log_perror(file, line, APLOG_MODULE_INDEX, APLOG_ERR, 0, p, "Failed to allocate dynamic lock structure");
    +
    +

    + +

    ap_log_*error are now implemented as macros. This means + that it is no longer possible to use #ifdef inside the + argument list of ap_log_*error, as this would cause + undefined behavior according to C99.

    + +

    A server_rec pointer must be passed to + ap_log_error() when called after startup. This + was always appropriate, but there are even more limitations with + a NULL server_rec in 2.4 than in + previous releases. Beginning with 2.3.12, the global variable + ap_server_conf can always be used as + the server_rec parameter, as it will be + NULL only when it is valid to pass NULL + to ap_log_error(). ap_server_conf + should be used only when a more appropriate server_rec + is not available.

    + +

    Consider the following changes to take advantage of the new + APLOG_TRACE1..8 log levels:

    +
      +
    • Check current use of APLOG_DEBUG and + consider if one of the APLOG_TRACEn levels is + more appropriate.
    • +
    • If your module currently has a mechanism for configuring + the amount of debug logging which is performed, consider + eliminating that mechanism and relying on the use of + different APLOG_TRACEn levels. If expensive + trace processing needs to be bypassed depending on the + configured log level, use the APLOGtracen + and APLOGrtracen macros to first check + if tracing is enabled.
    • +
    + +

    Modules sometimes add process id and/or thread id to their log + messages. These ids are now logged by default, so it may not + be necessary for the module to log them explicitly. (Users may + remove them from the error log format, but they can be + instructed to add it back if necessary for problem diagnosis.)

    + + +

    If your module uses these existing APIs...

    + + +
    +
    ap_default_type()
    +
    This is no longer available; Content-Type must be configured + explicitly or added by the application.
    + +
    ap_get_server_name()
    +
    If the returned server name is used in a URL, + use ap_get_server_name_for_url() instead. This new + function handles the odd case where the server name is an IPv6 + literal address.
    + +
    ap_get_server_version()
    +
    For logging purposes, where detailed information is + appropriate, use ap_get_server_description(). + When generating output, where the amount of information + should be configurable by ServerTokens, use + ap_get_server_banner().
    + +
    ap_graceful_stop_signalled()
    +
    Replace with a call + to ap_mpm_query(AP_MPMQ_MPM_STATE) and checking for + state AP_MPMQ_STOPPING.
    + +
    ap_max_daemons_limit, ap_my_generation, + and ap_threads_per_child
    +
    Use ap_mpm_query() query codes + AP_MPMQ_MAX_DAEMON_USED, AP_MPMQ_GENERATION, + and AP_MPMQ_MAX_THREADS, respectively.
    + +
    ap_mpm_query()
    +
    Ensure that it is not used until after the register-hooks + hook has completed. Otherwise, an MPM built as a DSO + would not have had a chance to enable support for this + function.
    + +
    ap_requires()
    +
    The core server now provides better infrastructure for handling + Require configuration. + Register an auth provider function for each supported entity using + ap_register_auth_provider(). The function will be + called as necessary during Require + processing. (Consult bundled modules for detailed examples.)
    + +
    ap_server_conf->process->pool + userdata
    +
    + Optional: +
      +
    • If your module uses this to determine which pass of the + startup hooks is being run, + use ap_state_query(AP_SQ_MAIN_STATE).
    • +
    • If your module uses this to maintain data across the + unloading and reloading of your module, use + ap_retained_data_create() and + ap_retained_data_get().
    • +
    +
    + +
    apr_global_mutex_create(), + apr_proc_mutex_create()
    +
    Optional: See ap_mutex_register(), + ap_global_mutex_create(), and + ap_proc_mutex_create(); these allow your + mutexes to be configurable with + the Mutex directive; + you can also remove any configuration mechanisms in your + module for such mutexes +
    + +
    CORE_PRIVATE
    +
    This is now unnecessary and ignored.
    + +
    dav_new_error() + and dav_new_error_tag()
    +
    Previously, these assumed that errno contained + information describing the failure. Now, + an apr_status_t parameter must be provided. Pass + 0/APR_SUCCESS if there is no such error information, or a valid + apr_status_t value otherwise.
    + +
    mpm_default.h, DEFAULT_LOCKFILE, + DEFAULT_THREAD_LIMIT, DEFAULT_PIDLOG, + etc.
    +
    The header file and most of the default configuration + values set in it are no longer visible to modules. (Most can + still be overridden at build time.) DEFAULT_PIDLOG + and DEFAULT_REL_RUNTIMEDIR are now universally + available via ap_config.h.
    + +
    unixd_config
    +
    This has been renamed to ap_unixd_config.
    + +
    unixd_setup_child()
    +
    This has been renamed to ap_unixd_setup_child(), but most callers + should call the added ap_run_drop_privileges() hook.
    + +
    conn_rec->remote_ip and + conn_rec->remote_addr
    +
    These fields have been renamed in order to distinguish between + the client IP address of the connection and the useragent IP address + of the request (potentially overridden by a load balancer or proxy). + References to either of these fields must be updated with one of the + following options, as appropriate for the module: +
      +
    • When you require the IP address of the user agent, which + might be connected directly to the server, or might optionally be + separated from the server by a transparent load balancer or + proxy, use request_rec->useragent_ip and + request_rec->useragent_addr.
    • +
    • When you require the IP address of the client that is + connected directly to the server, which might be the useragent or + might be the load balancer or proxy itself, use + conn_rec->client_ip and + conn_rec->client_addr.
    • +
    +
    +
    + + +

    If your module interfaces with this feature...

    + +
    +
    suEXEC
    +
    Optional: If your module logs an error + when ap_unixd_config.suexec_enabled is 0, + also log the value of the new + field suexec_disabled_reason, which contains an + explanation of why it is not available.
    + +
    Extended status data in the scoreboard
    +
    In previous releases, ExtendedStatus had to be + set to On, which in turn required that + mod_status was loaded. In 2.4, just + set ap_extended_status to 1 in a + pre-config hook and the extended status data will be + available.
    +
    + + +

    Does your module...

    + +
    +
    Parse query args
    +
    Consider if ap_args_to_table() would be + helpful.
    + +
    Parse form data...
    +
    Use ap_parse_form_data().
    + +
    Check for request header fields Content-Length + and Transfer-Encoding to see if a body was + specified
    +
    Use ap_request_has_body().
    + +
    Implement cleanups which clear pointer variables
    +
    Use ap_pool_cleanup_set_null().
    + +
    Create run-time files such as shared memory files, pid files, + etc.
    +
    Use ap_runtime_dir_relative() so that the global + configuration for the location of such files, either by the + DEFAULT_REL_RUNTIMEDIR compile setting or the + DefaultRuntimeDir directive, + will be respected. Apache httpd 2.4.2 and above.
    + +
    + + +
    +
    +

    Available Languages:  en 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/developer/output-filters.html b/docs/manual/developer/output-filters.html new file mode 100644 index 0000000..ee632a6 --- /dev/null +++ b/docs/manual/developer/output-filters.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: output-filters.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/developer/output-filters.html.en b/docs/manual/developer/output-filters.html.en new file mode 100644 index 0000000..b6f6caa --- /dev/null +++ b/docs/manual/developer/output-filters.html.en @@ -0,0 +1,585 @@ + + + + + +Guide to writing output filters - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Guide to writing output filters

    +
    +

    Available Languages:  en 

    +
    + +

    There are a number of common pitfalls encountered when writing + output filters; this page aims to document best practice for + authors of new or existing filters.

    + +

    This document is applicable to both version 2.0 and version 2.2 + of the Apache HTTP Server; it specifically targets + RESOURCE-level or CONTENT_SET-level + filters though some advice is generic to all types of filter.

    +
    + +
    top
    +
    +

    Filters and bucket brigades

    + + +

    Each time a filter is invoked, it is passed a bucket + brigade, containing a sequence of buckets which + represent both data content and metadata. Every bucket has a + bucket type; a number of bucket types are defined and + used by the httpd core modules (and the + apr-util library which provides the bucket brigade + interface), but modules are free to define their own types.

    + +
    Output filters must be prepared to process + buckets of non-standard types; with a few exceptions, a filter + need not care about the types of buckets being filtered.
    + +

    A filter can tell whether a bucket represents either data or + metadata using the APR_BUCKET_IS_METADATA macro. + Generally, all metadata buckets should be passed down the filter + chain by an output filter. Filters may transform, delete, and + insert data buckets as appropriate.

    + +

    There are two metadata bucket types which all filters must pay + attention to: the EOS bucket type, and the + FLUSH bucket type. An EOS bucket + indicates that the end of the response has been reached and no + further buckets need be processed. A FLUSH bucket + indicates that the filter should flush any buffered buckets (if + applicable) down the filter chain immediately.

    + +
    FLUSH buckets are sent when the + content generator (or an upstream filter) knows that there may be + a delay before more content can be sent. By passing + FLUSH buckets down the filter chain immediately, + filters ensure that the client is not kept waiting for pending + data longer than necessary.
    + +

    Filters can create FLUSH buckets and pass these + down the filter chain if desired. Generating FLUSH + buckets unnecessarily, or too frequently, can harm network + utilisation since it may force large numbers of small packets to + be sent, rather than a small number of larger packets. The + section on Non-blocking bucket reads + covers a case where filters are encouraged to generate + FLUSH buckets.

    + +

    Example bucket brigade

    + HEAP FLUSH FILE EOS

    + +

    This shows a bucket brigade which may be passed to a filter; it + contains two metadata buckets (FLUSH and + EOS), and two data buckets (HEAP and + FILE).

    + +
    top
    +
    +

    Filter invocation

    + + +

    For any given request, an output filter might be invoked only + once and be given a single brigade representing the entire response. + It is also possible that the number of times a filter is invoked + for a single response is proportional to the size of the content + being filtered, with the filter being passed a brigade containing + a single bucket each time. Filters must operate correctly in + either case.

    + +
    An output filter which allocates long-lived + memory every time it is invoked may consume memory proportional to + response size. Output filters which need to allocate memory + should do so once per response; see Maintaining + state below.
    + +

    An output filter can distinguish the final invocation for a + given response by the presence of an EOS bucket in + the brigade. Any buckets in the brigade after an EOS should be + ignored.

    + +

    An output filter should never pass an empty brigade down the + filter chain. To be defensive, filters should be prepared to + accept an empty brigade, and should return success without passing + this brigade on down the filter chain. The handling of an empty + brigade should have no side effects (such as changing any state + private to the filter).

    + +

    How to handle an empty brigade

    apr_status_t dummy_filter(ap_filter_t *f, apr_bucket_brigade *bb)
    +{
    +    if (APR_BRIGADE_EMPTY(bb)) {
    +        return APR_SUCCESS;
    +    }
    +    ...
    +
    + +
    top
    +
    +

    Brigade structure

    + + +

    A bucket brigade is a doubly-linked list of buckets. The list + is terminated (at both ends) by a sentinel which can be + distinguished from a normal bucket by comparing it with the + pointer returned by APR_BRIGADE_SENTINEL. The list + sentinel is in fact not a valid bucket structure; any attempt to + call normal bucket functions (such as + apr_bucket_read) on the sentinel will have undefined + behaviour (i.e. will crash the process).

    + +

    There are a variety of functions and macros for traversing and + manipulating bucket brigades; see the apr_buckets.h + header for complete coverage. Commonly used macros include:

    + +
    +
    APR_BRIGADE_FIRST(bb)
    +
    returns the first bucket in brigade bb
    + +
    APR_BRIGADE_LAST(bb)
    +
    returns the last bucket in brigade bb
    + +
    APR_BUCKET_NEXT(e)
    +
    gives the next bucket after bucket e
    + +
    APR_BUCKET_PREV(e)
    +
    gives the bucket before bucket e
    + +
    + +

    The apr_bucket_brigade structure itself is + allocated out of a pool, so if a filter creates a new brigade, it + must ensure that memory use is correctly bounded. A filter which + allocates a new brigade out of the request pool + (r->pool) on every invocation, for example, will fall + foul of the warning above concerning + memory use. Such a filter should instead create a brigade on the + first invocation per request, and store that brigade in its state structure.

    + +

    It is generally never advisable to use + apr_brigade_destroy to "destroy" a brigade unless + you know for certain that the brigade will never be used + again, even then, it should be used rarely. The + memory used by the brigade structure will not be released by + calling this function (since it comes from a pool), but the + associated pool cleanup is unregistered. Using + apr_brigade_destroy can in fact cause memory leaks; + if a "destroyed" brigade contains buckets when its + containing pool is destroyed, those buckets will not be + immediately destroyed.

    + +

    In general, filters should use apr_brigade_cleanup + in preference to apr_brigade_destroy.

    + +
    top
    +
    +

    Processing buckets

    + + + +

    When dealing with non-metadata buckets, it is important to + understand that the "apr_bucket *" object is an + abstract representation of data:

    + +
      +
    1. The amount of data represented by the bucket may or may not + have a determinate length; for a bucket which represents data of + indeterminate length, the ->length field is set to + the value (apr_size_t)-1. For example, buckets of + the PIPE bucket type have an indeterminate length; + they represent the output from a pipe.
    2. + +
    3. The data represented by a bucket may or may not be mapped + into memory. The FILE bucket type, for example, + represents data stored in a file on disk.
    4. +
    + +

    Filters read the data from a bucket using the + apr_bucket_read function. When this function is + invoked, the bucket may morph into a different bucket + type, and may also insert a new bucket into the bucket brigade. + This must happen for buckets which represent data not mapped into + memory.

    + +

    To give an example; consider a bucket brigade containing a + single FILE bucket representing an entire file, 24 + kilobytes in size:

    + +

    FILE(0K-24K)

    + +

    When this bucket is read, it will read a block of data from the + file, morph into a HEAP bucket to represent that + data, and return the data to the caller. It also inserts a new + FILE bucket representing the remainder of the file; + after the apr_bucket_read call, the brigade looks + like:

    + +

    HEAP(8K) FILE(8K-24K)

    + +
    top
    +
    +

    Filtering brigades

    + + +

    The basic function of any output filter will be to iterate + through the passed-in brigade and transform (or simply examine) + the content in some manner. The implementation of the iteration + loop is critical to producing a well-behaved output filter.

    + +

    Taking an example which loops through the entire brigade as + follows:

    + +

    Bad output filter -- do not imitate!

    apr_bucket *e = APR_BRIGADE_FIRST(bb);
    +const char *data;
    +apr_size_t length;
    +
    +while (e != APR_BRIGADE_SENTINEL(bb)) {
    +    apr_bucket_read(e, &data, &length, APR_BLOCK_READ);
    +    e = APR_BUCKET_NEXT(e);
    +}
    +
    +return ap_pass_brigade(bb);
    +
    + +

    The above implementation would consume memory proportional to + content size. If passed a FILE bucket, for example, + the entire file contents would be read into memory as each + apr_bucket_read call morphed a FILE + bucket into a HEAP bucket.

    + +

    In contrast, the implementation below will consume a fixed + amount of memory to filter any brigade; a temporary brigade is + needed and must be allocated only once per response, see the Maintaining state section.

    + +

    Better output filter

    apr_bucket *e;
    +const char *data;
    +apr_size_t length;
    +
    +while ((e = APR_BRIGADE_FIRST(bb)) != APR_BRIGADE_SENTINEL(bb)) {
    +    rv = apr_bucket_read(e, &data, &length, APR_BLOCK_READ);
    +    if (rv) ...;
    +    /* Remove bucket e from bb. */
    +    APR_BUCKET_REMOVE(e);
    +    /* Insert it into  temporary brigade. */
    +    APR_BRIGADE_INSERT_HEAD(tmpbb, e);
    +    /* Pass brigade downstream. */
    +    rv = ap_pass_brigade(f->next, tmpbb);
    +    if (rv) ...;
    +    apr_brigade_cleanup(tmpbb);
    +}
    +
    + +
    top
    +
    +

    Maintaining state

    + + + +

    A filter which needs to maintain state over multiple + invocations per response can use the ->ctx field of + its ap_filter_t structure. It is typical to store a + temporary brigade in such a structure, to avoid having to allocate + a new brigade per invocation as described in the Brigade structure section.

    + +

    Example code to maintain filter state

    struct dummy_state {
    +    apr_bucket_brigade *tmpbb;
    +    int filter_state;
    +    ...
    +};
    +
    +apr_status_t dummy_filter(ap_filter_t *f, apr_bucket_brigade *bb)
    +{
    +    struct dummy_state *state;
    +
    +    state = f->ctx;
    +    if (state == NULL) {
    +
    +        /* First invocation for this response: initialise state structure.
    +         */
    +        f->ctx = state = apr_palloc(f->r->pool, sizeof *state);
    +
    +        state->tmpbb = apr_brigade_create(f->r->pool, f->c->bucket_alloc);
    +        state->filter_state = ...;
    +    }
    +    ...
    +
    + +
    top
    +
    +

    Buffering buckets

    + + +

    If a filter decides to store buckets beyond the duration of a + single filter function invocation (for example storing them in its + ->ctx state structure), those buckets must be set + aside. This is necessary because some bucket types provide + buckets which represent temporary resources (such as stack memory) + which will fall out of scope as soon as the filter chain completes + processing the brigade.

    + +

    To setaside a bucket, the apr_bucket_setaside + function can be called. Not all bucket types can be setaside, but + if successful, the bucket will have morphed to ensure it has a + lifetime at least as long as the pool given as an argument to the + apr_bucket_setaside function.

    + +

    Alternatively, the ap_save_brigade function can be + used, which will move all the buckets into a separate brigade + containing buckets with a lifetime as long as the given pool + argument. This function must be used with care, taking into + account the following points:

    + +
      +
    1. On return, ap_save_brigade guarantees that all + the buckets in the returned brigade will represent data mapped + into memory. If given an input brigade containing, for example, + a PIPE bucket, ap_save_brigade will + consume an arbitrary amount of memory to store the entire output + of the pipe.
    2. + +
    3. When ap_save_brigade reads from buckets which + cannot be setaside, it will always perform blocking reads, + removing the opportunity to use Non-blocking + bucket reads.
    4. + +
    5. If ap_save_brigade is used without passing a + non-NULL "saveto" (destination) brigade parameter, + the function will create a new brigade, which may cause memory + use to be proportional to content size as described in the Brigade structure section.
    6. +
    + +
    Filters must ensure that any buffered data is + processed and passed down the filter chain during the last + invocation for a given response (a brigade containing an EOS + bucket). Otherwise such data will be lost.
    + +
    top
    +
    +

    Non-blocking bucket reads

    + + +

    The apr_bucket_read function takes an + apr_read_type_e argument which determines whether a + blocking or non-blocking read will be performed + from the data source. A good filter will first attempt to read + from every data bucket using a non-blocking read; if that fails + with APR_EAGAIN, then send a FLUSH + bucket down the filter chain, and retry using a blocking read.

    + +

    This mode of operation ensures that any filters further down the + filter chain will flush any buffered buckets if a slow content + source is being used.

    + +

    A CGI script is an example of a slow content source which is + implemented as a bucket type. mod_cgi will send + PIPE buckets which represent the output from a CGI + script; reading from such a bucket will block when waiting for the + CGI script to produce more output.

    + +

    Example code using non-blocking bucket reads

    apr_bucket *e;
    +apr_read_type_e mode = APR_NONBLOCK_READ;
    +
    +while ((e = APR_BRIGADE_FIRST(bb)) != APR_BRIGADE_SENTINEL(bb)) {
    +    apr_status_t rv;
    +
    +    rv = apr_bucket_read(e, &data, &length, mode);
    +    if (rv == APR_EAGAIN && mode == APR_NONBLOCK_READ) {
    +
    +        /* Pass down a brigade containing a flush bucket: */
    +        APR_BRIGADE_INSERT_TAIL(tmpbb, apr_bucket_flush_create(...));
    +        rv = ap_pass_brigade(f->next, tmpbb);
    +        apr_brigade_cleanup(tmpbb);
    +        if (rv != APR_SUCCESS) return rv;
    +
    +        /* Retry, using a blocking read. */
    +        mode = APR_BLOCK_READ;
    +        continue;
    +    }
    +    else if (rv != APR_SUCCESS) {
    +        /* handle errors */
    +    }
    +
    +    /* Next time, try a non-blocking read first. */
    +    mode = APR_NONBLOCK_READ;
    +    ...
    +}
    +
    + +
    top
    +
    +

    Ten rules for output filters

    + + +

    In summary, here is a set of rules for all output filters to + follow:

    + +
      +
    1. Output filters should not pass empty brigades down the filter + chain, but should be tolerant of being passed empty + brigades.
    2. + +
    3. Output filters must pass all metadata buckets down the filter + chain; FLUSH buckets should be respected by passing + any pending or buffered buckets down the filter chain.
    4. + +
    5. Output filters should ignore any buckets following an + EOS bucket.
    6. + +
    7. Output filters must process a fixed amount of data at a + time, to ensure that memory consumption is not proportional to + the size of the content being filtered.
    8. + +
    9. Output filters should be agnostic with respect to bucket + types, and must be able to process buckets of unfamiliar + type.
    10. + +
    11. After calling ap_pass_brigade to pass a brigade + down the filter chain, output filters should call + apr_brigade_cleanup to ensure the brigade is empty + before reusing that brigade structure; output filters should + never use apr_brigade_destroy to "destroy" + brigades.
    12. + +
    13. Output filters must setaside any buckets which are + preserved beyond the duration of the filter function.
    14. + +
    15. Output filters must not ignore the return value of + ap_pass_brigade, and must return appropriate errors + back up the filter chain.
    16. + +
    17. Output filters must only create a fixed number of bucket + brigades for each response, rather than one per invocation.
    18. + +
    19. Output filters should first attempt non-blocking reads from + each data bucket, and send a FLUSH bucket down the + filter chain if the read blocks, before retrying with a blocking + read.
    20. + +
    + +
    top
    +
    +

    Use case: buffering in mod_ratelimit

    + +

    The r1833875 change is a good + example to show what buffering and keeping state means in the context of an + output filter. In this use case, a user asked on the users' mailing list a + interesting question about why mod_ratelimit seemed not to + honor its setting with proxied content (either rate limiting at a different + speed or simply not doing it at all). Before diving deep into the solution, + it is better to explain on a high level how mod_ratelimit works. + The trick is really simple: take the rate limit settings and calculate a + chunk size of data to flush every 200ms to the client. For example, let's imagine + that to set rate-limit 60 in our config, these are the high level + steps to find the chunk size:

    +
    /* milliseconds to wait between each flush of data */
    +RATE_INTERVAL_MS = 200;
    +/* rate limit speed in b/s */
    +speed = 60 * 1024;
    +/* final chunk size is 12228 bytes */
    +chunk_size = (speed / (1000 / RATE_INTERVAL_MS));
    + +

    If we apply this calculation to a bucket brigade carrying 38400 bytes, it means + that the filter will try to do the following:

    +
      +
    1. Split the 38400 bytes in chunks of maximum 12228 bytes each.
    2. +
    3. Flush the first 12228 chunk of bytes and sleep 200ms.
    4. +
    5. Flush the second 12228 chunk of bytes and sleep 200ms.
    6. +
    7. Flush the third 12228 chunk of bytes and sleep 200ms.
    8. +
    9. Flush the remaining 1716 bytes.
    10. +
    +

    The above pseudo code works fine if the output filter handles only one brigade + for each response, but it might happen that it needs to be called multiple times + with different brigade sizes as well. The former use case is for example when + httpd directly serves some content, like a static file: the bucket brigade + abstraction takes care of handling the whole content, and rate limiting + works nicely. But if the same static content is served via mod_proxy_http (for + example a backend is serving it rather than httpd) then the content generator + (in this case mod_proxy_http) may use a maximum buffer size and then send data + as bucket brigades to the output filters chain regularly, triggering of course + multiple calls to mod_ratelimit. If the reader tries to execute the pseudo code + assuming multiple calls to the output filter, each one requiring to process + a bucket brigade of 38400 bytes, then it is easy to spot some + anomalies:

    +
      +
    1. Between the last flush of a brigade and the first one of the next, + there is no sleep.
    2. +
    3. Even if the sleep was forced after the last flush, then that chunk size + would not be the ideal size (1716 bytes instead of 12228) and the final client's speed + would quickly become different than what set in the httpd's config.
    4. +
    +

    In this case, two things might help:

    +
      +
    1. Use the ctx internal data structure, initialized by mod_ratelimit + for each response handling cycle, to "remember" when the last sleep was + performed across multiple invocations, and act accordingly.
    2. +
    3. If a bucket brigade is not splittable into a finite number of chunk_size + blocks, store the remaining bytes (located in the tail of the bucket brigade) + in a temporary holding area (namely another bucket brigade) and then use + ap_save_brigade to set them aside. + These bytes will be prepended to the next bucket brigade that will be handled + in the subsequent invocation.
    4. +
    5. Avoid the previous logic if the bucket brigade that is currently being + processed contains the end of stream bucket (EOS). There is no need to sleep + or buffering data if the end of stream is reached.
    6. +
    +

    The commit linked in the beginning of the section contains also a bit of code + refactoring so it is not trivial to read during the first pass, but the overall + idea is basically what written up to now. The goal of this section is not to + cause a headache to the reader trying to read C code, but to put him/her into + the right mindset needed to use efficiently the tools offered by the httpd's + filter chain toolset.

    +
    +
    +

    Available Languages:  en 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/developer/request.html b/docs/manual/developer/request.html new file mode 100644 index 0000000..92c1bee --- /dev/null +++ b/docs/manual/developer/request.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: request.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/developer/request.html.en b/docs/manual/developer/request.html.en new file mode 100644 index 0000000..9d6c1aa --- /dev/null +++ b/docs/manual/developer/request.html.en @@ -0,0 +1,248 @@ + + + + + +Request Processing in the Apache HTTP Server 2.x - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Request Processing in the Apache HTTP Server 2.x

    +
    +

    Available Languages:  en 

    +
    + +

    Warning

    +

    Warning - this is a first (fast) draft that needs further + revision!

    +
    + +

    Several changes in 2.0 and above affect the internal request + processing mechanics. Module authors need to be aware of these + changes so they may take advantage of the optimizations and + security enhancements.

    + +

    The first major change is to the subrequest and redirect + mechanisms. There were a number of different code paths in + the Apache HTTP Server 1.3 to attempt to optimize subrequest + or redirect behavior. As patches were introduced to 2.0, these + optimizations (and the server behavior) were quickly broken due + to this duplication of code. All duplicate code has been folded + back into ap_process_request_internal() to prevent + the code from falling out of sync again.

    + +

    This means that much of the existing code was 'unoptimized'. + It is the Apache HTTP Project's first goal to create a robust + and correct implementation of the HTTP server RFC. Additional + goals include security, scalability and optimization. New + methods were sought to optimize the server (beyond the + performance of 1.3) without introducing fragile or + insecure code.

    +
    + +
    top
    +
    +

    The Request Processing Cycle

    +

    All requests pass through ap_process_request_internal() + in server/request.c, including subrequests and redirects. If a module + doesn't pass generated requests through this code, the author is cautioned + that the module may be broken by future changes to request + processing.

    + +

    To streamline requests, the module author can take advantage + of the hooks offered to drop + out of the request cycle early, or to bypass core hooks which are + irrelevant (and costly in terms of CPU.)

    +
    top
    +
    +

    The Request Parsing Phase

    +

    Unescapes the URL

    +

    The request's parsed_uri path is unescaped, once and only + once, at the beginning of internal request processing.

    + +

    This step is bypassed if the proxyreq flag is set, or the + parsed_uri.path element is unset. The module has no further + control of this one-time unescape operation, either failing to + unescape or multiply unescaping the URL leads to security + repercussions.

    + + +

    Strips Parent and This Elements from the + URI

    +

    All /../ and /./ elements are + removed by ap_getparents(), as well as any trailing + /. or /.. element. This helps to ensure + the path is (nearly) absolute before the request processing + continues. (See RFC 1808 section 4 for further discussion.)

    + +

    This step cannot be bypassed.

    + + +

    Initial URI Location Walk

    +

    Every request is subject to an + ap_location_walk() call. This ensures that + <Location> sections + are consistently enforced for all requests. If the request is an internal + redirect or a sub-request, it may borrow some or all of the processing + from the previous or parent request's ap_location_walk, so this step + is generally very efficient after processing the main request.

    + + +

    translate_name

    +

    Modules can determine the file name, or alter the given URI + in this step. For example, mod_vhost_alias will + translate the URI's path into the configured virtual host, + mod_alias will translate the path to an alias path, + and if the request falls back on the core, the DocumentRoot is prepended to the request resource.

    + +

    If all modules DECLINE this phase, an error 500 is + returned to the browser, and a "couldn't translate name" error is logged + automatically.

    + + +

    Hook: map_to_storage

    +

    After the file or correct URI was determined, the + appropriate per-dir configurations are merged together. For + example, mod_proxy compares and merges the appropriate + <Proxy> sections. + If the URI is nothing more than a local (non-proxy) TRACE + request, the core handles the request and returns DONE. + If no module answers this hook with OK or DONE, + the core will run the request filename against the <Directory> and <Files> sections. If the request + 'filename' isn't an absolute, legal filename, a note is set for + later termination.

    + + +

    URI Location Walk

    +

    Every request is hardened by a second + ap_location_walk() call. This reassures that a + translated request is still subjected to the configured + <Location> sections. + The request again borrows some or all of the processing from its previous + location_walk above, so this step is almost always very + efficient unless the translated URI mapped to a substantially different + path or Virtual Host.

    + + +

    Hook: header_parser

    +

    The main request then parses the client's headers. This + prepares the remaining request processing steps to better serve + the client's request.

    + +
    top
    +
    +

    The Security Phase

    +

    Needs Documentation. Code is:

    + +
    if ((access_status = ap_run_access_checker(r)) != 0) {
    +    return decl_die(access_status, "check access", r);
    +}
    +
    +if ((access_status = ap_run_check_user_id(r)) != 0) {
    +    return decl_die(access_status, "check user", r);
    +}
    +
    +if ((access_status = ap_run_auth_checker(r)) != 0) {
    +    return decl_die(access_status, "check authorization", r);
    +}
    + +
    top
    +
    +

    The Preparation Phase

    +

    Hook: type_checker

    +

    The modules have an opportunity to test the URI or filename + against the target resource, and set mime information for the + request. Both mod_mime and + mod_mime_magic use this phase to compare the file + name or contents against the administrator's configuration and set the + content type, language, character set and request handler. Some modules + may set up their filters or other request handling parameters at this + time.

    + +

    If all modules DECLINE this phase, an error 500 is + returned to the browser, and a "couldn't find types" error is logged + automatically.

    + + +

    Hook: fixups

    +

    Many modules are 'trounced' by some phase above. The fixups + phase is used by modules to 'reassert' their ownership or force + the request's fields to their appropriate values. It isn't + always the cleanest mechanism, but occasionally it's the only + option.

    + +
    top
    +
    +

    The Handler Phase

    +

    This phase is not part of the processing in + ap_process_request_internal(). Many + modules prepare one or more subrequests prior to creating any + content at all. After the core, or a module calls + ap_process_request_internal() it then calls + ap_invoke_handler() to generate the request.

    + +

    Hook: insert_filter

    +

    Modules that transform the content in some way can insert + their values and override existing filters, such that if the + user configured a more advanced filter out-of-order, then the + module can move its order as need be. There is no result code, + so actions in this hook better be trusted to always succeed.

    + + +

    Hook: handler

    +

    The module finally has a chance to serve the request in its + handler hook. Note that not every prepared request is sent to + the handler hook. Many modules, such as mod_autoindex, + will create subrequests for a given URI, and then never serve the + subrequest, but simply lists it for the user. Remember not to + put required teardown from the hooks above into this module, + but register pool cleanups against the request pool to free + resources as required.

    + +
    +
    +

    Available Languages:  en 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/developer/thread_safety.html b/docs/manual/developer/thread_safety.html new file mode 100644 index 0000000..8196302 --- /dev/null +++ b/docs/manual/developer/thread_safety.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: thread_safety.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/developer/thread_safety.html.en b/docs/manual/developer/thread_safety.html.en new file mode 100644 index 0000000..75fa954 --- /dev/null +++ b/docs/manual/developer/thread_safety.html.en @@ -0,0 +1,307 @@ + + + + + +Apache HTTP Server 2.x Thread Safety Issues - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Apache HTTP Server 2.x Thread Safety Issues

    +
    +

    Available Languages:  en 

    +
    + +

    When using any of the threaded mpms in the Apache HTTP Server 2.x it is important + that every function called from Apache be thread safe. When linking in 3rd + party extensions it can be difficult to determine whether the resulting + server will be thread safe. Casual testing generally won't tell you this + either as thread safety problems can lead to subtle race conditions that + may only show up in certain conditions under heavy load.

    +
    + +
    top
    +
    +

    Global and static variables

    +

    When writing your module or when trying to determine if a module or + 3rd party library is thread safe there are some common things to keep in + mind.

    + +

    First, you need to recognize that in a threaded model each individual + thread has its own program counter, stack and registers. Local variables + live on the stack, so those are fine. You need to watch out for any + static or global variables. This doesn't mean that you are absolutely not + allowed to use static or global variables. There are times when you + actually want something to affect all threads, but generally you need to + avoid using them if you want your code to be thread safe.

    + +

    In the case where you have a global variable that needs to be global and + accessed by all threads, be very careful when you update it. If, for + example, it is an incrementing counter, you need to atomically increment + it to avoid race conditions with other threads. You do this using a mutex + (mutual exclusion). Lock the mutex, read the current value, increment it + and write it back and then unlock the mutex. Any other thread that wants + to modify the value has to first check the mutex and block until it is + cleared.

    + +

    If you are using APR, have a look + at the apr_atomic_* functions and the + apr_thread_mutex_* functions.

    + +
    top
    +
    +

    errno

    +

    This is a common global variable that holds the error number of the + last error that occurred. If one thread calls a low-level function that + sets errno and then another thread checks it, we are bleeding error + numbers from one thread into another. To solve this, make sure your + module or library defines _REENTRANT or is compiled with + -D_REENTRANT. This will make errno a per-thread variable + and should hopefully be transparent to the code. It does this by doing + something like this:

    + +

    + #define errno (*(__errno_location())) +

    + +

    which means that accessing errno will call + __errno_location() which is provided by the libc. Setting + _REENTRANT also forces redefinition of some other functions + to their *_r equivalents and sometimes changes + the common getc/putc macros into safer function + calls. Check your libc documentation for specifics. Instead of, or in + addition to _REENTRANT the symbols that may affect this are + _POSIX_C_SOURCE, _THREAD_SAFE, + _SVID_SOURCE, and _BSD_SOURCE.

    +
    top
    +
    +

    Common standard troublesome functions

    +

    Not only do things have to be thread safe, but they also have to be + reentrant. strtok() is an obvious one. You call it the first + time with your delimiter which it then remembers and on each subsequent + call it returns the next token. Obviously if multiple threads are + calling it you will have a problem. Most systems have a reentrant version + of the function called strtok_r() where you pass in an + extra argument which contains an allocated char * which the + function will use instead of its own static storage for maintaining + the tokenizing state. If you are using APR you can use apr_strtok().

    + +

    crypt() is another function that tends to not be reentrant, + so if you run across calls to that function in a library, watch out. On + some systems it is reentrant though, so it is not always a problem. If + your system has crypt_r() chances are you should be using + that, or if possible simply avoid the whole mess by using md5 instead.

    + +
    top
    +
    +

    Common 3rd Party Libraries

    +

    The following is a list of common libraries that are used by 3rd party + Apache modules. You can check to see if your module is using a potentially + unsafe library by using tools such as ldd(1) and + nm(1). For PHP, for example, + try this:

    + +

    + % ldd libphp4.so
    + libsablot.so.0 => /usr/local/lib/libsablot.so.0 (0x401f6000)
    + libexpat.so.0 => /usr/lib/libexpat.so.0 (0x402da000)
    + libsnmp.so.0 => /usr/lib/libsnmp.so.0 (0x402f9000)
    + libpdf.so.1 => /usr/local/lib/libpdf.so.1 (0x40353000)
    + libz.so.1 => /usr/lib/libz.so.1 (0x403e2000)
    + libpng.so.2 => /usr/lib/libpng.so.2 (0x403f0000)
    + libmysqlclient.so.11 => /usr/lib/libmysqlclient.so.11 (0x40411000)
    + libming.so => /usr/lib/libming.so (0x40449000)
    + libm.so.6 => /lib/libm.so.6 (0x40487000)
    + libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x404a8000)
    + libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x404e7000)
    + libcrypt.so.1 => /lib/libcrypt.so.1 (0x40505000)
    + libssl.so.2 => /lib/libssl.so.2 (0x40532000)
    + libcrypto.so.2 => /lib/libcrypto.so.2 (0x40560000)
    + libresolv.so.2 => /lib/libresolv.so.2 (0x40624000)
    + libdl.so.2 => /lib/libdl.so.2 (0x40634000)
    + libnsl.so.1 => /lib/libnsl.so.1 (0x40637000)
    + libc.so.6 => /lib/libc.so.6 (0x4064b000)
    + /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000) +

    + +

    In addition to these libraries you will need to have a look at any + libraries linked statically into the module. You can use nm(1) + to look for individual symbols in the module.

    +
    top
    +
    +

    Library List

    +

    Please drop a note to dev@httpd.apache.org + if you have additions or corrections to this list.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    LibraryVersionThread Safe?Notes
    ASpell/PSpell ?
    Berkeley DB3.x, 4.xYesBe careful about sharing a connection across threads.
    bzip2 YesBoth low-level and high-level APIs are thread-safe. However, + high-level API requires thread-safe access to errno.
    cdb ?
    C-Client Perhapsc-client uses strtok() and + gethostbyname() which are not thread-safe on most C + library implementations. c-client's static data is meant to be shared + across threads. If strtok() and + gethostbyname() are thread-safe on your OS, c-client + may be thread-safe.
    libcrypt ?
    Expat YesNeed a separate parser instance per thread
    FreeTDS ?
    FreeType ?
    GD 1.8.x ?
    GD 2.0.x ?
    gdbm NoErrors returned via a static gdbm_error + variable
    ImageMagick5.2.2YesImageMagick docs claim it is thread safe since version 5.2.2 (see Change log). +
    Imlib2 ?
    libjpegv6b?
    libmysqlclient YesUse mysqlclient_r library variant to ensure thread-safety. For + more information, please read http://dev.mysql.com/doc/mysql/en/Threaded_clients.html.
    Ming0.2a?
    Net-SNMP5.0.x?
    OpenLDAP2.1.xYesUse ldap_r library variant to ensure + thread-safety.
    OpenSSL0.9.6gYesRequires proper usage of CRYPTO_num_locks, + CRYPTO_set_locking_callback, + CRYPTO_set_id_callback
    liboci8 (Oracle 8+)8.x,9.x?
    pdflib5.0.xYesPDFLib docs claim it is thread safe; changes.txt indicates it + has been partially thread-safe since V1.91: http://www.pdflib.com/products/pdflib-family/pdflib/.
    libpng1.0.x?
    libpng1.2.x?
    libpq (PostgreSQL)8.xYesDon't share connections across threads and watch out for + crypt() calls
    Sablotron0.95?
    zlib1.1.4YesRelies upon thread-safe zalloc and zfree functions Default is to + use libc's calloc/free which are thread-safe.
    +
    +
    +

    Available Languages:  en 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/dns-caveats.html b/docs/manual/dns-caveats.html new file mode 100644 index 0000000..f4a35c2 --- /dev/null +++ b/docs/manual/dns-caveats.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: dns-caveats.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: dns-caveats.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: dns-caveats.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: dns-caveats.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: dns-caveats.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/dns-caveats.html.en b/docs/manual/dns-caveats.html.en new file mode 100644 index 0000000..7c61037 --- /dev/null +++ b/docs/manual/dns-caveats.html.en @@ -0,0 +1,217 @@ + + + + + +Issues Regarding DNS and Apache HTTP Server - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Issues Regarding DNS and Apache HTTP Server

    +
    +

    Available Languages:  en  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    This page could be summarized with the statement: don't + configure Apache HTTP Server in such a way that it relies on DNS resolution + for parsing of the configuration files. If httpd requires DNS + resolution to parse the configuration files then your server + may be subject to reliability problems (ie. it might not start up), + or denial and theft of service attacks (including virtual hosts able + to steal hits from other virtual hosts).

    +
    + +
    top
    +
    +

    A Simple Example

    + + +
    # This is a misconfiguration example, do not use on your server
    +<VirtualHost www.example.dom>
    +  ServerAdmin webgirl@example.dom
    +  DocumentRoot "/www/example"
    +</VirtualHost>
    + + +

    In order for the server to function properly, it absolutely needs + to have two pieces of information about each virtual host: the + ServerName and at least one + IP address that the server will bind and respond to. The above + example does not include the IP address, so httpd must use DNS + to find the address of www.example.dom. If for some + reason DNS is not available at the time your server is parsing + its config file, then this virtual host will not be + configured. It won't be able to respond to any hits + to this virtual host.

    + +

    Suppose that www.example.dom has address 192.0.2.1. + Then consider this configuration snippet:

    + +
    # This is a misconfiguration example, do not use on your server
    +<VirtualHost 192.0.2.1>
    +  ServerAdmin webgirl@example.dom
    +  DocumentRoot "/www/example"
    +</VirtualHost>
    + + +

    This time httpd needs to use reverse DNS to find the + ServerName for this virtualhost. If that reverse + lookup fails then it will partially disable the virtualhost. + If the virtual host is name-based then it will effectively be + totally disabled, but if it is IP-based then it will mostly + work. However, if httpd should ever have to generate a full + URL for the server which includes the server name (such as when a + Redirect is issued), then it will fail to generate a valid URL.

    + +

    Here is a snippet that avoids both of these problems:

    + +
    <VirtualHost 192.0.2.1>
    +  ServerName www.example.dom
    +  ServerAdmin webgirl@example.dom
    +  DocumentRoot "/www/example"
    +</VirtualHost>
    + +
    top
    +
    +

    Denial of Service

    + + +

    Consider this configuration snippet:

    + +
    <VirtualHost www.example1.dom>
    +  ServerAdmin webgirl@example1.dom
    +  DocumentRoot "/www/example1"
    +</VirtualHost>
    +<VirtualHost www.example2.dom>
    +  ServerAdmin webguy@example2.dom
    +  DocumentRoot "/www/example2"
    +</VirtualHost>
    + + +

    Suppose that you've assigned 192.0.2.1 to + www.example1.dom and 192.0.2.2 to + www.example2.dom. Furthermore, suppose that + example1.dom has control of their own DNS. With this + config you have put example1.dom into a position where + they can steal all traffic destined to example2.dom. To + do so, all they have to do is set www.example1.dom to + 192.0.2.2. Since they control their own DNS you can't stop them + from pointing the www.example1.dom record wherever they + wish.

    + +

    Requests coming in to 192.0.2.2 (including all those where + users typed in URLs of the form + http://www.example2.dom/whatever) will all be served by + the example1.dom virtual host. To better understand why + this happens requires a more in-depth discussion of how httpd + matches up incoming requests with the virtual host that will + serve it. A rough document describing this is available.

    +
    top
    +
    +

    The "main server" Address

    + + +

    Name-based + virtual host support requires httpd to know + the IP address(es) of the host that httpd + is running on. To get this address it uses either the global + ServerName + (if present) or calls the C function gethostname + (which should return the same as typing "hostname" at the + command prompt). Then it performs a DNS lookup on this address. + At present there is no way to avoid this lookup.

    + +

    If you fear that this lookup might fail because your DNS + server is down then you can insert the hostname in + /etc/hosts (where you probably already have it so + that the machine can boot properly). Then ensure that your + machine is configured to use /etc/hosts in the + event that DNS fails. Depending on what OS you are using this + might be accomplished by editing /etc/resolv.conf, + or maybe /etc/nsswitch.conf.

    + +

    If your server doesn't have to perform DNS for any other + reason then you might be able to get away with running httpd + with the HOSTRESORDER environment variable set to + "local". This all depends on what OS and resolver libraries you + are using. It also affects CGIs unless you use + mod_env to control the environment. It's best + to consult the man pages or FAQs for your OS.

    +
    top
    +
    +

    Tips to Avoid These Problems

    + + +
      +
    • + use IP addresses in + VirtualHost +
    • + +
    • + use IP addresses in + Listen +
    • + +
    • + ensure all virtual hosts have an explicit + ServerName +
    • + +
    • create a <VirtualHost _default_:*> + server that has no pages to serve
    • +
    +
    +
    +

    Available Languages:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/dns-caveats.html.fr.utf8 b/docs/manual/dns-caveats.html.fr.utf8 new file mode 100644 index 0000000..9ff5e0a --- /dev/null +++ b/docs/manual/dns-caveats.html.fr.utf8 @@ -0,0 +1,226 @@ + + + + + +Problèmes liés au DNS avec le serveur HTTP Apache - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Problèmes liés au DNS avec le serveur HTTP Apache

    +
    +

    Langues Disponibles:  en  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Cette page pourrait se résumer ainsi : configurez le + serveur HTTP Apache de façon + à ce qu'il n'ait pas besoin de résolution DNS pour interpréter les + fichiers de configuration. Si httpd doit effectuer des résolutions + DNS pour interpréter les fichiers de configuration, votre serveur + pourra présenter des problèmes de fiabilité (en d'autres termes, + il est possible qu'il refuse de démarrer), ou d'attaques par déni ou + usurpation de service (y compris l'attribution de requêtes à un + serveur virtuel autre que le serveur virtuel voulu).

    +
    + +
    top
    +
    +

    Un exemple simple

    + + +
    # Ceci est un exemple de mauvaise configuration ; ne l'utilisez pas comme base
    +# de configuration
    +<VirtualHost www.example.dom>
    +  ServerAdmin webgirl@example.dom
    +  DocumentRoot "/www/example"
    +</VirtualHost>
    + + +

    Pour fonctionner correctement, le serveur a absolument besoin de deux + informations à propos de chaque serveur virtuel : le nom du serveur + défini par la directive ServerName, et au moins une adresse IP à + laquelle le serveur va se rattacher et répondre. L'exemple ci-dessus + ne comporte pas d'adresse IP, si bien que httpd devra utiliser le + DNS pour trouver l'adresse IP de www.example.dom. Si pour + une raison quelconque, le DNS n'est pas disponible au moment où + votre serveur interprète son fichier de configuration, ce serveur + virtuel ne sera pas pris en compte dans la + configuration. Il sera incapable de + répondre à toute requête pour ce serveur virtuel.

    + +

    Supposons que l'adresse de www.example.dom soit + 192.0.2.1, et examinons cet extrait de configuration :

    + +
    # Ceci est un exemple de mauvaise configuration ; ne l'utilisez pas comme base
    +# de configuration
    +<VirtualHost 192.0.2.1>
    +  ServerAdmin webgirl@example.dom
    +  DocumentRoot "/www/example"
    +</VirtualHost>
    + + +

    Cette fois, httpd doit effectuer une recherche DNS inverse pour + trouver le nom ServerName de ce serveur virtuel. Si + cette recherche inverse échoue, le serveur virtuel sera + partiellement désactivé. Si le serveur + virtuel est à base de nom, il sera en fait totalement désactivé, + mais s'il est à base d'adresse IP, il fonctionnera probablement. + Cependant, httpd échouera s'il doit générer une URL complète pour + le serveur qui inclut ce nom de serveur (comme dans le cas d'une + redirection).

    + +

    Voici un extrait de configuration qui permet d'éviter ces deux + types de problèmes :

    + +
    <VirtualHost 192.0.2.1>
    +  ServerName www.example.dom
    +  ServerAdmin webgirl@example.dom
    +  DocumentRoot "/www/example"
    +</VirtualHost>
    + +
    top
    +
    +

    Déni de service

    + + +

    Considérons cet extrait de configuration :

    + +
    <VirtualHost www.example1.dom>
    +  ServerAdmin webgirl@example1.dom
    +  DocumentRoot "/www/example1"
    +</VirtualHost>
    +<VirtualHost www.example2.dom>
    +  ServerAdmin webguy@example2.dom
    +  DocumentRoot "/www/example2"
    +</VirtualHost>
    + + +

    Supposons que vous ayez assigné 192.0.2.1 à + www.example1.dom et 192.0.2.2 à www.example2.dom. En + outre, supposons que example1.dom gère son propre DNS. Avec + cette configuration, example1.dom sera en mesure de + détourner tout trafic destiné à example2.dom. Pour y + parvenir, tout ce qu'ils ont à faire consiste à + assigner 192.0.2.2 à + www.example1.dom. Comme ils gèrent leur propre DNS, vous ne + pouvez pas les empêcher de faire pointer l'enregistrement + www.example1.dom vers l'adresse qu'ils veulent.

    + +

    Les requêtes à destination de 192.0.2.2 (y compris toutes celles + où l'utilisateur à tapé une URL de la forme + http://www.example2.dom/quelquepart), seront toutes servies + par le serveur virtuel example1.dom. Une meilleur + compréhension de la raison pour laquelle ceci peut se produire + nécessite une discussion plus approfondie à propos de la manière + dont httpd associe les requêtes entrantes aux différents serveurs + virtuels qui vont les servir. Un document de base décrivant ceci est disponible.

    +
    top
    +
    +

    L'adresse du "serveur principal"

    + + +

    Le support des + serveurs virtuels à base de nom oblige httpd à + connaître la/les adresse(s) IP de l'hôte sur + lequel httpd s'exécute. Pour obtenir cette + adresse, soit il utilise la directive ServerName globale (si elle est présente), + soit il fait appel à la fonction C gethostname (qui + doit renvoyer le même nom que la commande shell "hostname"). Il + effectue ensuite une recherche DNS sur cette adresse. Pour le + moment, il n'existe aucun moyen d'éviter cette recherche DNS.

    + +

    Si vous craignez que cette recherche DNS échoue parce que votre + serveur DNS est arrêté, vous pouvez insérer le nom d'hôte dans le + fichier /etc/hosts (où il est probablement déjà + enregistré afin que la machine démarre correctement). Assurez-vous + ensuite que la machine est configurée pour utiliser + /etc/hosts dans le cas où la recherche DNS échoue. + Suivant le système d'exploitation que vous utilisez, vous y + parviendrez en éditant /etc/resolv.conf, ou + /etc/nsswitch.conf.

    + +

    Si votre serveur n'a aucune autre raison d'effectuer des + recherches DNS, vous pouvez définir la variable d'environnement + HOSTRESORDER à "local", et vous serez alors en mesure + d'exécuter httpd. Tout dépend du système d'exploitation et des + bibliothèques de résolution de noms que vous utilisez. Elle affecte + aussi les programmes CGI, à moins que vous n'utilisiez + mod_env pour contrôler l'environnement. Il est + conseillé de consulter les pages de manuel ou les FAQs de votre + système d'exploitation.

    +
    top
    +
    +

    Conseils pour éviter ce genre de problème

    + + +
      +
    • + utilisez des adresses IP au sein des VirtualHost +
    • + +
    • + utilisez des adresses IP avec la directive Listen +
    • + +
    • + vérifiez que tous les serveurs virtuels possèdent un nom + ServerName explicite +
    • + +
    • créez un serveur virtuel <VirtualHost + _default_:*> qui n'a aucune page à servir
    • +
    +
    +
    +

    Langues Disponibles:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/dns-caveats.html.ja.utf8 b/docs/manual/dns-caveats.html.ja.utf8 new file mode 100644 index 0000000..76c03fb --- /dev/null +++ b/docs/manual/dns-caveats.html.ja.utf8 @@ -0,0 +1,279 @@ + + + + + +DNS 㨠Apache ã«ã¾ã¤ã‚る注æ„事項 - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    DNS 㨠Apache ã«ã¾ã¤ã‚る注æ„事項

    +
    +

    翻訳済ã¿è¨€èªž:  en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + +

    本文書ã®å†…å®¹ã¯æ¬¡ã®ä¸€è¨€ã«å°½ãã¾ã™ã€‚「Apache ãŒè¨­å®šãƒ•ァイルを読ã¿è¾¼ã‚€ã¨ãã« + DNS を使用ã™ã‚‹å¿…è¦ãŒãªã„よã†ã«ã—ã¦ä¸‹ã•ã„ã€ã€‚Apache ãŒè¨­å®šãƒ•ァイルを + 読ã¿è¾¼ã‚€ã¨ãã« DNS を使用ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã€ä¿¡é ¼æ€§ã®å•題 + (èµ·å‹•ã—ãªã„ã‹ã‚‚ã—れã¾ã›ã‚“) やサービス拒å¦ã‚„盗用アタック + (ä»–ã®ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ãƒ’ットを盗むã“ã¨ã‚’å«ã¿ã¾ã™) + ã®å•題ã«ç›´é¢ã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。

    +
    + +
    top
    +
    +

    ç°¡å˜ãªä¾‹

    + + +

    + <VirtualHost www.abc.dom>
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    + +

    Apache ãŒæ­£å¸¸ã«æ©Ÿèƒ½ã™ã‚‹ã«ã¯ã€ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆæ¯Žã«å¿…ãšäºŒã¤ã® + 情報ãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚ãれã¯ã€ + ServerName + ã¨ã€ãã®ã‚µãƒ¼ãƒãŒå¿œç­”ã™ã‚‹ãŸã‚ã® IP (最低一ã¤) ã§ã™ã€‚ + 上記例ã§ã¯ IP アドレスをå«ã‚“ã§ã„ã¾ã›ã‚“ã®ã§ã€Apache 㯠DNS + を使用ã—㦠www.abc.dom を見ã¤ã‘ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 + 何らã‹ã®ç†ç”±ã§è¨­å®šãƒ•ァイルを読ã¿è¾¼ã‚“ã§ã„ã‚‹ã¨ãã« DNS + ãŒåˆ©ç”¨ã§ããªã‹ã£ãŸå ´åˆã€ + ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã¯è¨­å®šã•れã¾ã›ã‚“。 + ãã—ã¦ã€ãã®ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã«å¯¾ã™ã‚‹ãƒ’ットã«ã¯å¿œç­”ãŒãªã•れã¾ã›ã‚“ + (Apache 1.2 以å‰ã§ã¯èµ·å‹•ã™ã‚‰ã—ã¾ã›ã‚“)。

    + +

    www.abc.dom ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒ 192.0.2.1 + ã ã¨ã—ã¾ã™ã€‚ã§ã¯ã€æ¬¡ã®è¨­å®šã«ã¤ã„ã¦è€ƒãˆã¦ã¿ã¾ã—ょã†ã€‚

    + +

    + <VirtualHost 192.0.2.1>
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    + +

    ç¾åœ¨ã®ãƒªãƒªãƒ¼ã‚¹ã§ã¯ Apache 㯠DNS 逆引ãを使用ã—㦠+ ã“ã®ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã® ServerName + を見ã¤ã‘ã¾ã™ã€‚ + ãã®é€†å¼•ããŒå¤±æ•—ã—ãŸå ´åˆã¯éƒ¨åˆ†çš„ã«ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã‚’無効ã«ã—ã¾ã™ + (Apache 1.2 よりå‰ã§ã¯èµ·å‹•ã™ã‚‰ã—ã¾ã›ã‚“)。 + ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆãŒåå‰ãƒ™ãƒ¼ã‚¹ã§ã‚れã°å®Œå…¨ã«ç„¡åйã«ãªã‚Šã¾ã™ãŒã€ + IP ベースã§ã‚ã‚Œã°æ¦‚ã­å‹•作ã—ã¾ã™ã€‚ã—ã‹ã—ãªãŒã‚‰ã€ã‚µãƒ¼ãƒåã‚’ + å«ã‚€å®Œå…¨ãª URL を生æˆã—ãªã‘れã°ãªã‚‰ãªã„å ´åˆã¯ã€æ­£ã—ã„ URL + ã®ç”ŸæˆãŒã§ãã¾ã›ã‚“。

    + +

    次ã®ä¾‹ã¯ä¸Šè¨˜ã®å•題を解決ã—ã¦ã„ã¾ã™ã€‚

    + +

    + <VirtualHost 192.0.2.1>
    + ServerName www.abc.dom
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    +
    top
    +
    +

    サービス拒å¦

    + + +

    サービス拒å¦ãŒèµ·ã“ã‚‹å ´åˆã€(å°‘ãªãã¨ã‚‚) 二ã¤ã®ã‚±ãƒ¼ã‚¹ãŒã‚りã¾ã™ã€‚ + Apache 1.2 よりå‰ã‚’実行ã—ã¦ã„ã‚‹å ´åˆã€ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã®ãŸã‚ã® + 上記ã®äºŒã¤ã® DNS 検索ã®ã†ã¡ä¸€ã¤å¤±æ•—ã™ã‚Œã°èµ·å‹•ã™ã‚‰ã—ã¾ã›ã‚“。 + ãã—ã¦ã“ã® DNS 検索ãŒè‡ªåˆ†ã®åˆ¶å¾¡ä¸‹ã«ã™ã‚‰ãªã„å ´åˆã‚‚ã‚りãˆã¾ã™ã€‚ + 例ãˆã°ã€abc.dom ãŒé¡§å®¢ã®ã‚µãƒ¼ãƒã®ä¸€ã¤ã§ã€ + DNS ã¯é¡§å®¢è‡ªèº«ã§ç®¡ç†ã—ã¦ã„ã‚‹å ´åˆã€å˜ã« + www.abc.dom レコードを削除ã™ã‚‹ã ã‘ã§ã€ + (1.2 よりå‰ã®) サーãƒã‚’èµ·å‹•ä¸èƒ½ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    ã‚‚ã†ä¸€ã¤ã®ã‚±ãƒ¼ã‚¹ã¯ã€ã‚ˆã‚Šæ°—付ãã«ãã„ã‚‚ã®ã§ã™ã€‚ + 次ã®è¨­å®šã«ã¤ã„ã¦è€ƒãˆã¦ã¿ã¾ã—ょã†ã€‚

    + +

    + <VirtualHost www.abc.dom>
    + + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    +
    + </VirtualHost>
    +
    + <VirtualHost www.def.dom>
    + + ServerAdmin webguy@def.dom
    + DocumentRoot /www/def
    +
    + </VirtualHost> +

    + +

    192.0.2.1 ã‚’ www.abc.dom ã«ã€ + 192.0.2.2 ã‚’ www.def.dom ã«å‰²ã‚Šå½“ã¦ã¦ã„ã‚‹ã¨ã—ã¾ã™ã€‚ + ã¾ãŸã€def.dom ã¯é¡§å®¢è‡ªèº«ã® DNS + ã®åˆ¶å¾¡ä¸‹ã«ã‚ã‚‹ã¨ã—ã¾ã™ã€‚ã“ã®è¨­å®šã§ã€abc.dom + ã«å‘ã‘られãŸãƒˆãƒ©ãƒ•ィック全ã¦ã‚’奪ã†ã“ã¨ãŒã§ãã‚‹ä½ç½®ã« + def.dom を設置ã§ãã¦ã„ã¾ã™ã€‚後ã¯å˜ã« + www.def.dom ㌠192.0.2.1 ã‚’å‚ç…§ã™ã‚‹ã‚ˆã†ã« + 設定ã™ã‚‹ã ã‘ã§ã™ã€‚DNS ã¯é¡§å®¢å´ã® DNS ã§ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã®ã§ã€ + www.def.dom レコードãŒå¥½ããªå ´æ‰€ã‚’指ã™ã‚ˆã†ã« + 設定ã§ãã¦ã—ã¾ã†ã®ã‚’æ­¢ã‚ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。

    + +

    192.0.2.1 ã«å¯¾ã™ã‚‹ãƒªã‚¯ã‚¨ã‚¹ãƒˆ + (http://www.abc.dom/whatever å½¢å¼ã® URL + を入力ã—ãŸãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã‚‚ã®å…¨ã¦ã‚’å«ã¿ã¾ã™) + ã¯ã€def.dom ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã§å¿œç­”ã•れã¾ã™ã€‚ + ã“ã®ã‚ˆã†ãªã“ã¨ãŒä½•æ•…èµ·ã“ã‚‹ã‹ã‚‚ã£ã¨è‰¯ã知るãŸã‚ã«ã¯ã€ + 応答ã®å¿…è¦ãªãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã¸ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«å¯¾ã—ã¦ã€ + Apache ãŒã©ã®ã‚ˆã†ã«æ•´åˆæ€§ã‚’確ä¿ã™ã‚‹ã‹ã«ã¤ã„ã¦ã€ + æ·±ã„è­°è«–ãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚ãŠãŠã–ã£ã±ãªèª¬æ˜Žã¯ã“ã¡ã‚‰ã«è¨˜è¿°ã•れã¦ã„ã¾ã™ã€‚

    +
    top
    +
    +

    「主サーãƒã€ã‚¢ãƒ‰ãƒ¬ã‚¹

    + + +

    Apache 1.1 ã§ã® åå‰ãƒ™ãƒ¼ã‚¹ã®ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã®ã‚µãƒãƒ¼ãƒˆ 追加ã®éš›ã«ã€ + Apache 㯠httpd ã®å®Ÿè¡Œã•れã¦ã„るホスト㮠IP + アドレスを知る必è¦ãŒå‡ºã¦ãã¾ã—ãŸã€‚ã“ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’å¾—ã‚‹ãŸã‚ã«ã€ + (ã‚‚ã—ã‚れã°) グローãƒãƒ«ãª + ServerName を使用ã™ã‚‹ã‹ã€ + C 言語ã®é–¢æ•° gethostname (コマンドプロンプト㧠+ hostname ã¨ã‚¿ã‚¤ãƒ—ã—ãŸã¨ãã¨åŒã˜ã‚‚ã®ã‚’è¿”ã—ã¾ã™) + を呼ã³å‡ºã™ã‹ã‚’ã—ã¾ã™ã€‚ + ãã®å¾Œã€å¾—られãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã§ DNS 検索を行ãªã„ã¾ã™ã€‚ + ç¾åœ¨ã®ã¨ã“ã‚ã€ã“ã® DNS 検索を回é¿ã™ã‚‹æ–¹æ³•ã¯ã‚りã¾ã›ã‚“。

    + +

    DNS サーãƒãŒãƒ€ã‚¦ãƒ³ã—ã¦ã€ã“ã®æ¤œç´¢ãŒã§ããªã„事態ãŒèµ·ã“ã‚‹ã“ã¨ã‚’ + æã‚Œã¦ã„ã‚‹ã®ã§ã‚れã°ã€/etc/hosts + ã«ãƒ›ã‚¹ãƒˆåを記述ã—ã¦ãŠãã“ã¨ãŒã§ãã¾ã™ + (ãƒžã‚·ãƒ³ãŒæ­£å¸¸ã«èµ·å‹•ã™ã‚‹ã‚ˆã†ã«æ—¢ã«è¨­å®šã•れã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“)。 + ãã®å ´åˆã€DNS å‚ç…§ãŒå¤±æ•—ã—ãŸå ´åˆã«ãƒžã‚·ãƒ³ãŒ /etc/hosts + を使用ã™ã‚‹ã‚ˆã†ã«è¨­å®šã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 + ãã®æ–¹æ³•ã¯ã€ã©ã® OS を使用ã—ã¦ã„ã‚‹ã‹ã«ä¾å­˜ã—ã¾ã™ãŒã€ + /etc/resolv.conf ã‹ /etc/nsswitch.conf + を編集ã™ã‚‹ã“ã¨ã§è¨­å®šã§ãã¾ã™ã€‚

    + +

    ã‚‚ã—ä»–ã®ç†ç”±ã§ DNS を利用ã™ã‚‹å¿…è¦ãŒãªã„å ´åˆã¯ã€ + HOSTRESORDER 環境変数を「 local + ã€ã«è¨­å®šã™ã‚‹ã“ã¨ã§ãã®ã‚ˆã†ã«ã§ãã¾ã™ã€‚以上ã“れらã®äº‹æŸ„ã¯ã€ã©ã‚“㪠+ OS ã€ãƒ¬ã‚¾ãƒ«ãƒãƒ©ã‚¤ãƒ–ラリを使用ã—ã¦ã„ã‚‹ã‹ã«ä¾å­˜ã—ã¾ã™ã€‚ã¾ãŸã€ + mod_env を使用ã—ã¦ç’°å¢ƒå¤‰æ•°ã‚’制御ã—ãªã„é™ã‚Šã€ + CGI ã«ã‚‚影響を与ãˆã¾ã™ã€‚man ページや使用ã—ã¦ã„ã‚‹ OS + ã® FAQ ã§èª¿ã¹ã‚‹ã¨è‰¯ã„ã§ã—ょã†ã€‚

    +
    top
    +
    +

    以上ã®å•題を解決ã™ã‚‹æ–¹æ³•

    + + +
      +
    • + VirtualHost + ã§ IP アドレスを使用ã™ã‚‹ã€‚ +
    • + +
    • + Listen + ã§ IP アドレスを使用ã™ã‚‹ã€‚ +
    • + +
    • + å…¨ã¦ã®ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆãŒæ˜Žç¤ºçš„ã« + ServerName + ã‚’æŒã¤ã‚ˆã†ã«ã™ã‚‹ã€‚ +
    • + +
    • 何も応答ã—ãªã„ + <VirtualHost _default_:*> + サーãƒã‚’作る。
    • +
    +
    top
    +
    +

    付録: å°†æ¥çš„ãªæ–¹å‘性

    + + +

    DNS ã«é–¢ã—ã¦ã€ç¾çжã¯å…¨ã宜ã—ãã‚りã¾ã›ã‚“。Apache 1.2 ã§ã€ + DNS ã®ã‚¤ãƒ™ãƒ³ãƒˆãŒå¤±æ•—ã—ã¦ã‚‚å°‘ãªãã¨ã‚‚起動プロセスãŒç¶šãよã†ã«ã—ã¾ã—ãŸãŒã€ + ã“ã‚ŒãŒæœ€é«˜ã®è§£æ±ºæ–¹æ³•ã§ã¯ãªã„ã§ã—ょã†ã€‚アドレスã®å†å‰²ã‚Šå½“ã¦ãŒå¿…è¦ä¸å¯é¿ + ã¨ãªã£ã¦ã„る今日ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã«ãŠã„ã¦ã¯ã€ + 設定ファイルã®ä¸­ã§æ˜Žç¤ºçš„㪠IP ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’è¦æ±‚ã™ã‚‹ä»•様ã¯ã€ + å…¨ã宜ã—ãã‚りã¾ã›ã‚“。

    + +

    盗用ã®ã‚µãƒ¼ãƒ“スアタックã«é–¢ã—ã¦è¡Œãªã†ã¹ã事ã¯ã€ + DNS 順引ãを行ãªã£ã¦å¾—られãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã«å¯¾ã™ã‚‹ DNS + 逆引ãを行ãªã£ã¦ã€äºŒã¤ã®åå‰ã‚’比較ã™ã‚‹ã“ã¨ã§ã™ã€‚ + ã“ã®äºŒã¤ãŒä¸€è‡´ã—ãªã‘れã°ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã¯ç„¡åйã«ãªã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚ + ã“ã†ã™ã‚‹ãŸã‚ã«ã¯é€†å¼•ã DNS ãŒé©åˆ‡ã«è¨­å®šã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ + (FTP サーãƒã‚„ TCP ラッパーã®ãŠã‹ã’ã§ã€ŒäºŒé‡é€†å¼•ãã€DNS ã¯ä¸€èˆ¬çš„ã« + ãªã£ã¦ã„ã¾ã™ã®ã§ã€ç®¡ç†è€…ã«ã¯ãŠé¦´æŸ“ã¿ã‚‚ã®ã§ã—ょã†)。

    + +

    IP アドレスãŒä½¿ç”¨ã•れã¦ã„ãªã㦠DNS ãŒå¤±æ•—ã—ãŸå ´åˆã¯ã€ + ã©ã†ã—ã¦ã‚‚ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã‚¦ã‚§ãƒ–サーãƒã‚’信頼性を確ä¿ã—㦠+ èµ·å‹•ã•ã›ã‚‹ã“ã¨ã¯ä¸å¯èƒ½ã®ã‚ˆã†ã§ã™ã€‚ + 設定ã®ä¸€éƒ¨ã‚’無効ã«ã™ã‚‹ã¨ã„ã†ã‚ˆã†ãªéƒ¨åˆ†çš„ãªè§£æ±ºã§ã¯ã€ + サーãƒãŒä½•ã‚’ã™ã‚‹ã‚ˆã†ã«ã™ã‚‹ã‹ã«ã‚‚よりã¾ã™ãŒã€ + ãã®ã‚µãƒ¼ãƒãŒèµ·å‹•ã—ãªã„ã‚ˆã‚Šç¢ºå®Ÿã«æ‚ªã„状æ³ã«ãªã‚‹ã§ã—ょã†ã€‚

    + +

    HTTP/1.1 ãŒé–‹ç™ºã•れã€ãƒ–ラウザやプロキシ㌠Host + ヘッダを発行ã™ã‚‹ã‚ˆã†ã«ãªã£ãŸã®ã§ã€IP ベースã®ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã‚’ + å…¨ã使用ã—ãªãã¦ã‚‚済むよã†ã«ãªã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 + ã“ã®å ´åˆã€ã‚¦ã‚§ãƒ–サーãƒã¯è¨­å®šä¸­ã« DNS å‚ç…§ã‚’ã—ãªãã¦ã‚‚済ã¿ã¾ã™ã€‚ + ã—ã‹ã— 1997 å¹´ 3 月時点ã®çжæ³ã§ã¯ã€ + 商用レベルã®ã‚¦ã‚§ãƒ–サーãƒã§ä½¿ç”¨ã§ãã‚‹ã»ã©ã«ã¯ã€ + ã“ã‚Œã‚‰ã®æ©Ÿèƒ½ã¯åºƒã開発ãŒé€²ã‚“ã§ã„ã¾ã›ã‚“。

    +
    +
    +

    翻訳済ã¿è¨€èªž:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/dns-caveats.html.ko.euc-kr b/docs/manual/dns-caveats.html.ko.euc-kr new file mode 100644 index 0000000..174014a --- /dev/null +++ b/docs/manual/dns-caveats.html.ko.euc-kr @@ -0,0 +1,253 @@ + + + + + +DNS¿Í ¾ÆÆÄÄ¡¿Í °ü·ÃµÈ »çÇ× - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    DNS¿Í ¾ÆÆÄÄ¡¿Í °ü·ÃµÈ »çÇ×

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + +

    ÀÌ ¹®¼­¸¦ ÇÑ ¹®ÀåÀ¸·Î ¿ä¾àÇÒ ¼ö ÀÖ´Ù. ¾ÆÆÄÄ¡°¡ ¼³Á¤ÆÄÀÏÀ» + ÀÐÀ»¶§ DNS¸¦ ÀÇÁ¸ÇÏÁö¾Êµµ·Ï Ç϶ó. ¾ÆÆÄÄ¡°¡ ¼³Á¤ÆÄÀÏÀ» Àдµ¥ + DNS°¡ ÇÊ¿äÇÏ´Ù¸é ¼­¹ö´Â ½Å·Ú¼º ¹®Á¦ (½ÃÀÛÀÌ ¾ÈµÉ ¼öµµ ÀÖ´Ù) + ȤÀº ¼­ºñ½º°ÅºÎ °ø°Ý°ú (»ç¿ëÀÚ°¡ ´Ù¸¥ »ç¿ëÀÚ¿¡ ´ëÇÑ Á¢±ÙÀ» + °¡·Îä´Â °ÍÀ» Æ÷ÇÔÇÏ¿©) ¼­ºñ½ºµµµÏ(theft of service) °ø°Ý¿¡ + ½Ã´Þ¸± ¼ö ÀÖ´Ù.

    +
    + +
    top
    +
    +

    °£´ÜÇÑ ¿¹Á¦

    + + +

    + <VirtualHost www.abc.dom>
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    + +

    ¾ÆÆÄÄ¡°¡ Á¤»óÀûÀ¸·Î µ¿ÀÛÇϱâÀ§Çؼ­´Â °¢ °¡»óÈ£½ºÆ®¿¡ + ´ëÇØ µÎ°¡Áö Á¤º¸°¡ Àý´ëÀûÀ¸·Î ÇÊ¿äÇÏ´Ù. ÀÌ Á¤º¸´Â + ServerName°ú ¼­¹ö°¡ + ±â´Ù¸®°í ÀÀ´äÇÒ ÃÖ¼Ò ÇѰ³ÀÇ IP ÁÖ¼ÒÀÌ´Ù. ÀÌ ¿¹´Â IP ÁÖ¼Ò°¡ + ¾ø±â¶§¹®¿¡, ¾ÆÆÄÄ¡´Â DNS¸¦ »ç¿ëÇÏ¿© www.abc.domÀÇ + ÁÖ¼Ò¸¦ ã¾Æ¾ß ÇÑ´Ù. ¼­¹ö°¡ ¼³Á¤ÆÄÀÏÀ» ÀÐÀ»¶§ ¾î¶² ÀÌÀ¯¿¡¼­°Ç + DNS¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù¸é °¡»óÈ£½ºÆ®¸¦ ¸¸µé ¼ö ¾ø´Ù. + ÀÌ °¡»óÈ£½ºÆ®´Â ¿äû¿¡ ÀÀ´äÇÒ ¼ö ¾ø´Ù. (¾ÆÆÄÄ¡ 1.2 ÀÌÀü + ¹öÀü¿¡¼­´Â ½ÉÁö¾î ¼­¹ö°¡ ºÎÆÃµµ ¾ÈÇÑ´Ù.)

    + +

    www.abc.domÀÇ ÁÖ¼Ò°¡ 192.0.2.1À̶ó°í °¡Á¤ÇÏÀÚ. + ±×¸®°í ´ÙÀ½ ¼³Á¤À» º¸¶ó:

    + +

    + <VirtualHost 192.0.2.1>
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    + +

    ÀÌÁ¦ ¾ÆÆÄÄ¡´Â ÀÌ °¡»óÈ£½ºÆ®ÀÇ ServerNameÀ» + ã±âÀ§ÇØ ¿ªDNS¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. ¿ªÃ£±â°¡ ½ÇÆÐÇÏ¸é ¾ÆÆÄÄ¡´Â + °¡»óÈ£½ºÆ®¸¦ ºÎºÐÀûÀ¸·Î ²ö´Ù. (¾ÆÆÄÄ¡ 1.2 ÀÌÀü ¹öÀü¿¡¼­´Â + ½ÉÁö¾î ¼­¹ö°¡ ºÎÆÃµµ ¾ÈÇÑ´Ù.) Áï, ÀÌ °æ¿ì À̸§±â¹Ý + °¡»óÈ£½ºÆ®¶ó¸é °¡»óÈ£½ºÆ®´Â ¿ÏÀüÈ÷ µ¿ÀÛÇÏÁö¾Ê°í, ip±â¹ÝÀ̶ó¸é + ´ëºÎºÐ µ¿ÀÛÇÑ´Ù. ±×·¯³ª ¾ÆÆÄÄ¡°¡ ¼­¹ö¸íÀ» Æ÷ÇÔÇÏ¿© ¼­¹öÀÇ + Àüü URLÀ» ¸¸µé¾î¾ß ÇÑ´Ù¸é Á¤»óÀûÀÎ URLÀ» ¸¸µéÁö ¸øÇÑ´Ù.

    + +

    ¾Æ·¡ °æ¿ì ÀÌ µÎ°¡Áö ¹®Á¦°¡ ¾ø´Ù.

    + +

    + <VirtualHost 192.0.2.1>
    + ServerName www.abc.dom
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    +
    top
    +
    +

    ¼­ºñ½º°ÅºÎ (Denial of Service)

    + + +

    (ÃÖ¼ÒÇÑ) µÎ°¡Áö Á¾·ùÀÇ ¼­ºñ½º°ÅºÎ°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. + ¾ÆÆÄÄ¡ 1.2 ÀÌÀü ¹öÀüÀÇ °æ¿ì ¾î¶² °¡»óÈ£½ºÆ®¿¡¼­¶óµµ + À§¿¡¼­ ¸»ÇÑ µÎ DNS °Ë»öÀÌ ½ÇÆÐÇÏ¸é ¼­¹ö°¡ ÄÑÁöÁöµµ ¾Ê´Â´Ù. + DNS°¡ ´ç½ÅÀÇ ±ÇÇÑ ¹ÛÀÇ ¹®Á¦ÀÏ ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î, + abc.domÀÌ °í°´ »çÀÌÆ®ÀÌ°í °í°´ÀÌ ÀÚ½ÅÀÇ DNS¸¦ + °ü¸®ÇÑ´Ù¸é, www.abc.dom ·¹Äڵ带 Áö¿ì±â¸¸ ÇØµµ + (1.2 ÀÌÀü) ¼­¹ö´Â ½ÃÀÛÇÏÁö ¸øÇÑ´Ù.

    + +

    ÈξÀ ´õ ±³È°ÇÑ ¹æ¹ýµµ ÀÖ´Ù. ´ÙÀ½ ¼³Á¤À» »ìÆìº¸ÀÚ:

    + +

    + <VirtualHost www.abc.dom>
    +   ServerAdmin webgirl@abc.dom
    +   DocumentRoot /www/abc
    + </VirtualHost>
    +
    + <VirtualHost www.def.dom>
    +   ServerAdmin webguy@def.dom
    +   DocumentRoot /www/def
    + </VirtualHost> +

    + +

    ´ç½ÅÀÌ www.abc.dom¿¡ 192.0.2.1, + www.def.dom¿¡ 192.0.2.2¸¦ ÇÒ´çÇß´Ù°í ÇÏÀÚ. + ¶Ç, def.domÀº ÀÚü DNS¸¦ »ç¿ëÇÑ´Ù°í °¡Á¤ÇÏÀÚ. + ÀÌ ¼³Á¤°ú ÇÔ²² def.domÀ» abc.domÀ¸·Î + °¡´Â ¸ðµç Åë½ÅÀ» °¡·Îç ¼ö ÀÖ´Â Àå¼Ò¿¡ µÎ¾ú´Ù. ±×·¸´Ù¸é ±×µéÀº + www.def.domÀ» 192.0.2.1·Î ¼³Á¤Çϱ⸸ ÇÏ¸é µÈ´Ù. + ±×µéÀÌ ÀÚü DNS¸¦ »ç¿ëÇϱ⶧¹®¿¡ ´ç½ÅÀº ±×µéÀÌ ¿øÇϴµ¥·Î + www.def.dom ·¹Äڵ带 ¼³Á¤ÇÏ´Â °ÍÀ» ¸·À» ¼ö + ¾ø´Ù.

    + +

    (»ç¿ëÀÚ°¡ http://www.abc.dom/whatever Çü½ÄÀÇ + URLÀ» ÀÔ·ÂÇÏ´Â °æ¿ì¸¦ Æ÷ÇÔÇÏ¿©) 192.0.2.1·Î ¿À´Â ¸ðµç ¿äûÀ» + def.dom °¡»óÈ£½ºÆ®°¡ ¼­ºñ½ºÇÏ°Ô µÈ´Ù. ¿Ö ÀÌ·± + ÀÏÀÌ ÀϾ´ÂÁö ÀÌÇØÇÏ·Á¸é ¾ÆÆÄÄ¡°¡ ¾î¶»°Ô °¡»óÈ£½ºÆ®·Î + ¿À´Â ¿äûÀ» ó¸®ÇÏ´ÂÁö¿¡ ´ëÇÑ ¼³¸íÀÌ ÇÊ¿äÇÏ´Ù. + ¿©±â¿¡ ´ë°­ ¼³¸íµÇÀÖ´Ù.

    +
    top
    +
    +

    "ÁÖ¼­¹ö" ÁÖ¼Ò

    + + +

    ¾ÆÆÄÄ¡ 1.1¿¡¼­ À̸§±â¹Ý + °¡»óÈ£½ºÆ® Áö¿øÀÌ Æ÷ÇԵǾú±â¶§¹®¿¡ ¾ÆÆÄÄ¡´Â À¥¼­¹ö¸¦ + ½ÇÇàÇϴ ȣ½ºÆ®ÀÇ IP ÁÖ¼Ò(µé)¸¦ ¾Ë Çʿ䰡 »ý°å´Ù. ÀÌ ÁÖ¼Ò´Â + (ÀÖ´Ù¸é) Àü¿ª ServerName + ȤÀº C ÇÔ¼ö gethostnameÀ¸·Î (¸í·ÉÇÁ·ÒÇÁÆ®¿¡ + "hostname"À» ÀÔ·ÂÇßÀ»¶§¿Í °°Àº °á°ú) ¾ò´Â´Ù. ±×·¯¸é ÀÌ ÁÖ¼Ò·Î + DNS °Ë»öÀ» ÇÑ´Ù. ÇöÀç ÀÌ °Ë»öÀº ÇÇÇÒ ¼ö ¾ø´Ù.

    + +

    DNS ¼­¹ö°¡ Á׾ ÀÌ °Ë»öÀÌ ½ÇÆÐÇÒ °Í °°´Ù¸é + /etc/hosts¿¡ È£½ºÆ®¸íÀ» Áý¾î³ÖÀ» ¼ö ÀÖ´Ù. + (ÄÄÇ»ÅͰ¡ Á¤»óÀûÀ¸·Î ºÎÆÃµÇ¾ú´Ù¸é ¾Æ¸¶ ÀÌ¹Ì µé¾îÀÖÀ» °ÍÀÌ´Ù.) + ±×¸®°í DNS°¡ ½ÇÆÐÇÏ¸é ¼­¹ö°¡ /etc/hosts¸¦ + »ç¿ëÇÏ´ÂÁö È®ÀÎÇ϶ó. »ç¿ëÇÏ´Â ¿î¿µÃ¼Á¦¿¡ µû¶ó + /etc/resolv.conf ȤÀº /etc/nsswitch.conf¸¦ + ¼öÁ¤ÇÏ¸é µÉ °ÍÀÌ´Ù.

    + +

    ¼­¹ö°¡ ¾î¶² ÀÌÀ¯¿¡¼­°Ç DNS¸¦ °Ë»öÇÏ¸é ¾ÈµÈ´Ù¸é + HOSTRESORDER ȯ°æº¯¼ö¸¦ "local"·Î ¼³Á¤Çϰí + ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. mod_env¸¦ + »ç¿ëÇÏ¿© ȯ°æÀ» º¯°æÇÏÁö ¾Ê´Â´Ù¸é ÀÌ È¯°æº¯¼ö´Â + CGI¿¡µµ ¿µÇâÀ» ÁØ´Ù. ¿î¿µÃ¼Á¦ÀÇ manpage³ª FAQ¸¦ Âü°íÇÏ´Â + °ÍÀÌ ÁÁ´Ù.

    +
    top
    +
    +

    ÀÌ ¹®Á¦¸¦ ÇÇÇϱâÀ§ÇÑ ÆÁ

    + + +
      +
    • + VirtualHost¿¡ IP + ÁÖ¼Ò¸¦ »ç¿ëÇ϶ó +
    • + +
    • + Listen¿¡ + IP ÁÖ¼Ò¸¦ »ç¿ëÇ϶ó +
    • + +
    • + ¸ðµç °¡»óÈ£½ºÆ®´Â ¸í½ÃÀûÀ¸·Î + ServerNameÀ» + °¡Áö°Ô Ç϶ó +
    • + +
    • ¾î¶² ÆäÀÌÁöµµ ¼­ºñ½ºÇÏÁö¾Ê´Â + <VirtualHost _default_:*> ¼­¹ö¸¦ + ¸¸µé¾î¶ó
    • +
    +
    top
    +
    +

    ºÎ·Ï: ¾ÕÀ¸·Î´Â

    + + +

    DNS¿Í °ü·ÃµÈ »óȲÀº ¸Å¿ì ¹Ù¶÷Á÷ÇÏÁö ¸øÇÏ´Ù. ¾ÆÆÄÄ¡ 1.2¿¡¼­ + ¿ì¸®´Â DNS°¡ ½ÇÆÐÇÑ °æ¿ì¿¡µµ ÃÖ¼ÒÇÑ ¼­¹ö°¡ ÄÑÁöµµ·Ï ³ë·ÂÇßÁö¸¸ + °á°ú´Â ³ª»¦´Ù. ¾î·µç ¼³Á¤ÆÄÀÏ¿¡ Á÷Á¢ IP ÁÖ¼Ò¸¦ ¿ä±¸ÇÏ´Â + °ÍÀº ¹øÈ£¸¦ ´Ù½Ã ¼³Á¤ÇؾßÇÒ ¿äÁò ÀÎÅͳݿ¡ ¸Å¿ì ¹Ù¶÷Á÷ÇÏÁö + ¸øÇÏ´Ù.

    + +

    À§¿¡¼­ ¼³¸íÇÑ ¼­ºñ½ºµµµÏ °ø°ÝÀ» ¸·´Â ÇѰ¡Áö ¹æ¹ýÀº °Ë»öÇÑ + IP ÁÖ¼Ò¿¡ ´Ù½Ã ¿ªDNS °Ë»öÀ» ÇÏ¿© µÎ À̸§À» ºñ±³ÇÏ´Â °ÍÀÌ´Ù. + ¼­·Î ´Ù¸¥ °æ¿ì °¡»óÈ£½ºÆ®¸¦ °¡µ¿ÇÏÁö ¾ÊÀ» ¼ö ÀÖ´Ù. ÀÌ ¹æ¹ýÀº + ¿ªDNS°¡ ¿Ã¹Ù·Î ¼³Á¤µÇ¾ß ÇÑ´Ù. (FTP ¼­¹ö³ª TCP wrapper°¡ + "Áߺ¹-¿ª" DNS °Ë»öÀ» ÀÚÁÖ »ç¿ëÇϱ⶧¹®¿¡ ´ëºÎºÐÀÇ °ü¸®ÀÚ¿¡°Ô + Àͼ÷ÇÒ °ÍÀÌ´Ù.)

    + +

    ¾î·µç IP ÁÖ¼Ò¸¦ »ç¿ëÇÏÁö¾ÊÀ¸¸é DNS°¡ ½ÇÆÐÇÑ °æ¿ì °¡»óÈ£½ºÆ® + À¥¼­¹ö¸¦ ¹ÏÀ» ¼ö ÀÖ°Ô ½ÃÀÛÇÒ ¼ö ¾ø´Ù. ¼³Á¤ÀÇ ÀϺθ¦ ¹«½ÃÇÏ´Â + °Í°ú °°Àº ºÎºÐÀûÀÎ ÇØ°áÃ¥Àº À¥¼­¹ö Àüü¸¦ ½ÃÀÛÇÏÁö¾Ê´Â °Íº¸´Ù + ´õ ³ª»Ü ¼öµµ ÀÖ´Ù.

    + +

    HTTP/1.1ÀÌ ³ª¿Ô°í ºê¶ó¿ìÀú¿Í ÇÁ·Ï½Ã°¡ Host + Çì´õ¸¦ º¸³»±â ½ÃÀÛÇßÀ¸¹Ç·Î IP±â¹Ý °¡»óÈ£½ºÆ®¸¦ ¿ÏÀüÈ÷ + »ç¿ëÇÏÁö¾Ê´Â °ÍÀÌ °¡´ÉÇØÁú °ÍÀÌ´Ù. ±×·¯¸é À¥¼­¹ö´Â ¼³Á¤Áß¿¡¼­ + DNS °Ë»öÀ» ÇÒ Çʿ䰡 ¾ø¾îÁø´Ù. ±×·¯³ª 1997³â 3¿ù¿¡´Â Áß¿äÇÑ + À¥¼­¹ö¿¡ Æ÷ÇÔÇÒ Á¤µµ·Î À̸§±â¹Ý °¡»óÈ£½ºÆ®°¡ ³Î¸® »ç¿ëµÇÁö + ¾Ê¾Ò´Ù.

    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/dns-caveats.html.tr.utf8 b/docs/manual/dns-caveats.html.tr.utf8 new file mode 100644 index 0000000..882f95b --- /dev/null +++ b/docs/manual/dns-caveats.html.tr.utf8 @@ -0,0 +1,207 @@ + + + + + +Apache HTTP Sunucusu ve DNS ile ilgili Konular - Apache HTTP Sunucusu Sürüm 2.4 + + + + + + + +
    <-
    +

    Apache HTTP Sunucusu ve DNS ile ilgili Konular

    +
    +

    Mevcut Diller:  en  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Bu sayfanın konusu şöyle özetlenebilirdi: Yapılandırma dosyalarınızda + DNS sorguları yapılmasını gerektirecek ayarlamalardan kaçınınız. Eğer + yapılandırma dosyalarınızda DNS sorgusu yapılarak çözümlenebilecek + adresler bulunursa sunucunuz beklenmedik davranışlar (hiç + başlamayabilir) gösterebileceği gibi hizmet reddi veya hizmet + hırsızlığı (bazı sanal konakların diğerlerine giden sayfaları çalma + olasılığı dahil) saldırılarına açık hale gelebilir.

    +
    + +
    top
    +
    +

    Basit Bir Örnek

    + + +
    # Bu yetersiz bir yapılandırma örneğidir, sunucunuzda kullanmayın.
    +<VirtualHost falan.fesmekan.dom>
    +  ServerAdmin filanca@fesmekan.dom
    +  DocumentRoot "/siteler/fesmekan"
    +</VirtualHost>
    + + +

    httpd’nin beklendiği gibi işlemesi için her sanal konak için iki + veriye mutlaka ihtiyacı vardır: ServerName ve sunucunun bağlantı kabul edip hizmet + sunacağı en az bir IP adresi. Yukarıdaki örnekte IP adresi + bulunmamaktadır, dolayısıyla Apache, falan.fesmekan.dom + adresi için bir DNS sorgusu yapmak zorundadır. Eğer sunucu, + yapılandırma dosyasını çözümlediği sırada bir sebeple DNS sunucusuna + erişemezse bu sanal konak yapılandırılmayacak ve bu sanal konağa + yapılan isteklere yanıt verilemeyecektir.

    + +

    falan.fesmekan.dom’un 192.168.2.1 IP adresine sahip + olduğunu varsayarsak yapılandırma şöyle olurdu:

    + +
    # Bu yetersiz bir yapılandırma örneğidir, sunucunuzda kullanmayın.
    +<VirtualHost 192.168.2.1>
    +  ServerAdmin filanca@fesmekan.dom
    +  DocumentRoot "/siteler/fesmekan"
    +</VirtualHost>
    + + +

    Ancak, bu sefer de bu sanal konağın sunucu ismini öğrenmek için + httpd’nin bir ters DNS sorgusu yapması gerekecektir. Eğer bu sorgu + başarısız olursa kısmi bir yapılandırmaya gidilir. + Eğer sanal konak isme dayalı ise sanal konak + kısmen bile yapılandırılmaz. IP’ye dayalı sanal konaklar büyük oranda + çalışır, fakat (örneğin, bir Redirect varlığında olduğu gibi) sunucu ismini + içeren tam bir adres üretilmesini gerektiren bir durumda, sunucu geçerli + bir adres üretemez.

    + +

    Her iki sorunu da çözen yapılandırma şöyle olurdu:

    + +
    <VirtualHost 192.168.2.1>
    +  ServerName falan.fesmekan.dom
    +  ServerAdmin filanca@fesmekan.dom
    +  DocumentRoot "/siteler/fesmekan"
    +</VirtualHost>
    + +
    top
    +
    +

    Hizmet Reddi

    + + +

    Şöyle bir yapılandırmanız olsun:

    + +
    <VirtualHost falan.fesmekan.dom>
    +  ServerAdmin filanca@fesmekan.dom
    +  DocumentRoot "/siteler/fesmekan"
    +</VirtualHost>
    +
    +<VirtualHost misal.mesela.dom>
    +  ServerAdmin falanca@mesela.dom
    +  DocumentRoot "/siteler/mesela"
    +</VirtualHost>
    + + +

    falan.fesmekan.dom’a 192.168.2.1, + misal.mesela.dom’a 192.168.2.2 atadığınızı fakat, + mesela.dom’un DNS kaydının sizin denetiminizde olmadığını + varsayalım. Bu yapılandırmayla, mesela.dom’u + fesmekan.dom’a giden tüm trafiği çalabilecek duruma + getirirsiniz. Bunu gerçekleştirmek için DNS kaydında + misal.mesela.dom’a 192.168.2.1 adresinin atanması + yeterlidir. Kendi DNS’lerine sahip olduklarından dolayı + misal.mesela.dom’a istedikleri IP adresini atamaktan + onları alıkoyamazsınız.

    + +

    192.168.2.1’e gelen isteklerin hepsine + (http://falan.fesmekan.dom/biryer şeklinde yazılan + adresler dahil) mesela.dom sanal konağınca hizmet + sunulacaktır. Apache’nin gelen istekleri sunduğu sanal konaklarla nasıl + eşleştirdiğini bilirseniz bunun sebebini kolayca anlarsınız. Bunu + kabataslak açıklayan bir belgemiz + mevcuttur.

    +
    top
    +
    +

    "Ana Sunucu" Adresi

    + + +

    İsme dayalı sanal konak + desteği, httpd’nin çalıştığı makinenin IP adres(ler)ini de bilmesini + gerektirir. Bu adresi elde etmek için sunucu, ya sunucu genelinde geçerli + ServerName yönergesine bakar ya da bir + C işlevi olan gethostname’i kullanır (işlev, komut + isteminden hostname komutuna dönen yanıtın aynısını + döndürür) ve ardından bu adresle ilgili olarak bir DNS sorgusu yapar. + Bu sorgudan kaçınmanın henüz bir yolu yoktur.

    + +

    Eğer bu sorgunun (DNS sunucusunun çökmüş olması gibi bir nedenle) + başarısız olabileceğinden korkuyorsanız, makine ismini ve IP adresini + /etc/hosts dosyanıza yazabilirsiniz (Makinenizin düzgün + olarak açılabilmesi için zaten bu kaydı yapmış olmanız gerekir). + Kullandığınız işletim sistemine bağlı olarak bu kaydın + /etc/resolv.conf veya /etc/nsswitch.conf + dosyasında bulunması gerekebilir.

    + +

    Herhangi bir nedenle sunucunuz bir DNS sorgusu yapmıyorsa veya + yapmamalıysa, httpd’yi HOSTRESORDER ortam değişkenine + "local" değerini atadıktan sonra çalıştırabilirsiniz. Bu + tamamen işletim sistemine ve kullandığınız çözümleyici kütüphanelere + bağlıdır. Ayrıca, ortamı denetlemek için mod_env + kullanmıyorsanız, CGI’ler de bundan etkilenir. En iyisi işletim + sisteminizin SSS belgelerini ve kılavuz sayfalarını okumaktır.

    +
    top
    +
    +

    Bu Sorunlardan Kaçınmak için İpuçları

    + + +
      +
    • VirtualHost yönergelerinizde + IP adresleri kullanınız.
    • + +
    • Listen yönergelerinizde + IP adresleri kullanınız.
    • + +
    • Tüm sanal konakların ayrı birer ServerName yönergesi olsun.
    • + +
    • Hiçbir sayfa sunulmayan bir <VirtualHost + _default_:*> sanal konağınız olsun.
    • +
    +
    +
    +

    Mevcut Diller:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Yorumlar

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/dso.html b/docs/manual/dso.html new file mode 100644 index 0000000..ea80dcf --- /dev/null +++ b/docs/manual/dso.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: dso.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: dso.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: dso.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: dso.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: dso.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/dso.html.en b/docs/manual/dso.html.en new file mode 100644 index 0000000..3d54d96 --- /dev/null +++ b/docs/manual/dso.html.en @@ -0,0 +1,332 @@ + + + + + +Dynamic Shared Object (DSO) Support - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Dynamic Shared Object (DSO) Support

    +
    +

    Available Languages:  en  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    The Apache HTTP Server is a modular program where the + administrator can choose the functionality to include in the + server by selecting a set of modules. + Modules will be compiled as Dynamic Shared Objects (DSOs) + that exist separately from the main httpd + binary file. DSO modules may be compiled at the time the server + is built, or they may be compiled and added at a later time + using the Apache Extension Tool (apxs).

    +

    Alternatively, the modules can be statically compiled into + the httpd binary when the server is built.

    + +

    This document describes how to use DSO modules as well as + the theory behind their use.

    +
    + +
    top
    +
    +

    Implementation

    + + + +

    The DSO support for loading individual Apache httpd modules is based + on a module named mod_so which must be statically + compiled into the Apache httpd core. It is the only module besides + core which cannot be put into a DSO + itself. Practically all other distributed Apache httpd modules will then + be placed into a DSO. After a module is compiled into a DSO named + mod_foo.so you can use mod_so's LoadModule directive in your + httpd.conf file to load this module at server startup + or restart.

    +

    The DSO builds for individual modules can be disabled via + configure's --enable-mods-static + option as discussed in the install + documentation.

    + +

    To simplify this creation of DSO files for Apache httpd modules + (especially for third-party modules) a support program + named apxs (APache + eXtenSion) is available. It can be used to build DSO based + modules outside of the Apache httpd source tree. The idea is + simple: When installing Apache HTTP Server the configure's + make install procedure installs the Apache httpd C + header files and puts the platform-dependent compiler and + linker flags for building DSO files into the apxs + program. This way the user can use apxs to compile + his Apache httpd module sources without the Apache httpd distribution + source tree and without having to fiddle with the + platform-dependent compiler and linker flags for DSO + support.

    +
    top
    +
    +

    Usage Summary

    + +

    To give you an overview of the DSO features of Apache HTTP Server 2.x, + here is a short and concise summary:

    + +
      +
    1. +

      Build and install a distributed Apache httpd module, say + mod_foo.c, into its own DSO + mod_foo.so:

      + +

      +$ ./configure --prefix=/path/to/install --enable-foo
      +$ make install +

      +
    2. + +
    3. +

      Configure Apache HTTP Server with all modules enabled. Only a basic + set will be loaded during server startup. You can change the set of loaded + modules by activating or deactivating the LoadModule directives in + httpd.conf.

      + +

      +$ ./configure --enable-mods-shared=all
      +$ make install +

      +
    4. + +
    5. +

      Some modules are only useful for developers and will not be build. + when using the module set all. To build all available modules + including developer modules use reallyall. In addition the + LoadModule directives for all + built modules can be activated via the configure option + --enable-load-all-modules.

      + +

      +$ ./configure --enable-mods-shared=reallyall --enable-load-all-modules
      +$ make install +

      +
    6. + +
    7. + Build and install a third-party Apache httpd module, say + mod_foo.c, into its own DSO + mod_foo.so outside of the Apache httpd + source tree using apxs: + +

      +$ cd /path/to/3rdparty
      +$ apxs -cia mod_foo.c +

      +
    8. +
    + +

    In all cases, once the shared module is compiled, you must + use a LoadModule + directive in httpd.conf to tell Apache httpd to activate + the module.

    + +

    See the apxs documentation for more details.

    +
    top
    +
    +

    Background

    + +

    On modern Unix derivatives there exists a mechanism + called dynamic linking/loading of Dynamic Shared + Objects (DSO) which provides a way to build a piece of + program code in a special format for loading it at run-time + into the address space of an executable program.

    + +

    This loading can usually be done in two ways: automatically + by a system program called ld.so when an + executable program is started or manually from within the + executing program via a programmatic system interface to the + Unix loader through the system calls + dlopen()/dlsym().

    + +

    In the first way the DSO's are usually called shared + libraries or DSO libraries and named + libfoo.so or libfoo.so.1.2. They + reside in a system directory (usually /usr/lib) + and the link to the executable program is established at + build-time by specifying -lfoo to the linker + command. This hard-codes library references into the executable + program file so that at start-time the Unix loader is able to + locate libfoo.so in /usr/lib, in + paths hard-coded via linker-options like -R or in + paths configured via the environment variable + LD_LIBRARY_PATH. It then resolves any (yet + unresolved) symbols in the executable program which are + available in the DSO.

    + +

    Symbols in the executable program are usually not referenced + by the DSO (because it's a reusable library of general code) + and hence no further resolving has to be done. The executable + program has no need to do anything on its own to use the + symbols from the DSO because the complete resolving is done by + the Unix loader. (In fact, the code to invoke + ld.so is part of the run-time startup code which + is linked into every executable program which has been bound + non-static). The advantage of dynamic loading of common library + code is obvious: the library code needs to be stored only once, + in a system library like libc.so, saving disk + space for every program.

    + +

    In the second way the DSO's are usually called shared + objects or DSO files and can be named with an + arbitrary extension (although the canonical name is + foo.so). These files usually stay inside a + program-specific directory and there is no automatically + established link to the executable program where they are used. + Instead the executable program manually loads the DSO at + run-time into its address space via dlopen(). At + this time no resolving of symbols from the DSO for the + executable program is done. But instead the Unix loader + automatically resolves any (yet unresolved) symbols in the DSO + from the set of symbols exported by the executable program and + its already loaded DSO libraries (especially all symbols from + the ubiquitous libc.so). This way the DSO gets + knowledge of the executable program's symbol set as if it had + been statically linked with it in the first place.

    + +

    Finally, to take advantage of the DSO's API the executable + program has to resolve particular symbols from the DSO via + dlsym() for later use inside dispatch tables + etc. In other words: The executable program has to + manually resolve every symbol it needs to be able to use it. + The advantage of such a mechanism is that optional program + parts need not be loaded (and thus do not spend memory) until + they are needed by the program in question. When required, + these program parts can be loaded dynamically to extend the + base program's functionality.

    + +

    Although this DSO mechanism sounds straightforward there is + at least one difficult step here: The resolving of symbols from + the executable program for the DSO when using a DSO to extend a + program (the second way). Why? Because "reverse resolving" DSO + symbols from the executable program's symbol set is against the + library design (where the library has no knowledge about the + programs it is used by) and is neither available under all + platforms nor standardized. In practice the executable + program's global symbols are often not re-exported and thus not + available for use in a DSO. Finding a way to force the linker + to export all global symbols is the main problem one has to + solve when using DSO for extending a program at run-time.

    + +

    The shared library approach is the typical one, because it + is what the DSO mechanism was designed for, hence it is used + for nearly all types of libraries the operating system + provides.

    + +
    top
    +
    +

    Advantages and Disadvantages

    + +

    The above DSO based features have the following + advantages:

    + +
      +
    • The server package is more flexible at run-time because + the server process can be assembled at run-time via + LoadModule + httpd.conf configuration directives instead of + configure options at build-time. For instance, + this way one is able to run different server instances + (standard & SSL version, minimalistic & dynamic + version [mod_perl, mod_php], etc.) with only one Apache httpd + installation.
    • + +
    • The server package can be easily extended with + third-party modules even after installation. This is + a great benefit for vendor package maintainers, who can create + an Apache httpd core package and additional packages containing + extensions like PHP, mod_perl, mod_security, etc.
    • + +
    • Easier Apache httpd module prototyping, because with the + DSO/apxs pair you can both work outside the + Apache httpd source tree and only need an apxs -i + command followed by an apachectl restart to + bring a new version of your currently developed module into + the running Apache HTTP Server.
    • +
    + +

    DSO has the following disadvantages:

    + +
      +
    • The server is approximately 20% slower at startup time + because of the symbol resolving overhead the Unix loader now + has to do.
    • + +
    • The server is approximately 5% slower at execution time + under some platforms, because position independent code (PIC) + sometimes needs complicated assembler tricks for relative + addressing, which are not necessarily as fast as absolute + addressing.
    • + +
    • Because DSO modules cannot be linked against other + DSO-based libraries (ld -lfoo) on all platforms + (for instance a.out-based platforms usually don't provide + this functionality while ELF-based platforms do) you cannot + use the DSO mechanism for all types of modules. Or in other + words, modules compiled as DSO files are restricted to only + use symbols from the Apache httpd core, from the C library + (libc) and all other dynamic or static libraries + used by the Apache httpd core, or from static library archives + (libfoo.a) containing position independent code. + The only chances to use other code is to either make sure the + httpd core itself already contains a reference to it or + loading the code yourself via dlopen().
    • +
    + +
    +
    +

    Available Languages:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/dso.html.fr.utf8 b/docs/manual/dso.html.fr.utf8 new file mode 100644 index 0000000..ec6a4c3 --- /dev/null +++ b/docs/manual/dso.html.fr.utf8 @@ -0,0 +1,356 @@ + + + + + +Prise en charge des objets dynamiques partagés (DSO) - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Prise en charge des objets dynamiques partagés (DSO)

    +
    +

    Langues Disponibles:  en  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    La conception modulaire du serveur HTTP Apache permet à l'administrateur + de choisir les fonctionnalités à inclure dans le serveur en sélectionnant + un certain nombre de modules. Les modules seront compilés en tant + qu'Objets Dynamiques Partagés (Dynamic Shared Objects ou DSOs) + qui mènent une existence séparée du fichier binaire principal + httpd. Les modules DSO peuvent être compilés en + même temps que le serveur, ou compilés et ajoutés ultérieurement via + l'Outil des Extensions à Apache (Apache Extension Tool ou + apxs).

    +

    Les modules peuvent aussi être intégrés statiquement dans le + binaire httpd lors de la compilation de ce + dernier.

    + +

    Ce document décrit l'utilisation des modules DSO ainsi que les dessous + de leur fonctionnement.

    +
    + +
    top
    +
    +

    Implémentation

    + + + +

    La prise en charge de DSO pour le chargement de modules individuels d'Apache + httpd est + assuré par un module nommé mod_so qui doit être compilé + statiquement dans le coeur d'Apache httpd. Il s'agit du seul module avec le + module core à ne pas pouvoir être compilé en tant que + module DSO lui-même. Pratiquement tous les autres modules d'Apache httpd + distribués seront alors compilés en tant que modules DSO. Une fois + compilé en tant que module DSO nommé mod_foo.so, un + module peut être chargé en mémoire au + démarrage ou redémarrage du serveur à l'aide de + la directive LoadModule du module + mod_so placée + dans votre fichier httpd.conf.

    +

    La compilation en mode DSO peut être désactivée pour certains + modules via l'option --enable-mods-static du script + configure, comme expliqué dans la Documentation sur l'installation.

    + +

    Un utilitaire permet de simplifier la création de + fichiers DSO pour les modules d'Apache httpd + (particulièrement pour les modules tiers) ; il s'agit du programme nommé + apxs (APache + eXtenSion). On peut l'utiliser pour construire des modules de type + DSO en dehors de l'arborescence des sources d'Apache httpd. L'idée est + simple : à l'installation du serveur HTTP Apache, la procédure make install + du script configure installe les fichiers d'en-têtes + d'Apache httpd et positionne, pour la plateforme de compilation, les drapeaux du compilateur et de + l'éditeur de liens à l'intérieur du programme + apxs qui sera utilisé pour la construction de fichiers DSO. + Il est ainsi possible d'utiliser le programme apxs + pour compiler ses sources de modules Apache httpd sans avoir besoin de + l'arborescence des sources de la distribution d'Apache, et sans avoir à + régler les drapeaux du compilateur et de l'éditeur de liens pour la prise en charge de DSO.

    +
    top
    +
    +

    Mode d'emploi succinct

    + +

    Afin que vous puissiez vous faire une idée des fonctionnalités DSO + du serveur HTTP Apache 2.x, en voici un résumé court et concis :

    + +
      +
    1. +

      Construire et installer un module Apache httpd faisant partie de la + distribution, par exemple mod_foo.c, + en tant que module DSO mod_foo.so :

      + +

      +$ ./configure --prefix=/chemin/vers/installation --enable-foo
      +$ make install +

      +
    2. + +
    3. +

      Configurer le serveur HTTP Apache avec tous les modules + activés. Seul un jeu de modules de base sera chargé au + démarrage du serveur. Vous pouvez modifier ce jeu de modules + chargés au démarrage en activant ou désactivant les directives LoadModule correspondantes dans le + fichier httpd.conf.

      + +

      +$ ./configure --enable-mods-shared=all
      +$ make install +

      + +

      L'argument most de l'option + --enable-modules indique que tous les modules + non-expérimentaux ou qui ne sont pas là à titre d'exemple seront + compilés.

      +
    4. + +
    5. +

      Certains modules ne sont utilisés que par les développeurs et + ne seront pas compilés. Si vous voulez les utiliser, spécifiez + l'option all. Pour compiler tous les modules disponibles, + y compris les modules de développeurs, spécifiez l'option + reallyall. En outre, la directive LoadModule peut être activée pour tous + les modules compilés via l'option du script configure + --enable-load-all-modules.

      + +

      +$ ./configure --enable-mods-shared=reallyall --enable-load-all-modules
      +$ make install +

      +
    6. + +
    7. + Construire et installer un module Apache httpd tiers, par exemple + mod_foo.c, en tant que module DSO + mod_foo.so en dehors de l'arborescence des sources + d'Apache httpd à l'aide du programme apxs : + +

      +$ cd /chemin/vers/module_tiers
      +$ apxs -cia mod_foo.c +

      +
    8. +
    + +

    Dans tous les cas, une fois le module partagé compilé, vous devez + ajouter une directive LoadModule + dans le fichier httpd.conf pour qu'Apache httpd active le module.

    + +

    Voir la documentation sur apxs + pour plus de détails.

    +
    top
    +
    +

    Les dessous du fonctionnement des DSO

    + +

    Les clones modernes d'UNIX proposent un mécanisme + appelé édition de liens et chargement dynamiques d' + Objets Dynamiques Partagés (DSO), qui permet de construire un + morceau de programme dans un format spécial pour le rendre chargeable + à l'exécution dans l'espace d'adressage d'un programme exécutable.

    + +

    Ce chargement peut s'effectuer de deux manières : automatiquement par + un programme système appelé ld.so quand un programme + exécutable est démarré, ou manuellement à partir du programme en cours + d'exécution à l’aide de sa propre interface système vers le chargeur Unix à l'aide + des appels système dlopen()/dlsym().

    + +

    Dans la première méthode, les DSO sont en général appelés + bibliothèques partagées ou encore bibliothèques DSO, et + possèdent des noms du style + libfoo.so ou libfoo.so.1.2. Ils résident dans un + répertoire système (en général /usr/lib) + et le lien avec le programme exécutable est établi à la compilation en + ajoutant -lfoo à la commande de l'éditeur de liens. Les + références à la bibliothèque sont ainsi codées en dur dans le fichier du + programme exécutable de façon qu'au démarrage du programme, le + chargeur Unix soit capable de localiser libfoo.so dans + /usr/lib, dans des chemins codés en dur à l'aide d'options de + l'éditeur de liens comme -R ou dans des chemins définis par la + variable d'environnement + LD_LIBRARY_PATH. Le chargeur peut dès lors résoudre tous les symboles + (jusque là non encore résolus) du DSO dans le programme exécutable.

    + +

    Les symboles du programme exécutable ne sont en général pas + référencés par le DSO (car c'est une bibliothèque de code à usage général + et réutilisable), + et ainsi aucune résolution supplémentaire n'est nécessaire. De son côté, + le programme exécutable ne doit accomplir aucune action particulière + pour utiliser les + symboles du DSO car toutes les résolutions sont effectuées par le chargeur + Unix. En fait, le code permettant d'invoquer + ld.so fait partie du code de démarrage pour l'exécution qui + est lié dans tout programme exécutable non statiquement lié. + L'avantage du chargement dynamique du code d'une bibliothèque partagée est + évident : le code de la bibliothèque ne doit être stocké qu'une seule fois + dans une bibliothèque système telle que libc.so, ce qui permet + d'économiser de l'espace disque pour les autres programmes.

    + +

    Dans la seconde méthode, les DSO sont en général appelés objets + partagés ou fichiers DSO, et peuvent être nommés avec + l'extension de son choix (bien que le nom conseillé soit du style + foo.so). Ces fichiers résident en général dans un répertoire + spécifique à un programme, et aucun lien n'est automatiquement établi avec + le programme exécutable dans lequel ils sont utilisés. + Le programme exécutable charge manuellement le DSO à l'exécution dans son + espace d'adressage à l'aide de l'appel système dlopen(). + A ce moment, aucune résolution de symboles du DSO n'est effectuée pour le + programme exécutable. Par contre le chargeur Unix + résoud automatiquement tout symbole du DSO (non encore résolu) + faisant partie de l'ensemble de symboles exporté par le programme + exécutable et ses bibliothèques DSO déjà chargées (et en particulier tous + les symboles de la bibliothèque à tout faire libc.so). + De cette façon, le DSO prend connaissance de l'ensemble de symboles du + programme exécutable comme s'il avait été lié statiquement avec lui + auparavant.

    + +

    Finalement, pour tirer profit de l'API des DSO, le programme exécutable + doit résoudre certains symboles du DSO à l'aide de l'appel système + dlsym() pour une utilisation ultérieure dans les tables de + distribution, etc. En d'autres termes, le programme exécutable doit + résoudre manuellement tous les symboles dont il a besoin pour pouvoir les + utiliser. + Avantage d'un tel mécanisme : les modules optionnels du programme n'ont pas + besoin d'être chargés (et ne gaspillent donc pas de ressources mémoire) + tant qu'il ne sont pas nécessaires au programme en question. Si nécessaire, + ces modules peuvent être chargés dynamiquement afin d'étendre les + fonctionnalités de base du programme.

    + +

    Bien que ce mécanisme DSO paraisse évident, il comporte au moins une + étape difficile : la résolution des symboles depuis le programme exécutable + pour le DSO lorsqu'on utilise un DSO pour étendre les fonctionnalités d'un + programme (la seconde méthode). Pourquoi ? Parce que la « résolution + inverse Â» des symboles DSO à partir du jeu de symboles du programme + exécutable dépend de la conception de la bibliothèque (la bibliothèque n'a + aucune information sur le programme qui l'utilise) et n'est ni standardisée + ni disponible sur toutes les plateformes. En pratique, les symboles globaux + du programme exécutable ne sont en général pas réexportés et donc + indisponibles pour l'utilisation dans un DSO. Trouver une méthode pour + forcer l'éditeur de liens à exporter tous les symboles globaux est le + principal problème que l'on doit résoudre lorsqu'on utilise un DSO pour + étendre les fonctionnalités d'un programme au moment de son exécution.

    + +

    L'approche des bibliothèques partagées est la plus courante, parce que + c'est dans cette optique que le mécanisme DSO a été conçu ; c'est cette + approche qui est ainsi + utilisée par pratiquement tous les types de bibliothèques que fournit le + système d'exploitation.

    + +
    top
    +
    +

    Avantages et inconvénients

    + +

    Les fonctionnalités ci-dessus basées sur les DSO présentent les + avantages suivants :

    + +
      +
    • Le paquetage du serveur est plus flexible à l'exécution car le + processus serveur peut être assemblé à l'exécution via la + directive LoadModule du fichier de + configuration httpd.conf plutôt que par des options du script + configure à la compilation. Par exemple, + on peut ainsi exécuter différentes instances du serveur + (standard et version SSL, version minimale et version dynamique + [mod_perl, mod_php], etc.) à partir d'une seule installation + d'Apache httpd.
    • + +
    • Le paquetage du serveur peut être facilement étendu avec des modules + tiers, même après l'installation. Ceci présente un gros + avantage pour les mainteneurs de paquetages destinés aux distributions, + car ils peuvent créer un paquetage Apache httpd de base, et des paquetages + additionnels contenant des extensions telles que PHP, mod_perl, mod_fastcgi, + etc.
    • + +
    • Une facilité de prototypage des modules Apache httpd, car la paire + DSO/apxs vous permet d'une part de travailler en + dehors de l'arborescence des sources d'Apache httpd, et d'autre part de n'avoir + besoin que de la commande apxs -i + suivie d'un apachectl restart pour introduire une nouvelle + version de votre module fraîchement développé dans le serveur HTTP Apache + en cours d'exécution.
    • +
    + +

    Inconvénients des DSO :

    + +
      +
    • Le serveur est environ 20 % plus lent au démarrage + à cause des résolutions de symboles supplémentaires que le chargeur + Unix doit effectuer.
    • + +
    • Le serveur est environ 5 % plus lent à l'exécution + sur certaines plates-formes, car le code indépendant de la position (PIC) + nécessite parfois des manipulations compliquées en assembleur pour + l'adressage relatif qui ne sont pas toujours aussi rapides que celles + que permet l'adressage absolu.
    • + +
    • Comme les modules DSO ne peuvent pas être liés avec d'autres + bibliothèques basées sur DSO (ld -lfoo) sur toutes les + plates-formes + (par exemple, les plates-formes basées sur a.out ne fournissent en + général pas cette fonctionnalité alors que les plates-formes basées sur + ELF le font), vous ne pouvez pas utiliser le mécanisme DSO pour tous les + types de modules. Ou en d'autres termes, les modules compilés comme + fichiers DSO sont contraints de n'utiliser que les symboles du coeur + d'Apache httpd, de la bibliothèque C + (libc) et toutes autres bibliothèques statiques ou + dynamiques utilisées par le coeur d'Apache httpd, ou d'archives statiques + (libfoo.a) contenant du code indépendant de la + position (PIC). + Il y a deux solutions pour utiliser un autre type de code : soit le + coeur d'Apache httpd contient déjà lui-même une référence au code, soit vous + chargez le code vous-même à l’aide de dlopen().
    • +
    + +
    +
    +

    Langues Disponibles:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/dso.html.ja.utf8 b/docs/manual/dso.html.ja.utf8 new file mode 100644 index 0000000..76c8809 --- /dev/null +++ b/docs/manual/dso.html.ja.utf8 @@ -0,0 +1,330 @@ + + + + + +動的共有オブジェクト (DSO) サãƒãƒ¼ãƒˆ - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    動的共有オブジェクト (DSO) サãƒãƒ¼ãƒˆ

    +
    +

    翻訳済ã¿è¨€èªž:  en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + +

    Apache HTTP サーãƒã¯ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«åŒ–ã•れãŸãƒ—ログラムã§ã€ + 管ç†è€…ãŒãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’é¸æŠžã™ã‚‹ã“ã¨ã§ã‚µãƒ¼ãƒã«çµ„ã¿è¾¼ã‚€æ©Ÿèƒ½ã‚’é¸ã¶ã“ã¨ãŒã§ãã¾ã™ã€‚ + モジュールã¯ã‚µãƒ¼ãƒãŒãƒ“ルドã•れるã¨ãã« httpd ãƒã‚¤ãƒŠãƒªã« + é™çš„ã«çµ„ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã™ã€‚ã‚‚ã—ãã¯ã€httpd ãƒã‚¤ãƒŠãƒªã¨ã¯ + 別ã«å­˜åœ¨ã™ã‚‹å‹•的共有オブジェクト (訳注: Dynamic Shared Object) + (DSO) ã¨ã—ã¦ã‚³ãƒ³ãƒ‘イルã™ã‚‹ã“ã¨ã‚‚ + ã§ãã¾ã™ã€‚DSO モジュールã¯ã‚µãƒ¼ãƒãŒãƒ“ルドã•れるã¨ãã«ã‚³ãƒ³ãƒ‘イルã—ãŸã‚Šã€ + Apache 拡張ツール (apxs) ã‚’ + 使ã£ã¦å¾Œã§ã‚³ãƒ³ãƒ‘イルã—ã¦è¿½åŠ ã—ãŸã‚Šã§ãã¾ã™ã€‚

    + +

    ã“ã®æ–‡æ›¸ã¯ DSO モジュールã®ä½¿ã„æ–¹ã¨ã€ä»•組ã¿ã«ã¤ã„㦠+ 説明ã—ã¾ã™ã€‚

    +
    + +
    top
    +
    +

    実装

    + + + +

    個々㮠Apache モジュールをロードã™ã‚‹ãŸã‚ã® DSO サãƒãƒ¼ãƒˆã¯ + mod_so.c ã¨ã„ã†ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®æ©Ÿèƒ½ã«åŸºã¥ã„ã¦ã„ã¾ã™ã€‚ + ã“ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ« 㯠Apache ã®ã‚³ã‚¢ã«é™çš„ã«çµ„ã¿è¾¼ã¾ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + ãれ㯠core.c 以外ã§ã¯ DSO ã«ã§ããªã„唯一㮠+ モジュールã§ã™ã€‚事実上ã€ä»–ã®ã™ã¹ã¦ã® Apache ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¯ã€ + ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã®æ–‡æ›¸ã§èª¬æ˜Žã•れã¦ã„るよã†ã«ã€ + configure ã® + --enable-module=shared オプションã§ãれãžã‚Œã‚’ + DSO ビルドã«ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€DSO モジュールã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + mod_foo.so ã®ã‚ˆã†ãª DSO ã«ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãŒã‚³ãƒ³ãƒ‘イルã•れれã°ã€ + httpd.conf ファイル中㧠mod_so ã® + LoadModule + ディレクティブを使ã†ã“ã¨ã§ã‚µãƒ¼ãƒã®èµ·å‹•ã‚„å†èµ·å‹•時ã«ã“ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’ + ロードã™ã‚‹ã‚ˆã†ã«ã§ãã¾ã™ã€‚

    + +

    Apache モジュール用㮠(特ã«ã‚µãƒ¼ãƒ‰ãƒ‘ーティモジュールã®) DSO ファイル㮠+ 作æˆã‚’ç°¡å˜ã«ã™ã‚‹ãŸã‚ã«ã€apxs + (APache eXtenSion) ã¨ã„ã†æ–°ã—ã„サãƒãƒ¼ãƒˆãƒ—ログラムãŒã‚りã¾ã™ã€‚ + Apache ã®ã‚½ãƒ¼ã‚¹ãƒ„リーã®å¤–ã§ DSO モジュールをビルドã™ã‚‹ãŸã‚ã« + 使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚発想ã¯å˜ç´”ã§ã™: Apache ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ™‚ã® + configureã€make install ã®ã¨ãã« Apache ã® + C ヘッダをインストールã—ã€DSO ビルド用ã®ãƒ—ラットフォームä¾å­˜ã® + コンパイラã¨ãƒªãƒ³ã‚«ã®ãƒ•ラグを apxs プログラムã«è¿½åŠ ã—ã¾ã™ã€‚ + ã“れã«ã‚ˆã‚Šã€ãƒ¦ãƒ¼ã‚¶ãŒ Apache ã®é…布ソースツリーãªã—ã§ã€ã•ら㫠+ DSO サãƒãƒ¼ãƒˆã®ãŸã‚ã®ãƒ—ラットフォームä¾å­˜ã®ã‚³ãƒ³ãƒ‘イラやリンカ㮠+ フラグをã„ã˜ã‚‹ã“ã¨ãªã Apache ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®ã‚½ãƒ¼ã‚¹ã‚’コンパイル + ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚

    +
    top
    +
    +

    ä½¿ç”¨æ³•ã®æ¦‚è¦

    + +

    Apache 2.x ã® DSO æ©Ÿèƒ½ã®æ¦‚略を知るã“ã¨ãŒã§ãã‚‹ãŸã‚ã®ã€ + 短ãç°¡æ½”ãªæ¦‚è¦ã§ã™:

    + +
      +
    1. + é…布ã•れã¦ã„ã‚‹ Apache モジュールã€ä»®ã« mod_foo.c + ã¨ã—ã¦ã€ãれを DSO mod_foo.so ã«ãƒ“ルドã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«: + +

      +$ ./configure --prefix=/path/to/install --enable-foo=shared
      +$ make install +

      +
    2. + +
    3. + サードパーティ Apache モジュールã€ä»®ã« mod_foo.c + ã¨ã—ã¦ã€ãれを DSO mod_foo.so ã«ãƒ“ルドã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«: + +

      +$ ./configure --add-module=module_type:/path/to/3rdparty/mod_foo.c \
      + + --enable-foo=shared
      +
      +$ make install +

      +
    4. + +
    5. + 共有モジュール㮠後々ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ« ã®ãŸã‚ã« + Apache を設定: + +

      +$ ./configure --enable-so
      +$ make install +

      +
    6. + +
    7. + サードパーティ Apache モジュールã€ä»®ã« mod_foo.c + ã¨ã—ã¦ã€ãれを apxs を使ã£ã¦ + Apache ソースツリーã®å¤–ã§ DSO ã«ãƒ“ルドã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«: + +

      +$ cd /path/to/3rdparty
      +$ apxs -c mod_foo.c
      +$ apxs -i -a -n foo mod_foo.la +

      +
    8. +
    + +

    ã©ã®å ´åˆã«ãŠã„ã¦ã‚‚ã€å…±æœ‰ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’コンパイルã—ãŸå¾Œã§ã€ + httpd.conf ã§ + LoadModule + ディレクティブを使ã£ã¦ Apache ãŒãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’使用ã™ã‚‹ã‚ˆã†ã« + ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。

    +
    top
    +
    +

    背景

    + +

    最近㮠Unix 系㮠OS ã«ã¯ 動的共有オブジェクト (DSO) + ã®å‹•的リンク/ロードã¨ã„ã†æ°—ã®ãã„ãŸæ©Ÿæ§‹ãŒ + 存在ã—ã¾ã™ã€‚ã“れã¯ã€å®Ÿè¡Œæ™‚ã«ãƒ—ログラムã®ã‚¢ãƒ‰ãƒ¬ã‚¹ç©ºé–“ã« + ロードã§ãるよã†ãªç‰¹åˆ¥ãªå½¢å¼ã§ãƒ—ログラムをビルドã™ã‚‹ã“ã¨ã‚’ + å¯èƒ½ã«ã—ã¾ã™ã€‚

    + +

    ã“ã®ãƒ­ãƒ¼ãƒ‰ã¯äºŒã¤ã®æ–¹æ³•ã§è¡Œãªã†ã“ã¨ãŒã§ãã¾ã™: 実行プログラム㌠+ èµ·å‹•ã•れãŸã¨ãã« ld.so ã¨ã„ã†ã‚·ã‚¹ãƒ†ãƒ ãƒ—ログラム + ã«ã‚ˆã‚Šè‡ªå‹•çš„ã«è¡Œãªã‚れる方法ã¨ã€å®Ÿè¡Œãƒ—ログラム中ã‹ã‚‰ã€ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ¼ãƒ« + dlopen()/dlsym() ã«ã‚ˆã‚‹ Unix ローダã¸ã® + プログラムシステムã®ã‚¤ãƒ³ã‚¿ãƒ•ェースを使ã£ã¦æ‰‹å‹•ã§è¡Œãªã†æ–¹æ³•ã¨ãŒ + ã‚りã¾ã™ã€‚

    + +

    最åˆã®æ–¹æ³•ã§ã¯ DSO ã¯æ™®é€šã¯å…±æœ‰ãƒ©ã‚¤ãƒ–ラリや DSO + ライブラリ ã¨å‘¼ã°ã‚Œã¦ã„ã¦ã€DSO ã®åå‰ã¯ + libfoo.so ã‚„ libfoo.so.1.2 ã®ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ + ã“れらã¯ã‚·ã‚¹ãƒ†ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª (通常 /usr/lib) ã«å­˜åœ¨ã—〠+ 実行プログラムã¸ã®ãƒªãƒ³ã‚¯ã¯ãƒ“ルド時㫠-lfoo をリンカ㫠+ 指定ã™ã‚‹ã“ã¨ã§ç¢ºç«‹ã•れã¾ã™ã€‚ã“れã«ã‚ˆã‚Šãƒ©ã‚¤ãƒ–ラリã¸ã®å‚ç…§ãŒå®Ÿè¡Œãƒ—ログラム㮠+ ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¦ã€èµ·å‹•時㫠Unix ã®ãƒ­ãƒ¼ãƒ€ãŒ /usr/lib や〠+ リンカ㮠-R ã®ã‚ˆã†ãªã‚ªãƒ—ションã«ã‚ˆã‚Šãƒãƒ¼ãƒ‰ã‚³ãƒ¼ãƒ‰ã•れãŸãƒ‘ス〠+ 環境変数 LD_LIBRARY_PATH ã«ã‚ˆã‚Šè¨­å®šã•れãŸãƒ‘スã€ã®ä¸­ã‹ã‚‰ + libfoo.so ã®å ´æ‰€ã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãれã‹ã‚‰ã€ + 実行プログラム中㮠(ã¾ã æœªè§£æ±ºã®) シンボルを DSO ã«ã‚るシンボル㧠+ 解決ã—ã¾ã™ã€‚

    + +

    普通ã¯å®Ÿè¡Œãƒ—ログラム中ã®ã‚·ãƒ³ãƒœãƒ«ã¯ DSO ã‹ã‚‰ã¯å‚ç…§ã•れã¾ã›ã‚“ + (DSO ã¯ä¸€èˆ¬çš„ãªã‚³ãƒ¼ãƒ‰ã«ã‚ˆã‚‹å†åˆ©ç”¨å¯èƒ½ãªãƒ©ã‚¤ãƒ–ラリã§ã™ã®ã§)。 + ã§ã™ã‹ã‚‰ã€ã•らãªã‚‹ã‚·ãƒ³ãƒœãƒ«ã®è§£æ±ºã¯å¿…è¦ã‚りã¾ã›ã‚“。 + シンボル㯠Unix ローダã«ã‚ˆã‚Šå®Œå…¨ãªè§£æ±ºãŒè¡Œãªã‚れã¾ã™ã®ã§ã€å®Ÿè¡Œãƒ•ァイル自身㯠+ 何もã™ã‚‹å¿…è¦ãŒã‚りã¾ã›ã‚“。(実際ã®ã¨ã“ã‚ã€é™çš„ã§ãªã„方法ã§ãƒªãƒ³ã‚¯ã•れã¦ã„ã‚‹ + ã™ã¹ã¦ã®å®Ÿè¡Œãƒ—ログラムã«çµ„ã¿è¾¼ã¾ã‚Œã¦ã„る開始用ã®ã‚³ãƒ¼ãƒ‰ã®ä¸€éƒ¨ã« + ld.so ã‚’èµ·å‹•ã™ã‚‹ã‚³ãƒ¼ãƒ‰ãŒå«ã¾ã‚Œã¦ã„ã¾ã™)。よã使ã‚れる + ライブラリã®å‹•的ロードã®åˆ©ç‚¹ã¯æ˜Žã‚‰ã‹ã§ã™ã€‚ライブラリã®ã‚³ãƒ¼ãƒ‰ã¯ + システムライブラリ㫠libc.so ã®ã‚ˆã†ã«ã—ã¦ä¸€åº¦ä¿å­˜ã™ã‚‹ã ã‘ã§ã‚ˆã〠+ プログラムã®ãŸã‚ã«å¿…è¦ãªãƒ‡ã‚£ã‚¹ã‚¯ã®é ˜åŸŸã‚’節約ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    二ã¤ã‚ã®æ–¹æ³•ã§ã¯ DSO ã¯æ™®é€šã¯å…±æœ‰ã‚ªãƒ–ジェクトや + DSO ファイルã¨å‘¼ã°ã‚Œã¦ã„ã¦ã€ä»»æ„ã®æ‹¡å¼µå­ã‚’付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ + (ãŸã ã—ã€æ¨™æº–çš„ãªåå‰ã¯ foo.so ã§ã™)。 + ã“れらã®ãƒ•ァイルã¯é€šå¸¸ã¯ãƒ—ログラム専用ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ç½®ã‹ã‚Œã€ + ã“れらを使ã†å®Ÿè¡Œãƒ—ログラムã¸ã®ãƒªãƒ³ã‚¯ã¯è‡ªå‹•çš„ã«ã¯ã•れã¾ã›ã‚“。 + ã§ã™ã®ã§ã€å®Ÿè¡Œãƒ—ログラム㯠dlopen() を使ã£ã¦ + å®Ÿè¡Œæ™‚ã«æ‰‹å‹•ã§ DSO をプログラムã®ã‚¢ãƒ‰ãƒ¬ã‚¹ç©ºé–“ã«ãƒ­ãƒ¼ãƒ‰ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + ã“ã®æ™‚点ã§ã¯å®Ÿè¡Œãƒ—ログラムã«å¯¾ã—㦠DSO ã®ã‚·ãƒ³ãƒœãƒ«ã®è§£æ±ºã¯è¡Œãªã‚れã¾ã›ã‚“。 + ã—ã‹ã—ã€ãã®ä»£ã‚り㫠Unix ã®ãƒ­ãƒ¼ãƒ€ãŒ DSO ã® (ã¾ã æœªè§£æ±ºã®) シンボルを + 実行プログラムã«ã‚ˆã‚Šã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•れãŸã‚·ãƒ³ãƒœãƒ«ã¨æ—¢ã«ãƒ­ãƒ¼ãƒ‰ã•れ㟠+ DSO ライブラリã«ã‚ˆã‚Šã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•れãŸã‚·ãƒ³ãƒœãƒ« (特ã«ã€ã©ã“ã«ã§ã‚‚ã‚ã‚‹ + libc.so ã®ã™ã¹ã¦ã®ã‚·ãƒ³ãƒœãƒ«) ã§è‡ªå‹•çš„ã«è§£æ±ºã—ã¾ã™ã€‚ + ã“ã†ã™ã‚‹ã“ã¨ã§ã€DSO ã¯æœ€åˆã‹ã‚‰é™çš„ã«ãƒªãƒ³ã‚¯ã•れã¦ã„ãŸã‹ã®ã‚ˆã†ã«ã€ + 実行プログラムã®ã‚·ãƒ³ãƒœãƒ«ã‚’知るã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    最後ã«ã€DSO ã® API を利点を生ã‹ã™ãŸã‚ã«ã€ãƒ—ログラム㯠+ 後ã§ãƒ‡ã‚£ã‚¹ãƒ‘ッãƒãƒ†ãƒ¼ãƒ–ルãªã©ã§ã‚·ãƒ³ãƒœãƒ«ã‚’使ã†ã“ã¨ãŒã§ãるよã†ã«ã€ + dlsym() を使ã£ã¦ã„ãã¤ã‹ã®ã‚·ãƒ³ãƒœãƒ«ã‚’解決ã—ã¾ã™ã€‚ + ã™ãªã‚ã¡: 実行プログラムã¯å¿…è¦ãªã™ã¹ã¦ã®ã‚·ãƒ³ãƒœãƒ«ã‚’手動ã§è§£æ±ºã—ãªã‘れ㰠+ ãªã‚Šã¾ã›ã‚“。ã“ã®æ©Ÿæ§‹ã®åˆ©ç‚¹ã¯ãƒ—ログラムã®ã‚ªãƒ—ショナルãªéƒ¨åˆ†ã¯ + å¿…è¦ã«ãªã‚‹ã¾ã§ãƒ­ãƒ¼ãƒ‰ã™ã‚‹å¿…è¦ãŒãªã„ (ã ã‹ã‚‰ãƒ¡ãƒ¢ãƒªã‚‚消費ã—ãªã„) + ã“ã¨ã§ã™ã€‚å¿…è¦ãªã‚‰ã°ã€åŸºæœ¬ãƒ—ãƒ­ã‚°ãƒ©ãƒ ã®æ©Ÿèƒ½ã‚’æ‹¡å¼µã™ã‚‹ãŸã‚ã« + ã“れらã®éƒ¨åˆ†ã‚’å‹•çš„ã«ãƒ­ãƒ¼ãƒ‰ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    ã“ã® DSO 機構ã¯ç°¡å˜ãªã‚ˆã†ã«è¦‹ãˆã¾ã™ãŒã€å°‘ãªãã¨ã‚‚一ã¤é›£ã—ã„点㌠+ ã‚りã¾ã™: プログラムを拡張ã™ã‚‹ãŸã‚ã« DSO を使ã£ã¦ã„ã‚‹ã¨ãã«ã€ + DSO ãŒå®Ÿè¡Œãƒ—ログラムã‹ã‚‰ã‚·ãƒ³ãƒœãƒ«ã‚’解決ã™ã‚‹ç‚¹ã§ã™ (äºŒç•ªç›®ã®æ–¹æ³•)。 + ã“れã¯ãªãœã§ã—ょã†ã‹ã€‚ãれã¯ã€DSO ã®ã‚·ãƒ³ãƒœãƒ«ã‚’実行プログラム㮠+ シンボルã‹ã‚‰ã€Œé€†è§£æ±ºã€ã™ã‚‹ã¨ã„ã†ã®ã¯ãƒ©ã‚¤ãƒ–ラリã®è¨­è¨ˆ + (ライブラリã¯ãれを使用ã™ã‚‹ãƒ—ログラムã®ã“ã¨ã¯ä½•ã‚‚ + 知らãªã„) ã«åã—ã¦ã„ã¦ã€ã“ã®æ©Ÿèƒ½ã¯ã™ã¹ã¦ã®ãƒ—ラットフォーム㫠+ ã‚ã‚‹ã‚ã‘ã§ã¯ãªãã€æ¨™æº–化もã•れã¦ã„ãªã„ã‹ã‚‰ã§ã™ã€‚ + 実際ã«ã¯å®Ÿè¡Œãƒ—ログラムã®ã‚°ãƒ­ãƒ¼ãƒãƒ«ãªã‚·ãƒ³ãƒœãƒ«ã¯å†ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•れるã“ã¨ã¯ + ã‚ã¾ã‚Šãªãã€DSO ã‹ã‚‰ä½¿ã†ã“ã¨ãŒã§ãã¾ã›ã‚“。リンカã«ã‚°ãƒ­ãƒ¼ãƒãƒ«ã‚·ãƒ³ãƒœãƒ«ã™ã¹ã¦ã‚’ + エクスãƒãƒ¼ãƒˆã™ã‚‹ã‚ˆã†ã«ã•ã›ã‚‹æ–¹æ³•を見ã¤ã‘ã‚‹ã“ã¨ãŒã€å®Ÿè¡Œæ™‚ã«ãƒ—ログラムを + æ‹¡å¼µã™ã‚‹ãŸã‚ã« DSO を使ã†ã¨ãã®ä¸€ç•ªã®å•題ã§ã™ã€‚

    + +

    共有ライブラリã®ã‚¢ãƒ—ローãƒãŒæ™®é€šã®æ–¹æ³•ã§ã™ã€‚DSO 機構ã¯ãã®ãŸã‚ã« + 設計ã•れãŸã‚‚ã®ã§ã™ã‹ã‚‰ã€‚ã—ãŸãŒã£ã¦ã€ãã®æ–¹æ³•ã¯ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ãŒ + æä¾›ã™ã‚‹ã»ã¨ã‚“ã©ã™ã¹ã¦ã®ç¨®é¡žã®ãƒ©ã‚¤ãƒ–ラリã§ä½¿ã‚れã¦ã„ã¾ã™ã€‚ + 一方ã€ãƒ—ãƒ­ã‚°ãƒ©ãƒ ã®æ‹¡å¼µã®ãŸã‚ã«å…±æœ‰ã‚ªãƒ–ジェクトを使用ã™ã‚‹ã€ã¨ã„ã†æ–¹ã¯ + ã‚ã¾ã‚Šä½¿ã‚れã¦ã„ã¾ã›ã‚“。

    + +

    1998 å¹´ã®æ™‚点ã§ã€å®Ÿè¡Œæ™‚ã«å®Ÿéš›ã«æ©Ÿèƒ½æ‹¡å¼µã®ãŸã‚ã« DSO 機構を使ã£ã¦ã„ã‚‹ + ソフトウェアパッケージã¯å°‘ã—ã ã‘ã§ã—ãŸ: Perl 5 (XS 機構㨠DnaLoader モジュール + ã«ã‚ˆã‚‹ã‚‚ã®)ã€Netscape サーãƒãªã©ã§ã™ã€‚Apache ã¯ã™ã§ã« + ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®æ¦‚念を使ã£ã¦æ©Ÿèƒ½æ‹¡å¼µã‚’ã—ã¦ã„ã¦ã€å†…部的ã«ãƒ‡ã‚£ã‚¹ãƒ‘ッãƒãƒªã‚¹ãƒˆã« + 基ã¥ã„ãŸå¤–部モジュール㮠Apache コア機能ã¸ã®ãƒªãƒ³ã‚¯ã‚’行ãªã£ã¦ã„ã¾ã—ãŸã®ã§ã€ + ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 1.3 ã‹ã‚‰ã€Apache ã‚‚ DSO 機構を使ã†ä»²é–“ã«ãªã‚Šã¾ã—ãŸã€‚ + Apache ã¯å®Ÿè¡Œæ™‚ã« DSO を使ã£ã¦ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’ロードã™ã‚‹ã‚ˆã†ã«ã™ã§ã« + é‹å‘½ä»˜ã‘られã¦ã„ãŸã®ã§ã™ã€‚

    +
    top
    +
    +

    åˆ©ç‚¹ã¨æ¬ ç‚¹

    + +

    上記㮠DSO ã«åŸºã¥ã„ãŸæ©Ÿèƒ½ã¯ä»¥ä¸‹ã®åˆ©ç‚¹ãŒã‚りã¾ã™:

    + +
      +
    • 実際ã®ã‚µãƒ¼ãƒãƒ—ロセスを組ã¿ç«‹ã¦ã‚‹ãŸã‚ã«ã€ + ビルド時㫠configure ã®ã‚ªãƒ—ションを使ã†ä»£ã‚り㫠+ 実行時㫠httpd.conf ã®è¨­å®šç”¨ã‚³ãƒžãƒ³ãƒ‰ + LoadModule + を使ã†ã“ã¨ãŒã§ãã¾ã™ã®ã§ã€ã‚µãƒ¼ãƒãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®æŸ”軟性ãŒé«˜ã¾ã‚Šã¾ã—ãŸã€‚ + ãŸã¨ãˆã°ã€ä¸€ã¤ã® Apache ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‹ã‚‰ + é•ã†æ§‹æˆã®ã‚µãƒ¼ãƒ (標準版㨠SSL ç‰ˆã€æœ€å°æ§‹æˆã¨æ‹¡å¼µç‰ˆ [mod_perl, PHP3] + ãªã©) を実行ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
    • + +
    • インストールã®å¾Œã§ã‚ã£ã¦ã‚‚ã€ã‚µãƒ¼ãƒã®ãƒ‘ッケージをサードパーティ + モジュールã§ç°¡å˜ã«æ‹¡å¼µã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ã“れã¯ã€Apache コア + パッケージã¨ã€PHP3, mod_perl, mod_fastcgi ãªã© ã®è¿½åŠ ã® + パッケージを作æˆã§ãã‚‹ã®ã§ã€å°‘ãªãã¨ã‚‚ベンダã®ãƒ‘ッケージ管ç†è€…ã«ã¨ã£ã¦ + 大ããªåˆ©ç‚¹ãŒã‚りã¾ã™ã€‚
    • + +
    • Apache モジュールã®é–‹ç™ºãŒç°¡å˜ã«ãªã‚Šã¾ã™ã€‚ + ã“れ㯠DSO 㨠apxs ã®çµ„ã¿åˆã‚ã›ã«ã‚ˆã‚Šã€Apache ソースツリー㮠+ 外ã§ä½œæ¥­ã§ãã€é–‹ç™ºä¸­ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ + 実行中㮠Apache サーãƒã«çµ„ã¿è¾¼ã‚€ãŸã‚ã« apxs -i 㨠+ apachectl restart を行ãªã†ã ã‘ã§è‰¯ããªã‚‹ã‹ã‚‰ã§ã™ã€‚
    • +
    + +

    DSO ã«ã¯ä»¥ä¸‹ã®æ¬ ç‚¹ãŒã‚りã¾ã™:

    + +
      +
    • ã™ã¹ã¦ã®ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ãŒãƒ—ログラムã®ã‚¢ãƒ‰ãƒ¬ã‚¹ç©ºé–“ã« + コードを動的ロードã™ã‚‹ã“ã¨ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã‚‹ã‚ã§ã¯ãªã„ã®ã§ã€ + プラットフォームã«ã‚ˆã£ã¦ã¯ DSO 機構ã¯ä½¿ãˆã¾ã›ã‚“。
    • + +
    • Unix ã®ãƒ­ãƒ¼ãƒ€ãŒã‚·ãƒ³ãƒœãƒ«ã®è§£æ±ºã‚’ã™ã‚‹å¿…è¦ãŒã§ããŸã®ã§ã€ + ãã®ã‚ªãƒ¼ãƒãƒ˜ãƒƒãƒ‰ã«ã‚ˆã‚Šã‚µãƒ¼ãƒã®èµ·å‹•時間ãŒç´„ 20% é…ããªã£ã¦ã„ã¾ã™ã€‚
    • + +
    • ä½ç½®éžä¾å­˜ã‚³ãƒ¼ãƒ‰ (PIC) (訳注 position independent code) 㯠+ 相対アドレスã®ãŸã‚ã«è¤‡é›‘ãªã‚¢ã‚»ãƒ³ãƒ–ラã®ãƒˆãƒªãƒƒã‚¯ãŒå¿…è¦ãªã“ã¨ãŒã‚り〠+ ãれã¯å¿…ãšã—も絶対アドレスã¨åŒã˜ãらã„ã®é€Ÿåº¦ãŒã§ã‚‹ã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“ã®ã§ã€ + プラットフォームã«ã‚ˆã£ã¦ã¯ã‚µãƒ¼ãƒã®å®Ÿè¡Œé€Ÿåº¦ãŒç´„ 5% é…ããªã‚Šã¾ã™ã€‚
    • + +
    • DSO モジュールã¯ã™ã¹ã¦ã®ãƒ—ラットフォームã§ä»–ã® DSO ã«åŸºã¥ã„㟠+ ライブラリã«å¯¾ã—ã¦ãƒªãƒ³ã‚¯ã§ãã‚‹ (ld -lfoo) + ã¨ã„ã†ã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“ã®ã§ (ãŸã¨ãˆã°ã€a.out ã®ãƒ—ラットフォームã§ã¯ + ã“ã®æ©Ÿèƒ½ã¯ã‚りã¾ã›ã‚“ãŒã€ELF ã®ãƒ—ラットフォームã«ã¯ã‚りã¾ã™)〠+ ã™ã¹ã¦ã®ç¨®é¡žã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã« DSO 機構を使ãˆã‚‹ã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“。 + è¨€ã„æ›ãˆã‚‹ã¨ã€DSO ファイルã¨ã—ã¦ã‚³ãƒ³ãƒ‘イルã•れãŸãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã® + 使ãˆã‚‹ã‚·ãƒ³ãƒœãƒ«ã¯ã€ + Apache ã®ã‚³ã‚¢ã®ã‚·ãƒ³ãƒœãƒ«ã€C ライブラリ (libc) 㨠+ Apache コアãŒä½¿ã£ã¦ã„ã‚‹ä»–ã®ã™ã¹ã¦ã®é™çš„ãªãƒ©ã‚¤ãƒ–ラリã¨å‹•的ライブラリ㮠+ シンボルã€PIC ã«ã‚ˆã‚‹é™çš„ãªãƒ©ã‚¤ãƒ–ラリ (libfoo.a) ã® + シンボルã®ã¿ã«åˆ¶é™ã•れã¾ã™ã€‚ãã®ä»–ã®ã‚³ãƒ¼ãƒ‰ã‚’ä½¿ã†æ–¹æ³•ã¯ã€ + Apache コア自身ãŒã™ã§ã«ãã®ã‚³ãƒ¼ãƒ‰ã¸ã®å‚ç…§ãŒã‚るよã†ã«ã™ã‚‹ã‹ã€ + dlopen () を使ã£ã¦ã‚³ãƒ¼ãƒ‰ã‚’自分自身ã§ãƒ­ãƒ¼ãƒ‰ã™ã‚‹ã‹ã® + ã©ã¡ã‚‰ã‹ã—ã‹ã‚りã¾ã›ã‚“。
    • +
    + +
    +
    +

    翻訳済ã¿è¨€èªž:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/dso.html.ko.euc-kr b/docs/manual/dso.html.ko.euc-kr new file mode 100644 index 0000000..0b1efbe --- /dev/null +++ b/docs/manual/dso.html.ko.euc-kr @@ -0,0 +1,306 @@ + + + + + +µ¿Àû°øÀ¯°´Ã¼ (DSO) Áö¿ø - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    µ¿Àû°øÀ¯°´Ã¼ (DSO) Áö¿ø

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + +

    ¾ÆÆÄÄ¡ À¥¼­¹ö´Â °ü¸®ÀÚ°¡ ¸ðµâµéÀ» ¼±ÅÃÇÏ¿© ¼­¹ö¿¡ Æ÷ÇÔÇÒ + ±â´ÉÀ» °áÁ¤ÇÒ ¼ö ÀÖ´Â ¸ðµâÈ­µÈ ÇÁ·Î±×·¥ÀÌ´Ù. ¼­¹ö¸¦ ÄÄÆÄÇÒ¶§ + httpd ½ÇÇàÆÄÀÏ¿¡ Á¤ÀûÀ¸·Î ¸ðµâÀ» ÄÄÆÄÀÏÇÒ + ¼ö ÀÖ´Ù. ¾Æ´Ï¸é ¸ðµâÀ» httpd ½ÇÇàÆÄÀϰú + ºÐ¸®ÇÏ¿© µ¿Àû°øÀ¯°´Ã¼(Dynamic Shared Objects, DSO)·Î ÄÄÆÄÀÏÇÒ + ¼ö ÀÖ´Ù. DSO ¸ðµâÀº ¼­¹ö¸¦ ÄÄÆÄÀÏÇÒ¶§ ÄÄÆÄÀÏÇϰųª, Apache + Extension Tool (apxs)À» + »ç¿ëÇÏ¿© ³ªÁß¿¡ ÄÄÆÄÀÏÇÏ¿© Ãß°¡ÇÒ ¼ö ÀÖ´Ù.

    + +

    ÀÌ ¹®¼­´Â DSO ¸ðµâ »ç¿ë¹ý°ú ¹è°æ ÀÌ·ÐÀ» ¼³¸íÇÑ´Ù.

    +
    + +
    top
    +
    +

    ±¸Çö

    + + + +

    ¾ÆÆÄÄ¡ Çٽɿ¡ Á¤ÀûÀ¸·Î ÄÄÆÄÀÏÇØ¾ßÇÒ + mod_so.c¶ó´Â ¸ðµâÀº ¾ÆÆÄÄ¡ ¸ðµâÀ» + ÀоîµéÀ̱âÀ§ÇÑ DSO¸¦ Áö¿øÇÑ´Ù. + ÀÌ ¸ðµâÀº core¸¦ Á¦¿ÜÇϰí DSO°¡ + µÉ ¼ö ¾ø´Â À¯ÀÏÇÑ ¸ðµâÀÌ´Ù. ½ÇÁ¦·Î ´Ù¸¥ ¸ðµç ¾ÆÆÄÄ¡ ¸ðµâÀº + ¼³Ä¡ ¹®¼­¿¡¼­ ¼³¸íÇÑ + configureÀÇ --enable-module=shared + ¿É¼ÇÀ» »ç¿ëÇÏ¿© DSO·Î ÄÄÆÄÀÏÇÒ ¼ö ÀÖ´Ù. ¸ðµâÀ» + mod_foo.so¿Í °°ÀÌ DSO·Î ÄÄÆÄÀÏÇÑÈÄ httpd.conf + ÆÄÀÏ¿¡ mod_soÀÇ + LoadModule ¸í·É¾î¸¦ + »ç¿ëÇÏ¿© ¼­¹ö ½ÃÀ۽à ȤÀº Àç½ÃÀ۽à ±× ¸ðµâÀ» ÀоîµéÀÏ ¼ö + ÀÖ´Ù.

    + +

    ¾ÆÆÄÄ¡ ¸ðµâ(ƯÈ÷ Á¦»ïÀÚ°¡ ¸¸µç ¸ðµâ)·Î »ç¿ëÇÒ DSO ÆÄÀÏÀ» ½±°Ô + ¸¸µé±âÀ§ÇØ apxs (APache + eXtenSion)¶ó´Â »õ·Î¿î Áö¿ø ÇÁ·Î±×·¥ÀÌ ÀÖ´Ù. ÀÌ ÇÁ·Î±×·¥Àº + ¾ÆÆÄÄ¡ ¼Ò½º Æ®¸® ¹Û¿¡¼­ DSO·Î »ç¿ëÇÒ ¸ðµâÀ» + ÄÄÆÄÀÏÇÒ¶§ »ç¿ëÇÑ´Ù. °³³äÀº ½±´Ù. ¾ÆÆÄÄ¡¸¦ ¼³Ä¡ÇÒ¶§ + configure¿Í make installÀÌ + ¾ÆÆÄÄ¡ C Çì´õÆÄÀÏÀ» ¼³Ä¡Çϰí, DSO ÆÄÀÏÀ» ÄÄÆÄÀÏÇϱâÀ§ÇÑ + Ç÷¡Æû ƯÀ¯ÀÇ ÄÄÆÄÀÏ·¯ ¿É¼Ç°ú ¸µÄ¿ ¿É¼ÇÀ» apxs + ÇÁ·Î±×·¥¿¡ ±â·ÏÇÑ´Ù. ±×·¡¼­ apxs¸¦ »ç¿ëÇÏ´Â »ç¿ëÀÚ´Â + ¾ÆÆÄÄ¡ ¹èÆ÷º» ¼Ò½º Æ®¸®¾øÀÌ, ¶Ç DSO Áö¿øÀ» À§ÇÑ Ç÷¡Æû ƯÀ¯ÀÇ + ÄÄÆÄÀÏ·¯ ¿É¼Ç¿Í ¸µÄ¿ ¿É¼Ç¿¡ ½Å°æÀ» ¾²Áö¾Ê°í ÀÚ½ÅÀÇ ¾ÆÆÄÄ¡ + ¸ðµâ ¼Ò½º¸¦ ÄÄÆÄÀÏÇÒ ¼ö ÀÖ´Ù.

    +
    top
    +
    +

    »ç¿ë¹ý ¿ä¾à

    + +

    Apache 2.2ÀÇ DSO ±â´É¿¡ ´ëÇÑ Âª°í °£·«ÇÑ ¿ä¾àÀÌ´Ù:

    + +
      +
    1. + ¹èÆ÷º»¿¡ ÀÖ´Â ¾ÆÆÄÄ¡ ¸ðµâÀ» ÄÄÆÄÀÏÇÏ°í ¼³Ä¡ÇÏ´Â + °æ¿ì. ¿¹¸¦ µé¾î mod_foo.c¸¦ DSO + mod_foo.so·Î: + +

      +$ ./configure --prefix=/path/to/install --enable-foo=shared
      +$ make install +

      +
    2. + +
    3. + Á¦»ïÀÚ°¡ ¸¸µç ¾ÆÆÄÄ¡ ¸ðµâÀ» ÄÄÆÄÀÏÇÏ°í ¼³Ä¡ÇÏ´Â + °æ¿ì. ¿¹¸¦ µé¾î mod_foo.c¸¦ DSO + mod_foo.so·Î: + +

      +$ ./configure --add-module=module_type:/path/to/3rdparty/mod_foo.c --enable-foo=shared
      +$ make install +

      +
    4. + +
    5. + °øÀ¯ ¸ðµâÀ» ³ªÁß¿¡ »ç¿ëÇϱâÀ§ÇØ ¾ÆÆÄÄ¡¸¦ ±¸¼ºÇÏ´Â + °æ¿ì: + +

      +$ ./configure --enable-so
      +$ make install +

      +
    6. + +
    7. + Á¦»ïÀÚ°¡ ¸¸µç ¾ÆÆÄÄ¡ ¸ðµâÀ» ÄÄÆÄÀÏÇÏ°í ¼³Ä¡ÇÏ´Â + °æ¿ì. apxs¸¦ »ç¿ëÇÏ¿© + ¾ÆÆÄÄ¡ ¼Ò½º Æ®¸® ¹Û¿¡¼­ mod_foo.c¸¦ + DSO mod_foo.so·Î: + +

      +$ cd /path/to/3rdparty
      +$ apxs -c mod_foo.c
      +$ apxs -i -a -n foo mod_foo.la +

      +
    8. +
    + +

    ¸ðµç °æ¿ì ÀÏ´Ü °øÀ¯ ¸ðµâÀÌ ÄÄÆÄÀϵǸé, httpd.conf¿¡ + LoadModule Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© ¾ÆÆÄÄ¡°¡ ±× ¸ðµâÀ» ÀоîµéÀÌ°Ô ¸¸µç´Ù.

    +
    top
    +
    +

    ¹è°æÁö½Ä

    + +

    Çö´ëÀûÀÎ À¯´Ð½º·ù¿¡´Â µ¿Àû°øÀ¯°´Ã¼ (DSO)ÀÇ + µ¿Àû ¸µÅ·/·Îµù(dynamic linking/loading)À̶ó°í ÇÏ¿©, Ưº°ÇÑ + Çü½ÄÀÇ ½ÇÇàÄÚµå Á¶°¢À» ¸¸µé¾î ½ÇÇàÁßÀÎ ½ÇÇàÇÁ·Î±×·¥ÀÇ + ÁÖ¼Ò°ø°£¿¡ ÀоîµéÀÌ´Â ¸ÚÁø ±â´ÉÀÌ ÀÖ´Ù.

    + +

    º¸Åë µÎ°¡Áö ¹æ¹ýÀ¸·Î ÀоîµéÀÏ ¼ö ÀÖ´Ù. Çϳª´Â ½ÇÇàÇÁ·Î±×·¥ÀÌ + ½ÃÀÛÇÒ¶§ ld.so¶ó´Â ½Ã½ºÅÛ ÇÁ·Î±×·¥ÀÌ ÀÚµ¿À¸·Î + ÀоîµéÀÌ´Â °æ¿ì°í, ´Ù¸¥ Çϳª´Â ½ÇÇàÁßÀÎ ÇÁ·Î±×·¥ÀÌ + dlopen()/dlsym() ½Ã½ºÅÛÈ£Ãâ·Î À¯´Ð½º ·Î´õ(loader)ÀÇ + ½Ã½ºÅÛ ÀÎÅÍÆäÀ̽ºÀ» »ç¿ëÇÏ¿© Á÷Á¢ ÀоîµéÀÌ´Â °æ¿ì´Ù.

    + +

    ù¹øÂ° °æ¿ì DSO¸¦ º¸Åë °øÀ¯¶óÀ̺귯¸®(shared libraries) + ȤÀº DSO ¶óÀ̺귯¸®¶ó°í ºÎ¸£¸ç, ÆÄÀÏÀº + libfoo.so³ª libfoo.so.1.2 °°Àº + À̸§À» °¡Áø´Ù. À̵éÀº ½Ã½ºÅÛ µð·ºÅ丮(º¸Åë /usr/lib)¿¡ + ÀÖ°í, ÄÄÆÄÀϽà ¸µÄ¿ ¸í·É¾î¿¡ -lfoo¸¦ ÁÖ¾î + ½ÇÇàÆÄÀϰú ¿¬°áÇÑ´Ù. ÀÌ·¸°Ô Á÷Á¢ ½áÁØ ¶óÀ̺귯¸®´Â ½ÇÇàÆÄÀÏ¿¡ + ÂüÁ¶µÇ¿©¼­, ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ¶§ ¸µÄ¿ ¿É¼Ç -R·Î + Á÷Á¢ ÁöÁ¤ÇÑ °æ·Î, ȯ°æº¯¼ö LD_LIBRARY_PATH·Î + ÁöÁ¤ÇÑ °æ·Î ȤÀº /usr/lib¿¡¼­ À¯´Ð½º ·Î´õ°¡ + libfoo.so¸¦ ãÀ» ¼ö ÀÖ´Ù. ±×·¯¸é ½ÇÇàÇÁ·Î±×·¥ÀÇ + (¾ÆÁ÷ ¸øÃ£Àº(unresolved)) ½Éº¼(symbol)À» DSO¿¡¼­ ã°ÔµÈ´Ù.

    + +

    DSO´Â º¸Åë ½ÇÇàÇÁ·Î±×·¥ÀÇ ½Éº¼À» ãÁö¾Ê±â ¶§¹®¿¡ (DSO°¡ + Àç»ç¿ë°¡´ÉÇÑ ÀϹÝÀûÀÎ ÄÚµå ¶óÀ̺귯¸®À̹ǷÎ) ã±â´Â ¿©±â¼­ + ³¡³­´Ù. À¯´Ð½º ·Î´õ°¡ ½Éº¼ ã±â¸¦ ¿ÏÀüÈ÷ ´ã´çÇϹǷΠ½ÇÇàÇÁ·Î±×·¥ÀÌ + Á÷Á¢ DSO¿¡¼­ ½Éº¼À» ãÀ» Çʿ䰡 ¾ø´Ù. (»ç½Ç ld.so¸¦ + ºÎ¸£´Â ÄÚµå´Â Á¤ÀûÀÌ ¾Æ´Ñ ¸ðµç ½ÇÇàÇÁ·Î±×·¥¿¡ ¸µÅ©µÇ´Â ½ÇÇà½Ã + ½ÃÀÛÄÚµåÀÇ ÀϺδÙ.) °øÅëµÈ ¶óÀ̺귯¸® Äڵ带 µ¿ÀûÀ¸·Î ÀоîµéÀÌ´Â + ÀåÁ¡Àº ¸íÈ®ÇÏ´Ù. ¶óÀ̺귯¸® Äڵ尡 ¸ðµç ÇÁ·Î±×·¥¿¡ Áߺ¹Çؼ­ + ÀúÀåµÇ´Â ´ë½Å libc.so¿Í °°Àº ½Ã½ºÅÛ ¶óÀ̺귯¸®¿¡ + Çѹø¸¸ ÀúÀåµÇ±â ¶§¹®¿¡ µð½ºÅ© °ø°£ÀÌ Àý¾àµÈ´Ù.

    + +

    µÎ¹øÂ° °æ¿ì DSO¸¦ º¸Åë °øÀ¯°´Ã¼(shared objects) + ȤÀº DSO ÆÄÀÏÀ̶ó°í ºÎ¸£°í, (±ÔÄ¢»ó À̸§Àº + foo.soÀÌÁö¸¸) ÆÄÀÏÀÇ È®ÀåÀÚ´Â ÀÚÀ¯·Ó´Ù. ÀÌ + ÆÄÀϵéÀº º¸Åë ÇÁ·Î±×·¥ ÀÚü µð·ºÅ丮¿¡ À§Ä¡ÇÏ°í ½ÇÇàÇÁ·Î±×·¥¿¡ + ÀÚµ¿À¸·Î ¿¬°áµÇÁö ¾Ê´Â´Ù. ´ë½Å ½ÇÇàÇÁ·Î±×·¥Àº ½ÇÇà½Ã + dlopen()À» »ç¿ëÇÏ¿© DSO¸¦ ÁÖ¼Ò°ø°£¿¡ + Á÷Á¢ Àоîµé¿©¾ß ÇÑ´Ù. À̶§ ½ÇÇàÇÁ·Î±×·¥Àº DSO¿¡¼­ ½Éº¼À» + ãÁö ¾Ê´Â´Ù. ´ë½Å ¾Õ¿¡¼­ º» À¯´Ð½º ·Î´õ´Â ÀÚµ¿À¸·Î ½ÇÇàÆÄÀϰú + ½ÇÇàÆÄÀÏÀÌ ÀÌ¹Ì ÀоîµéÀÎ DSO ¶óÀ̺귯¸®(ƯÈ÷ Ç×»ó Á¸ÀçÇÏ´Â + libc.soÀÇ ¸ðµç ½Éº¼)¿¡¼­ DSOÀÇ (¾ÆÁ÷ ¸øÃ£Àº) + ½Éº¼À» ã´Â´Ù. ±×·¡¼­ DSO´Â ¸¶Ä¡ óÀ½ºÎÅÍ ½ÇÇàÇÁ·Î±×·¥¿¡ + Á¤ÀûÀ¸·Î ¸µÅ©µÈ°Í°ú °°ÀÌ ½ÇÇàÆÄÀÏÀÇ ½Éº¼À» ¾Ë°ÔµÈ´Ù.

    + +

    DSOÀÇ API¸¦ ÀÌ¿ëÇϱâÀ§Çؼ­ ¸¶Áö¸·À¸·Î ½ÇÇàÇÁ·Î±×·¥Àº + dlsym()À¸·Î DSO¿¡¼­ ƯÁ¤ ½Éº¼À» ã¾Æ¼­, ¾ÕÀ¸·Î + »ç¿ëÇϱâÀ§ÇØ µð½ºÆÐÄ¡(dispatch) Ç¥ µî¿¡ ÀúÀåÇÑ´Ù. + ´Ù¸¥ ¸»·Î ½ÇÇàÇÁ·Î±×·¥Àº »ç¿ëÇÒ ¸ðµç ½Çº¼À» Á÷Á¢ ã¾Æ¾ßÇÑ´Ù. + ÀÌ·± ±¸Á¶ÀÇ ÀåÁ¡Àº ÇÁ·Î±×·¥ÀÇ ÀϺθ¦ ÇÁ·Î±×·¥ÀÌ + ÇÊ¿äÇÒ¶§±îÁö ÀоîµéÀÌÁö ¾Ê¾Æµµ (±×·¡¼­ ¸Þ¸ð¸®¸¦ ³¶ºñÇÏÁö + ¾Ê°Ô) µÈ´Ù´Â Á¡ÀÌ´Ù. ±âº» ÇÁ·Î±×·¥ÀÇ ±â´ÉÀ» È®ÀåÇϱâÀ§ÇØ + ÇÊ¿äÇÑ °æ¿ì ÀÌ ºÎºÐÀ» µ¿ÀûÀ¸·Î ÀоîµéÀÏ ¼ö ÀÖ´Ù.

    + +

    ÀÌ·± DSO ±¸Á¶°¡ ÀÚ¿¬½º·´°Ô º¸ÀÌÁö¸¸, ÃÖ¼ÒÇÑ ¾î·Á¿î Á¡ÀÌ + ÇѰ¡ÁöÀÖ´Ù. ÇÁ·Î±×·¥À» È®ÀåÇϱâÀ§ÇØ DSO¸¦ »ç¿ëÇÒ¶§ DSO°¡ + ½ÇÇàÇÁ·Î±×·¥ÀÇ ½Éº¼À» ã´Â ÀÏÀÌ´Ù. ¿Ö? DSO°¡ ½ÇÇàÇÁ·Î±×·¥ÀÇ + ½Éº¼À» "¿ªÀ¸·Î ã´Â °Í"Àº (¶óÀ̺귯¸®´Â ÀÚ½ÅÀ» »ç¿ëÇÏ´Â ÇÁ·Î±×·¥¿¡ + ´ëÇØ ¸ð¸¥´Ù´Â) ¶óÀ̺귯¸® ¼³°è¿¡ ¹ÝÇϸç, ¸ðµç Ç÷¡Æû¿¡¼­ + Áö¿øµÇÁö¾Ê°í Ç¥ÁØÈ­µÇÁöµµ ¾Ê¾Ò±â ¶§¹®ÀÌ´Ù. ½ÇÁ¦·Î ½ÇÇàÆÄÀÏÀÇ + Àü¿ª½Éº¼(global symbol)Àº º¸Åë ÀͽºÆ÷Æ®(export)µÇÁö ¾Ê±â¶§¹®¿¡ + DSO°¡ »ç¿ëÇÒ ¼ö ¾ø´Ù. DSO¸¦ »ç¿ëÇÏ¿© ½ÇÇàÁß ÇÁ·Î±×·¥À» È®ÀåÇÏ·Á¸é + ¸µÄ¿¿¡°Ô ¸ðµç Àü¿ª½Éº¼À» ÀͽºÆ÷Æ®Çϵµ·Ï °­Á¦ÇÏ´Â °ÍÀÌ ÁÖµÈ + ÇØ°áÃ¥ÀÌ´Ù.

    + +

    °øÀ¯¶óÀ̺귯¸®´Â DSO ¹æ½ÄÀÇ ¼³°è¿øÄ¢´ë·Î ÀüÇüÀûÀ̱⶧¹®¿¡ + ¿î¿µÃ¼Á¦°¡ Á¦°øÇÏ´Â °ÅÀÇ ¸ðµç Á¾·ùÀÇ ¶óÀ̺귯¸®°¡ »ç¿ëÇÑ´Ù. + ¹Ý´ë·Î ¸¹Àº ÇÁ·Î±×·¥Àº ÇÁ·Î±×·¥À» È®ÀåÇϱâÀ§ÇØ °øÀ¯°´Ã¼¸¦ + »ç¿ëÇÏÁö ¾Ê´Â´Ù.

    + +

    1998³â ½ÇÇàÁß ½ÇÁ¦·Î ±â´ÉÀ» È®ÀåÇϱâÀ§ÇØ DSO ±¸Á¶¸¦ »ç¿ëÇÑ + ¼ÒÇÁÆ®¿þ¾î ÆÐŰÁö´Â (XS ±¸Á¶¿Í DynaLoader ¸ðµâÀ» »ç¿ëÇÑ) + Perl 5, Netscape Server µîÀ¸·Î µå¹°¾ú´Ù. ¾ÆÆÄÄ¡´Â + ÀÌ¹Ì ±â´ÉÀ» È®ÀåÇϱâÀ§ÇØ ¸ðµâ °³³äÀ» »ç¿ëÇß°í ¿ÜºÎ ¸ðµâÀ» + ¾ÆÆÄÄ¡ Çٽɱâ´É¿¡ ¿¬°áÇϱâÀ§ÇØ ³»ºÎÀûÀ¸·Î µð½ºÆÐÄ¡¸ñ·ÏÀ» + ÀÌ¿ëÇÑ Á¢±Ù¹æ¹ýÀ» »ç¿ëÇ߱⶧¹®¿¡ 1.3 ¹öÀüºÎÅÍ ÀÌ ´ë¿­¿¡ ÇÕ·ùÇß´Ù. + ±×·¡¼­ ¾ÆÆÄÄ¡´Â ½ÇÇàÁß ¸ðµâÀ» ÀоîµéÀ̴µ¥ DSO¸¦ »ç¿ëÇϵµ·Ï + ¿î¸íÁö¿öÁ³´Ù.

    +
    top
    +
    +

    Àå´ÜÁ¡

    + +

    ¾Õ¿¡¼­ ¸»ÇÑ DSO¸¦ »ç¿ëÇÏ¸é ´ÙÀ½°ú °°Àº ÀåÁ¡ÀÌ ÀÖ´Ù:

    + +
      +
    • ½ÇÁ¦ ¼­¹ö ÇÁ·Î¼¼½º°¡ ÄÄÆÄÀϽà configure + ¿É¼Ç´ë½Å httpd.confÀÇ LoadModuleÀ» »ç¿ëÇÏ¿© ½ÇÇàÁß¿¡ + °áÇյǹǷΠ¼­¹ö ÆÐŰÁö ½ÇÇàÀÌ ´õ À¯¿¬ÇÏ´Ù. ¿¹¸¦ µé¾î ÇѹøÀÇ + ¾ÆÆÄÄ¡ ¼³Ä¡¸¸À¸·Î ´Ù¸¥ ¼­¹ö(Ç¥ÁØ ¹öÀü°ú SSL ¹öÀü, ÃÖ¼ÒÈ­ + ¹öÀü°ú ±â´ÉÃß°¡ ¹öÀü [mod_perl, PHP3] µî)¸¦ ½ÇÇàÇÒ + ¼ö ÀÖ´Ù.
    • + +
    • ¼­¹ö´Â ¼³Ä¡ÈÄ¿¡µµ Á¦»ïÀÚ°¡ ¸¸µç ¸ðµâÀ» »ç¿ëÇÏ¿© ½±°Ô + È®ÀåÇÒ ¼ö ÀÖ´Ù. ÃÖ¼ÒÇÑ ±â¾÷ÀÇ ÆÐŰÁö Á¦ÀÛÀÚ´Â ¾ÆÆÄÄ¡ ÇÙ½É + ÆÐŰÁö¿Í º°µµ·Î PHP3, mod_perl, mod_fastcgi µîÀ» + Ãß°¡ ÆÐŰÁö·Î ¸¸µé ¼ö À־ Å« À̵æÀÌ´Ù.
    • + +
    • DSO¿Í apxs¸¦ °¡Áö°í ¾ÆÆÄÄ¡ ¼Ò½º Æ®¸® ¹Û¿¡¼­ + ÀÛ¾÷Çϰí apxs -i¿Í apachectl restart + ¸í·É¾î¸¸À¸·Î ÇöÀç °³¹ßÇÑ ¸ðµâÀÇ »õ ¹öÀüÀ» ½ÇÇàÁßÀÎ ¾ÆÆÄÄ¡ + ¼­¹ö¿¡ ¹Ý¿µÇÒ ¼ö À־ ´õ ½±°Ô ¾ÆÆÄÄ¡ ¸ðµâÀ» °³¹ßÇÒ ¼ö + ÀÖ´Ù.
    • +
    + +

    DSO´Â ´ÙÀ½°ú °°Àº ´ÜÁ¡ÀÌ ÀÖ´Ù:

    + +
      +
    • ÇÁ·Î±×·¥ÀÇ ÁÖ¼Ò°ø°£¿¡ Äڵ带 µ¿ÀûÀ¸·Î ÀоîµéÀÌ´Â ±â´ÉÀ» + Áö¿øÇÏÁö¾Ê´Â ¿î¿µÃ¼Á¦°¡ Àֱ⠶§¹®¿¡ ¸ðµç Ç÷¡Æû¿¡¼­ DSO¸¦ + »ç¿ëÇÒ ¼ö ¾ø´Ù.
    • + +
    • À¯´Ð½º ·Î´õ°¡ ½Éº¼À» ã¾Æ¾ßÇϱ⠶§¹®¿¡ ¼­¹ö ½ÃÀÛÀÌ + ¾à 20% Á¤µµ ´Ê¾îÁø´Ù.
    • + +
    • ¼­¹ö´Â À§Ä¡µ¶¸³ÄÚµå(position independent code, PIC) + ¶§¹®¿¡ Àý´ëÁÖ¼ÒÁöÁ¤(absolute addressing)º¸´Ù ´À¸° + »ó´ëÁÖ¼ÒÁöÁ¤(relative addressing)ÀÇ º¹ÀâÇÑ ¾î¼Àºí·¯ ±â¹ýÀÌ + ÇÊ¿äÇϹǷΠ¾î¶² Ç÷¡Æû¿¡¼­ ½ÇÇà½Ã ¾à 5% Á¤µµ ´Ê´Ù.
    • + +
    • DSO ¸ðµâÀ» ´Ù¸¥ DSO±â¹Ý ¶óÀ̺귯¸®(ld -lfoo)¿¡ + ¸µÅ©ÇÒ ¼ö ¾ø´Â Ç÷¡ÆûÀÌ Àֱ⶧¹®¿¡ (¿¹¸¦ µé¾î ELF±â¹Ý + Ç÷¡ÆûÀº Áö¿øÇÏÁö¸¸ a.out±â¹Ý Ç÷¡ÆûÀº º¸Åë ÀÌ ±â´ÉÀ» + Áö¿øÇÏÁö ¾Ê´Â´Ù) ¸ðµç Á¾·ùÀÇ ¸ðµâ¿¡ DSO¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. + ´Ù¸¥ ¸»·Î DSO ÆÄÀÏ·Î ÄÄÆÄÀÏÇÏ´Â ¸ðµâÀº ¾ÆÆÄÄ¡ Çٽɰú ¾ÆÆÄÄ¡ + ÇÙ½ÉÀÌ »ç¿ëÇÏ´Â C ¶óÀ̺귯¸®(libc)¿Í ´Ù¸¥ + µ¿Àû/Á¤Àû ¶óÀ̺귯¸®, À§Ä¡µ¶¸³Äڵ带 ´ã°í ÀÖ´Â Á¤Àû ¶óÀ̺귯¸® + ¾ÆÄ«À̺ê(libfoo.a)ÀÇ ½Éº¼¸¸À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. + ´Ù¸¥ Äڵ带 »ç¿ëÇÏ·Á¸é ¾ÆÆÄÄ¡ ÇÙ½ÉÀÌ ±×°ÍÀ» ÂüÁ¶ÇÏ´øÁö, + dlopen()À¸·Î Á÷Á¢ Äڵ带 Àоîµé¿©¾ß ÇÑ´Ù.
    • +
    + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/dso.html.tr.utf8 b/docs/manual/dso.html.tr.utf8 new file mode 100644 index 0000000..3d8f694 --- /dev/null +++ b/docs/manual/dso.html.tr.utf8 @@ -0,0 +1,329 @@ + + + + + +Devingen Paylaşımlı Nesne Desteği - Apache HTTP Sunucusu Sürüm 2.4 + + + + + + + +
    <-
    +

    Devingen Paylaşımlı Nesne Desteği

    +
    +

    Mevcut Diller:  en  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Apache HTTP Sunucusu modüler bir program olup, yönetici sadece bir + grup modül seçerek sunucuya işlevsellik ekleyebilir. Modüller, Devingen + Paylaşımlı Nesneler (DSO - Dynamic Shared Object) halinde + httpd programından ayrı olarak derlenir. DSO modülleri + sunucunun derlenmesi sırasında derlenebileceği gibi ayrı olarak derlenip + daha sonra Apache Eklenti Aracı (Apache Extension Tool) + apxs programı kullanılarak da sunucuya eklenebilir.

    + +

    Bu belgede DSO modüllerinin kullanımının yanında teorisine de + değinilecektir.

    +
    + +
    top
    +
    +

    Gerçeklenim

    + + + +

    Apache httpd modüllerini yüklemek için DSO desteği, Apache httpd + çekirdeğine durağan olarak ilintilenerek derlenmiş olan + mod_so adında bir modül tarafından sağlanır. + core modülünden başka, bir DSO modülü olamayan tek modül + mod_so modülüdür. Apache ile dağıtılan hemen hemen tüm + diğer Apache modülleri bir DSO modülüne yerleştirilebilir. Derlenmiş + modüller mod_filanca.so biçeminde birer DSO ismi alırlar ve + her biri istenirse httpd.conf dosyasında + mod_so modülünün LoadModule yönergesiyle belirtilerek sunucu başlatılırken + veya yeniden başlatılırken sunucuya yüklenebilir.

    + +

    Kurulum belgesinde açıklandığı gibi, her DSO + modülü configure programının + --enable-mods-static seçeneği ile devredışı bırakılabilir.

    + +

    Apache httpd modülleri için (özellikle üçüncü parti modüller için) DSO + dosyası üretimini kolaylaştırmak amacıyla apxs + (APache eXtenSion) adında yeni bir destek programı + kullanılmaktadır. Bu program Apache httpd modüllerini Apache httpd kaynak + ağacından ayrı olarak derlemek için kullanılabilir. Fikir basittir: Apache + HTTP Sunucusu derlenirken DSO dosyalarını derlemek için platforma bağımlı + derleyici ve ilintileyici seçenekleri apxs + programının içine konur ve make install ile kurulum sırasında + Apache httpd C başlık dosyaları da kurulur. Böylece + kullanıcı Apache httpd dağıtımının kaynak ağacına ihtiyaç duymadan ve + platforma bağımlı derleyici ve ilintileyici seçeneklerini bilmek zorunda + kalmadan istediği Apache httpd modülünü apxs + programını kullanarak derleyebilir.

    +
    top
    +
    +

    Kullanım Özeti

    + +

    Apache HTTP Sunucusu 2.x’in DSO özelliklerine bir giriş olarak burada + kısaca bir bilgi vermekle yetinilecektir:

    + +
      +
    1. Kaynak dosyası mod_filanca.c dosyasında dağıtılan bir + özgün Apache htpd modülünü mod_filanca.so isminde + bir DSO modülü olarak derlemek ve kurmak için şöyle yapılır:

      + +

      + $ ./configure --prefix=/kurulum/yeri --enable-filanca
      + $ make install +

      +
    2. + +
    3. Apache HTTP Sunucusunu tüm modüller etkin olarak + derleyebilirsiniz. Fakat sunucunun başlatılması sırasında sadece temel + modüller yüklenir. Daha sonra httpd.conf içindeki + LoadModule yönergelerini etkin + veya etkisiz hale getirerek yüklenecek modülleri + değiştirebilirsiniz.

      + +

      +$ ./configure --enable-mods-shared=all
      +$ make install +

      +
    4. + +
    5. Bazı modüller sadece geliştiriciler içindir ve bunlar tüm + modüllerin derlenmesini (all) seçseniz bile derlenmeyecektir. + Geliştirici modülleri dehil tüm modülleri derlemek isterseniz + reallyall kullanınız. Ek olarak, derlenmiş modüller için + kullanılan LoadModule + yönergelerinin tamamını --enable-load-all-modules derleme + seçeneği ile etkin kılabilirsiniz.

      + +

      +$ ./configure --enable-mods-shared=reallyall --enable-load-all-modules
      +$ make install +

      +
    6. + +
    7. Kaynak dosyası mod_filanca.c dosyasında dağıtılan bir + üçüncü parti Apache httpd modülü mod_filanca.so + isminde bir DSO modülü olarak Apache httpd kaynak ağacının dışında + apxs kullanarak derlemek ve kurmak için şöyle + yapılır:

      + +

      +$ cd /bir/kurulum/yeri
      +$ apxs -c mod_filanca.c
      +$ apxs -aci filanca mod_filanca.la +

      +
    8. +
    + +

    Tüm durumlarda derlenen paylaşımlı modülü Apache httpd’nin etkin + kılabilmesi için httpd.conf dosyasında o modül için bir + LoadModule yönergesi + bulunmalıdır.

    + +

    Ayrıntılı bilgi için apxs belgelerine + bakınız.

    +
    top
    +
    +

    Artalan Bilgisi

    + +

    Günümüzün Unix türevlerinde var olan bir mekanizma sayesinde + çalıştırılabilir bir programın adres uzayına çalışma anında yüklenmek + veya ilintilenmek üzere Devingen Paylaşımlı Nesneler (DSO - + Dynamic Shared Object) adı verilen, özel bir biçem kullanarak kodlanmış + program parçaları oluşturulabilir.

    + +

    Bu yükleme normalde iki yolla yapılabilir: Ya çalıştırılabilir + programın başlatılması sırasında yüklenen ld.so adlı bir + sistem programınının devingen olarak yüklenmesi ile ya da + çalıştırılabilir programın içinden Unix yükleyicisine programsal sistem + arayüzü sağlayan dlopen()/dlsym() sistem çağrılarının elle + yapılması suretiyle.

    + +

    İlk yöntemde kullanılan DSO’lara genelde paylaşımlı + kütüphaneler veya DSO kütüphaneleri adı verilir ve + bunların dosyaları libfilanca.so veya + libfilanca.so.1.2 biçiminde isimlendirilir. Belli bir + sistem dizininde (normalde /usr/lib) bulunurlar ve derleme + sırasında ilintileyici komutuna -lfilanca şeklinde + belirtilerek çalıştırılabilir programla ilintilenirler. Doğrudan + çalıştırılabilir koda eklenen bu kodlar Unix yükleyicisinin programın + başlatılması sırasında kütüphaneyi /usr/lib altında + libfilanca.so adıyla bulabilmesini sağlar. Kütüphanelerin + aranacağı yerler ya -R gibi bir ilintileyici seçeneği ile + koda eklenir ya da arama yolları LD_LIBRARY_PATH ortam + değişkeni aracılığıyla yapılandırılır. Böylece çalıştırılabilir + programda henüz çözümlenmemiş simgeler DSO içinde bulunarak + çözümlenebilir.

    + +

    Çalıştırılabilir program içindeki simgelere normalde DSO içinden + atıfta bulunulmaz (genel kod kütüphanesinin başka programlarca da + kullanılması nedeniyle). Bu bakımdan DSO tarafında böyle bir çözümleme + yapılmaz. Çalıştırılabilir program da DSO’daki simgeleri kendisi + çözümlemeye uğraşmaz, bu işlemlerden tamamen Unix yükleyicisi + (ld.so) sorumludur. (Aslında, ld.so’yu + çağıracak kod, her çalıştırılabilir programın içine ilintilenmiş + (durağan değil) başlatma kodunun bir parçasıdır.) Programlar tarafından + ortaklaşa kullanılan kütüphanelerin devingen olarak yüklenmesinin sebebi + basittir: Kütüphane kodu libc.so gibi bir sistem + kütüphanesine bir kere kaydedilip disk alanından yer kazanılmış + olur.

    + +

    İkinci yöntemde kullanılan DSO’lara yine paylaşımlı + kütüphaneler veya DSO kütüphaneleri adı verilir fakat + bunların dosyaları geçerli kabule göre filanca.so gibi + isimlendirilse de genelde keyfi olarak seçilen bir dosya uzantısı + kullanılarak isimlendirilirler. Bu dosyalar genellikle programa özel bir + dizinde dururlar ve bu dosyaları kullanacak olan çalıştırılabilir + programla aralarında özdevimli olarak bağ kurulmamıştır. Bunun yerine, + çalıştırılabilir program DSO’yu çalışma anında dlopen() + sayesinde kendi adres uzayına ekler. Çalıştırılabilir program için + DSO’daki simgeler bu sırada çözümlenmez. Özdevimli olarak devreye + giren Unix yükleyicisi, (varsa) artakalan simgeleri, çalıştırılabilir + ihraç edilen simge kümelerini (ve özellikle her yerde hazır ve nazır + libc.so içindeki tüm simgeleri) kullanarak çözümler. Bu + yolla DSO, çalıştırılabilir programın simge kümesi bilgilerini sanki + kendisine baştan durağan olarak ilintilenmiş gibi ulaşabilir.

    + +

    Son olarak, DSO’nun programlama arayüzünün getirilerinden yararlanmak + amacıyla çalıştırılabilir program, daha sonra dağıtım tabloları vb. + yerlerde kullanmak üzere dlsym() üzerinden DSO’daki belli + simgeleri çözümlemek zorundadır. Başka bir deyişle: Çalıştırılabilir + program ihtiyaç duyduğu her simgeyi kullanmak için kendisi çözümleme + yapmak zorundadır. Böyle bir mekanizmanın getirisi, programın isteğe + bağlı parçalarının gerekli olana kadar yüklenmemesidir (böylece daha az + bellek alanı kullanılır). Gerektiği zaman programın işlevselliğini + arttırmak amacıyla bu parçalar devingen olarak programa + yüklenebilir.

    + +

    DSO mekanizmasının bu basit gibi görünen işleyişinde zorluk içeren bir + adım şudur (başkaları da olabilir): Bir programın işlevselliğini + genişletmek için DSO kullanılırken (ikinci yöntem) çalıştırılabilir + programdan DSO için simgelerin çözümlenmesi. Zorluğun sebebi, + "tersine çözümleme" yapılmasıdır; çalıştırılabilir programın simge + kümesindeki DSO simgeleri kütüphane tasarımına aykırı bir şekilde + çözümlenir ve bu uygulama tüm platformlarda hazır olarak + desteklenmediği gibi standartlaşmış da değildir. Geçer uygulamada + çalıştırılabilir programın evrensel simgeleri çoğunlukla yeniden dışa + verilmez ve bu bakımdan bir DSO içinde kullanılmaları uygun değildir. + Esas sorun, çalıştırılabilir bir programın işlevselliğini çalışma + anında genişletmek için DSO kullanımı sırasında ilintileyicinin tüm + evrensel simgeleri dışa vermesini zorlamanın bir yolunu bulmaktır.

    + +

    Paylaşımlı kütüphane yaklaşımı bu bakımdan türünün tek örneğidir, + çünkü DSO mekanizması özellikle bunun için tasarlanmıştır, dolayısıyla + işletim sisteminin sağladığı hemen hemen tüm kütüphaneler için + kullanılabilir.

    +
    top
    +
    +

    Getiriler ve Götürüler

    + +

    Yukarıda bahsedilen DSO’ya dayalı özelliklerin getirileri + şunlardır:

    + +
      +
    • Sunucu paketi çalışma anında daha esnektir çünkü, sunucuyu + oluÅŸturan parçalar derleme sırasında configure + seçenekleriyle birleÅŸtirilmek yerine httpd.conf içinde + LoadModule yönergeleri + sayesinde çalışma anında birleÅŸtirilebilmektedir. Bu yolla, örneÄŸin + tek bir Apache kurulumuyla birbirinden farklı yapılandırmalara sahip + çok sayıda sunucu çalıştırmak mümkündür. (standart veya SSL sürümü; + basitleÅŸtirilmiÅŸ veya devingen sürümü [mod_perl, PHP3], vs.)
    • + +
    • Sunucu paketi kurulumdan sonra bile üçüncü parti modüllerle kolayca + geniÅŸletilebilir. Bu özellikle, bir Apache temel paketinin yanında + PHP, mod_perl, mod_security gibi ek paketler oluÅŸturan paket + dağıtıcılarına büyük yarar saÄŸlar.
    • + +
    • Yeni Apache httpd modülleri için daha kolay prototip + geliÅŸtirilebilir: Modül kaynak kodunu DSO/apxs çifti + sayesinde Apache httpd kaynak aÄŸacının dışında derleyip modülün yeni + bir sürümünü bir apxs -i komutunun ardından + apachectl restart yaparak çalışan bir Apache HTTP + Sunucusunda denemek daha kolay hale getirilmiÅŸtir.
    • +
    + +

    DSO kullanımının götürüleri ise şunlardır:

    + +
      +
    • İlk yüklemede %20 yavaÅŸlama: Unix yükleyicisi simgeleri çözümlemek + zorunda olduÄŸundan sunucu ilk baÅŸlatılırken yaklaşık %20 daha yavaÅŸ + faaliyete geçer.
    • + +
    • Çalışma sırasında % 5 yavaÅŸlama: Konumdan bağımsız kodun (PIC - + Position Independent Code) göreli adresleme için karmaşık oyunlara + girmesi ve bunun mutlak adresleme kadar hızlı olmaması nedeniyle + sunucu bazı platformlarda çalışma anında yaklaşık %5 daha yavaÅŸ + çalışabilir.
    • + +
    • DSO'nun tüm modüller için uygun olmaması: DSO modülleri bazı + platformlarda diÄŸer DSO temelli kütüphanelerle ilintilenemediÄŸinden + (ld -lfilanca) DSO mekanizmasını tüm modül türleri için + kullanamazsınız (örneÄŸin a.out temelli platformlar bu iÅŸlevselliÄŸi + ELF temelli platformlar kadar iyi saÄŸlamaz). BaÅŸka bir deyiÅŸle, DSO + dosyaları olarak derlenmiÅŸ modüllerin kullanabileceÄŸi simgeler ya + Apache httpd temel kodunda vardır ya Apache httpd temel kodunun + kullandığı C kütüphanesinde (libc) ve diÄŸer duraÄŸan ve + devingen kütüphanelerde vardır ya da konumdan bağımsız kodu içeren + duraÄŸan kütüphane arÅŸivlerinde (libfilanca.a) + vardır. DiÄŸer modülleri kullanmak için tek ÅŸansınız ya Apache httpd + çekirdeÄŸinin modüle bir atıf içermesini saÄŸlamak ya da modül kodunu + dlopen() vasıtasıyla yüklemektir.
    • +
    + +
    +
    +

    Mevcut Diller:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Yorumlar

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/env.html b/docs/manual/env.html new file mode 100644 index 0000000..1ccf3fa --- /dev/null +++ b/docs/manual/env.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: env.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: env.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: env.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: env.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: env.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/env.html.en b/docs/manual/env.html.en new file mode 100644 index 0000000..ae8dc11 --- /dev/null +++ b/docs/manual/env.html.en @@ -0,0 +1,537 @@ + + + + + +Environment Variables in Apache - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Environment Variables in Apache

    +
    +

    Available Languages:  en  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    There are two kinds of environment variables that affect + the Apache HTTP Server.

    + +

    First, there are the environment variables controlled by + the underlying operating system. These are set before the + server starts. They can be used in expansions in configuration + files, and can optionally be passed to CGI scripts and SSI + using the PassEnv directive.

    + +

    Second, the Apache HTTP Server provides a mechanism for storing + information in named variables that are also called environment + variables. This information can be used to control various + operations such as logging or access control. The variables are + also used as a mechanism to communicate with external programs + such as CGI scripts. This document discusses different ways to + manipulate and use these variables.

    + +

    Although these variables are referred to as environment + variables, they are not the same as the environment + variables controlled by the underlying operating system. + Instead, these variables are stored and manipulated in an + internal Apache structure. They only become actual operating + system environment variables when they are provided to CGI + scripts and Server Side Include scripts. If you wish to + manipulate the operating system environment under which the + server itself runs, you must use the standard environment + manipulation mechanisms provided by your operating system + shell.

    +
    + +
    top
    +
    +

    Setting Environment Variables

    + + + +

    Basic Environment Manipulation

    + + +

    The most basic way to set an environment variable in Apache + is using the unconditional SetEnv directive. Variables may also be passed from + the environment of the shell which started the server using the + PassEnv directive.

    + + +

    Conditional Per-Request Settings

    + + +

    For additional flexibility, the directives provided by + mod_setenvif allow environment variables to be set + on a per-request basis, conditional on characteristics of particular + requests. For example, a variable could be set only when a + specific browser (User-Agent) is making a request, or only when + a specific Referer [sic] header is found. Even more flexibility + is available through the mod_rewrite's RewriteRule which uses the + [E=...] option to set environment variables.

    + + +

    Unique Identifiers

    + + +

    Finally, mod_unique_id sets the environment + variable UNIQUE_ID for each request to a value which is + guaranteed to be unique across "all" requests under very + specific conditions.

    + + +

    Standard CGI Variables

    + + +

    In addition to all environment variables set within the + Apache configuration and passed from the shell, CGI scripts and + SSI pages are provided with a set of environment variables + containing meta-information about the request as required by + the CGI + specification.

    + + +

    Some Caveats

    + + +
      +
    • It is not possible to override or change the standard CGI + variables using the environment manipulation directives.
    • + +
    • When suexec is used to launch + CGI scripts, the environment will be cleaned down to a set of + safe variables before CGI scripts are launched. The + list of safe variables is defined at compile-time in + suexec.c.
    • + +
    • For portability reasons, the names of environment + variables may contain only letters, numbers, and the + underscore character. In addition, the first character may + not be a number. Characters which do not match this + restriction will be replaced by an underscore when passed to + CGI scripts and SSI pages.
    • + +
    • A special case are HTTP headers which are passed to CGI + scripts and the like via environment variables (see below). + They are converted to uppercase and only dashes are replaced with + underscores; if the header contains any other (invalid) character, + the whole header is silently dropped. See + below for a workaround.
    • + +
    • The SetEnv directive runs + late during request processing meaning that directives such as + SetEnvIf and RewriteCond will not see the + variables set with it.
    • + +
    • When the server looks up a path via an internal + subrequest such as looking + for a DirectoryIndex + or generating a directory listing with mod_autoindex, + per-request environment variables are not inherited in the + subrequest. Additionally, + SetEnvIf directives + are not separately evaluated in the subrequest due to the API phases + mod_setenvif takes action in.
    • +
    + +
    top
    +
    +

    Using Environment Variables

    + + + + +

    CGI Scripts

    + + +

    One of the primary uses of environment variables is to + communicate information to CGI scripts. As discussed above, the + environment passed to CGI scripts includes standard + meta-information about the request in addition to any variables + set within the Apache configuration. For more details, see the + CGI tutorial.

    + + +

    SSI Pages

    + + +

    Server-parsed (SSI) documents processed by + mod_include's + INCLUDES filter can print environment variables + using the echo element, and can use environment + variables in flow control elements to makes parts of a page + conditional on characteristics of a request. Apache also + provides SSI pages with the standard CGI environment variables + as discussed above. For more details, see the SSI tutorial.

    + + +

    Access Control

    + + +

    Access to the server can be controlled based on + environment variables using the Require env + and Require not env directives. In combination with + SetEnvIf, this + allows for flexible control of access to the server based on + characteristics of the client. For example, you can use these + directives to deny access to a particular browser (User-Agent). +

    + + +

    Conditional Logging

    + + +

    Environment variables can be logged in the access log using + the LogFormat + option %e. In addition, the decision on whether + or not to log requests can be made based on the status of + environment variables using the conditional form of the + CustomLog + directive. In combination with SetEnvIf this allows for flexible control of which + requests are logged. For example, you can choose not to log + requests for filenames ending in gif, or you can + choose to only log requests from clients which are outside your + subnet.

    + + +

    Conditional Response Headers

    + + +

    The Header + directive can use the presence or + absence of an environment variable to determine whether or not + a certain HTTP header will be placed in the response to the + client. This allows, for example, a certain response header to + be sent only if a corresponding header is received in the + request from the client.

    + + + +

    External Filter Activation

    + + +

    External filters configured by mod_ext_filter + using the ExtFilterDefine directive can + by activated conditional on an environment variable using the + disableenv= and enableenv= options.

    + + +

    URL Rewriting

    + + +

    The %{ENV:variable} form of + TestString in the RewriteCond allows mod_rewrite's rewrite + engine to make decisions conditional on environment variables. + Note that the variables accessible in mod_rewrite + without the ENV: prefix are not actually environment + variables. Rather, they are variables special to + mod_rewrite which cannot be accessed from other + modules.

    + +
    top
    +
    +

    Special Purpose Environment Variables

    + + +

    Interoperability problems have led to the introduction of + mechanisms to modify the way Apache behaves when talking to + particular clients. To make these mechanisms as flexible as + possible, they are invoked by defining environment variables, + typically with BrowserMatch, though SetEnv and PassEnv could also be used, for example.

    + +

    downgrade-1.0

    + + +

    This forces the request to be treated as a HTTP/1.0 request + even if it was in a later dialect.

    + + +

    force-gzip

    + +

    If you have the DEFLATE filter activated, this + environment variable will ignore the accept-encoding setting of + your browser and will send compressed output unconditionally.

    + +

    force-no-vary

    + + +

    This causes any Vary fields to be removed from + the response header before it is sent back to the client. Some + clients don't interpret this field correctly; setting this + variable can work around this problem. Setting this variable + also implies force-response-1.0.

    + + +

    force-response-1.0

    + + +

    This forces an HTTP/1.0 response to clients making an HTTP/1.0 + request. It was originally + implemented as a result of a problem with AOL's proxies. Some + HTTP/1.0 clients may not behave correctly when given an HTTP/1.1 + response, and this can be used to interoperate with them.

    + + + +

    gzip-only-text/html

    + + +

    When set to a value of "1", this variable disables the + DEFLATE output filter provided by + mod_deflate for content-types other than + text/html. If you'd rather + use statically compressed files, mod_negotiation + evaluates the variable as well (not only for gzip, but for all + encodings that differ from "identity").

    + + +

    no-gzip

    + +

    When set, the DEFLATE filter of + mod_deflate will be turned off and + mod_negotiation will refuse to deliver encoded + resources.

    + + + +

    no-cache

    +

    Available in versions 2.2.12 and later

    + +

    When set, mod_cache will not save an otherwise + cacheable response. This environment variable does not influence + whether a response already in the cache will be served for the current + request.

    + + + +

    nokeepalive

    + + +

    This disables KeepAlive + when set.

    + + + +

    prefer-language

    + +

    This influences mod_negotiation's behaviour. If + it contains a language tag (such as en, ja + or x-klingon), mod_negotiation tries + to deliver a variant with that language. If there's no such variant, + the normal negotiation process + applies.

    + + + +

    redirect-carefully

    + + +

    This forces the server to be more careful when sending a redirect + to the client. This is typically used when a client has a known + problem handling redirects. This was originally implemented as a + result of a problem with Microsoft's WebFolders software which has + a problem handling redirects on directory resources via DAV + methods.

    + + + +

    suppress-error-charset

    + + +

    Available in versions after 2.0.54

    + +

    When Apache issues a redirect in response to a client request, + the response includes some actual text to be displayed in case + the client can't (or doesn't) automatically follow the redirection. + Apache ordinarily labels this text according to the character set + which it uses, which is ISO-8859-1.

    + +

    However, if the redirection is to a page that uses a different + character set, some broken browser versions will try to use the + character set from the redirection text rather than the actual page. + This can result in Greek, for instance, being incorrectly rendered.

    + +

    Setting this environment variable causes Apache to omit the character + set for the redirection text, and these broken browsers will then correctly + use that of the destination page.

    + +
    +

    Security note

    + +

    Sending error pages without a specified character set may + allow a cross-site-scripting attack for existing browsers (MSIE) + which do not follow the HTTP/1.1 specification and attempt to + "guess" the character set from the content. Such browsers can + be easily fooled into using the UTF-7 character set, and UTF-7 + content from input data (such as the request-URI) will not be + escaped by the usual escaping mechanisms designed to prevent + cross-site-scripting attacks.

    +
    + + + +

    force-proxy-request-1.0, proxy-nokeepalive, proxy-sendchunked, + proxy-sendcl, proxy-chain-auth, proxy-interim-response, proxy-initial-not-pooled

    + +

    These directives alter the protocol behavior of + mod_proxy. See the mod_proxy and mod_proxy_http + documentation for more details.

    + + +

    ap_trust_cgilike_cl

    +

    Available in 2.4.59 and later

    +

    This variable allows a script running in CGI-like module to supply it's + own Content-Length HTTP response header. It should + only be set on configuration sections that contain trusted scripts. +

    + + +
    top
    +
    +

    Examples

    + + +

    Passing broken headers to CGI scripts

    + + +

    Starting with version 2.4, Apache is more strict about how HTTP + headers are converted to environment variables in mod_cgi + and other modules: Previously any invalid characters + in header names were simply translated to underscores. This allowed + for some potential cross-site-scripting attacks via header injection + (see + Unusual Web Bugs, slide 19/20).

    + +

    If you have to support a client which sends broken headers and + which can't be fixed, a simple workaround involving mod_setenvif + and mod_headers allows you to still accept + these headers:

    + +
    #
    +# The following works around a client sending a broken Accept_Encoding
    +# header.
    +#
    +SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1
    +RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding
    + + + + +

    Changing protocol behavior with misbehaving clients

    + + +

    Earlier versions recommended that the following lines be included in + httpd.conf to deal with known client problems. Since the affected clients + are no longer seen in the wild, this configuration is likely no-longer + necessary.

    +
    #
    +# The following directives modify normal HTTP response behavior.
    +# The first directive disables keepalive for Netscape 2.x and browsers that
    +# spoof it. There are known problems with these browser implementations.
    +# The second directive is for Microsoft Internet Explorer 4.0b2
    +# which has a broken HTTP/1.1 implementation and does not properly
    +# support keepalive when it is used on 301 or 302 (redirect) responses.
    +#
    +BrowserMatch "Mozilla/2" nokeepalive
    +BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
    +
    +#
    +# The following directive disables HTTP/1.1 responses to browsers which
    +# are in violation of the HTTP/1.0 spec by not being able to understand a
    +# basic 1.1 response.
    +#
    +BrowserMatch "RealPlayer 4\.0" force-response-1.0
    +BrowserMatch "Java/1\.0" force-response-1.0
    +BrowserMatch "JDK/1\.0" force-response-1.0
    + + + +

    Do not log requests for images in the access log

    + + +

    This example keeps requests for images from appearing in the + access log. It can be easily modified to prevent logging of + particular directories, or to prevent logging of requests + coming from particular hosts.

    + +
    SetEnvIf Request_URI \.gif image-request
    +SetEnvIf Request_URI \.jpg image-request
    +SetEnvIf Request_URI \.png image-request
    +CustomLog "logs/access_log" common env=!image-request
    + + + +

    Prevent "Image Theft"

    + + +

    This example shows how to keep people not on your server + from using images on your server as inline-images on their + pages. This is not a recommended configuration, but it can work + in limited circumstances. We assume that all your images are in + a directory called /web/images.

    + +
    SetEnvIf Referer "^http://www\.example\.com/" local_referal
    +# Allow browsers that do not send Referer info
    +SetEnvIf Referer "^$" local_referal
    +<Directory "/web/images">
    +    Require env local_referal
    +</Directory>
    + + +

    For more information about this technique, see the + "Keeping Your Images from Adorning Other Sites" + tutorial on ServerWatch.

    + +
    +
    +

    Available Languages:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/env.html.fr.utf8 b/docs/manual/env.html.fr.utf8 new file mode 100644 index 0000000..7807ba9 --- /dev/null +++ b/docs/manual/env.html.fr.utf8 @@ -0,0 +1,568 @@ + + + + + +Apache httpd et les variables d'environnement - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Apache httpd et les variables d'environnement

    +
    +

    Langues Disponibles:  en  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Deux types de variables d'environnement affectent le serveur + HTTP Apache.

    + +

    Le premier type correspond aux variables d'environnement + contrôlées par le système d'exploitation sous-jacent et définies + avant le démarrage du serveur. Leurs valeurs peuvent être utilisées + directement dans les fichiers de configuration, et peuvent + éventuellement être transmises aux scripts CGI et SSI à l’aide de la + directive PassEnv.

    + +

    Le second type correspond aux variables nommées appelées aussi + variables d'environnement dans lesquelles le serveur HTTP + Apache stocke des informations via un mécanisme spécial. Ces + informations peuvent servir à contrôler diverses opérations comme + l'enregistrement des traces ou le contrôle d'accès. On utilise aussi ces + variables dans le mécanisme de communication avec les programmes externes + comme les scripts CGI. Ce document présente différentes méthodes pour + manipuler et utiliser ces variables.

    + +

    Bien que ces variables soient référencées comme variables + d'environnement, il ne faut pas les confondre avec les variables + d'environnement contrôlées par le système d'exploitation sous-jacent. + En fait, ces variables sont stockées et manipulées dans une structure + interne à Apache httpd. Elles ne deviennent de véritables variables + d'environnement du système d'exploitation que lorsqu'elles sont mises à la + disposition de scripts CGI et de scripts inclus côté serveur (SSI). Si vous + souhaitez manipuler l'environnement du système d'exploitation sous lequel + le serveur s'exécute, vous devez utiliser les mécanismes standards de + manipulation de l'environnement fournis par l'interpréteur de commandes + (shell) de votre système d'exploitation.

    +
    + +
    top
    +
    +

    Définition des variables d'environnement

    + + + +

    Manipulations de base de l'environnement

    + + +

    La méthode la plus élémentaire pour définir une variable + d'environnement au niveau d'Apache httpd consiste à utiliser la directive + inconditionnelle SetEnv. Les variables peuvent aussi être transmises depuis + l'environnement du shell à partir duquel le serveur a été démarré en + utilisant la directive + PassEnv.

    + + +

    Définitions conditionnelles en fonction des requêtes

    + + +

    Pour plus de souplesse, les directives fournies par le module + mod_setenvif permettent de définir les + variables d'environnement en tenant compte des caractéristiques + de chaque requête. Par exemple, une + variable pourrait n'être définie que lorsqu'un navigateur spécifique + (User-Agent) a généré la requête, ou seulement quand un en-tête + Referer particulier est présent. La directive + RewriteRule du module + mod_rewrite qui utilise l'option + [E=...] pour définir + les variables d'environnement apporte encore plus de souplesse.

    + + +

    Identifiants uniques

    + + +

    Finalement, le module mod_unique_id définit la variable + d'environnement UNIQUE_ID pour chaque requête à une valeur + qui est garantie unique parmi « toutes Â» les requêtes sous des + conditions très spécifiques.

    + + +

    Variables CGI standards

    + + +

    En plus de l'ensemble des variables d'environnement internes à la + configuration d'Apache httpd et de celles transmises depuis le shell, + les scripts CGI et les pages SSI + se voient affectés un ensemble de variables + d'environnement contenant des méta-informations à propos de la requête + comme préconisé dans la + spécification + sur les CGIs.

    + + +

    Quelques mises en garde

    + + +
      +
    • Les directives de manipulation de l'environnement ne permettent + pas de supplanter ou modifier les variables CGI standards.
    • + +
    • Lorsqu'on utilise suexec pour exécuter des + scripts CGI, l'environnement est nettoyé et réduit à un ensemble de + variables sûres avant l'exécution du script. La liste des + variables sûres est définie à la compilation dans + suexec.c.
    • + +
    • Pour des raisons de portabilité, les noms des variables + d'environnement ne peuvent contenir que des lettres, des chiffres et + le caractère « souligné Â». En outre, le premier caractère ne doit pas + être un chiffre. Les caractères qui ne satisfont pas à ces conditions + seront remplacés par un caractère « souligné Â» quand ils seront + transmis aux scripts CGI et aux pages SSI.
    • + +
    • Les contenus d'en-têtes HTTP transmis aux scripts de type + CGI ou autre à l’aide de variables d'environnement constituent un + cas particulier (voir plus loin). Leur nom est converti en + majuscules et seuls les tirets sont remplacés par des + caractères '_' (« souligné Â») ; si le format du nom de l'en-tête + n'est pas valide, celui-ci est ignoré. Voir plus loin pour une solution de + contournement du problème.
    • + +
    • La directive SetEnv s'exécute assez tard au + cours du traitement de la requête, ce qui signifie que des + directives telles que SetEnvIf et RewriteCond ne verront pas + les variables qu'elle aura définies.
    • + +
    • Lorsque le serveur cherche un chemin via une sous-requête interne (par exemple la + recherche d'un DirectoryIndex), ou lorsqu'il génère un + listing du contenu d'un répertoire à l’aide du module + mod_autoindex, la sous-requête n'hérite pas des + variables d'environnement spécifiques à la requête. En outre, à cause + des phases de l'API auxquelles mod_setenvif prend + part, les directives SetEnvIf ne sont pas évaluées + séparément dans la sous-requête.
    • +
    + +
    top
    +
    +

    Utilisation des variables d'environnement

    + + + + +

    Scripts CGI

    + + +

    La communication d'informations aux scripts CGI constitue une des + principales utilisations des variables d'environnement. Comme indiqué + plus haut, l'environnement transmis aux scripts CGI comprend des + méta-informations standards à propos de la requête, en plus des + variables définies dans la configuration d'Apache httpd. Pour plus de + détails, se référer au + tutoriel CGI.

    + + +

    Pages SSI

    + + +

    Les documents inclus côté serveur (SSI) traités par le filtre + INCLUDES du module mod_include, + peuvent afficher les + variables d'environnement à l'aide de l'élément echo, + et peuvent utiliser des variables d'environnement dans les éléments + de contrôle de flux pour rendre certaines parties d'une page + conditionnelles en fonction des caractéristiques de la requête. + Apache httpd fournit aussi les variables d'environnement CGI standards + aux pages SSI + comme indiqué plus haut. Pour plus de détails, se référer au + tutoriel SSI.

    + + +

    Contrôle d'accès

    + + +

    L'accès au serveur peut être contrôlé en fonction de la valeur de + variables d'environnement à l'aide des directives + Require env et Require not env. + En association avec la directive + SetEnvIf, cela confère une + grande souplesse au contrôle d'accès au serveur en fonction des + caractéristiques du client. Par exemple, vous pouvez utiliser ces + directives pour interdire l'accès depuis un navigateur particulier + (User-Agent). +

    + + +

    Enregistrement conditionnel des traces

    + + +

    Les variables d'environnement peuvent être enregistrées dans le + fichier de log des accès à l'aide de l'option %e de la + directive LogFormat. + En outre, la décision de tracer ou non les requêtes peut être prise + en fonction de l'état de variables d'environnement en utilisant la + forme conditionnelle de la directive + CustomLog. En + association avec la directive SetEnvIf, cela confère une grande souplesse au contrôle + du traçage des requêtes. Par exemple, vous pouvez choisir de ne pas + tracer les requêtes pour des noms de fichiers se terminant par + gif, ou encore de ne tracer que les requêtes des clients + n'appartenant pas à votre sous-réseau.

    + + +

    En-têtes de réponse conditionnels

    + + +

    La directive Header + peut se baser sur la présence ou l'absence d'une variable + d'environnement pour décider si un certain en-tête HTTP sera placé + dans la réponse au client. Cela permet, par exemple, de n'envoyer un + certain en-tête de réponse que si un en-tête correspondant est présent + dans la requête du client.

    + + + +

    Activation de filtres externes

    + + +

    Les filtres externes configurés par le module + mod_ext_filter à l'aide de la directive ExtFilterDefine peuvent être + activés de manière conditionnelle en fonction d'une variable + d'environnement à l'aide des options + disableenv= et enableenv=.

    + + +

    Réécriture d'URL

    + + +

    La forme %{ENV:variable} de + TestString dans la + directive RewriteCond + permet au moteur de réécriture du module + mod_rewrite de prendre des + décisions conditionnées par des variables d'environnement. + Notez que les variables accessibles dans + mod_rewrite sans le préfixe + ENV: ne sont pas de véritables variables + d'environnement. Ce sont plutôt des variables spécifiques à + mod_rewrite + qui ne sont pas accessibles pour les autres modules.

    + +
    top
    +
    +

    Variables d'environnement à usage spécial

    + + +

    Des problèmes d'interopérabilité ont conduit à l'introduction de + mécanismes permettant de modifier le comportement d'Apache httpd lorsqu'il + dialogue avec certains clients. Afin de rendre ces mécanismes aussi + souples que possible, ils sont invoqués en définissant des variables + d'environnement, en général à l'aide de la directive + BrowserMatch, bien que les + directives SetEnv et + PassEnv puissent aussi être + utilisées, par exemple.

    + +

    downgrade-1.0

    + + +

    Cela force le traitement d'une requête comme une requête HTTP/1.0 + même si elle a été rédigée dans un langage plus récent.

    + + +

    force-gzip

    + +

    Si le filtre DEFLATE est activé, cette variable + d'environnement ignorera les réglages accept-encoding de votre + navigateur et enverra une sortie compressée inconditionnellement.

    + +

    force-no-vary

    + + +

    Cette variable entraîne la suppression de tout champ + Vary des en-têtes de la réponse avant que cette dernière + soit renvoyée au client. Certains clients n'interprètent pas ce champ + correctement, et la définition de cette variable permet de contourner + ce problème, mais implique aussi la définition de + force-response-1.0.

    + + +

    force-response-1.0

    + + +

    Cette variable force une réponse en langage HTTP/1.0 aux clients + qui envoient des requêtes dans le même langage. Elle fut implémentée à + l'origine suite à des problèmes avec les mandataires d'AOL. Certains + clients en langage HTTP/1.0 ne réagissent pas correctement face à une + réponse en langage HTTP/1.1, et cette variable peut être utilisée pour + assurer l'interopérabilité avec eux.

    + + + +

    gzip-only-text/html

    + + +

    Positionnée à « 1 Â», cette variable désactive le filtre en sortie + DEFLATE fourni par le module mod_deflate pour les + types de contenu autres que text/html. Si vous préférez + utiliser des fichiers compressés statiquement, + mod_negotiation évalue aussi la variable (non + seulement pour gzip, mais aussi pour tous les encodages autres que + « identity Â»).

    + + +

    no-gzip

    + +

    Quand cette variable est définie, le filtre DEFLATE du + module mod_deflate est désactivé, et + mod_negotiation refusera de délivrer des ressources + encodées.

    + + + +

    no-cache

    +

    Disponible dans les versions 2.2.12 et ultérieures d'Apache httpd

    + +

    Lorsque cette variable est définie, + mod_cache ne sauvegardera pas de réponse + susceptible d'être mise en cache. Cette variable d'environnement + n'a aucune incidence sur le fait qu'une réponse déjà enregistrée + dans le cache soit utilisée ou non pour la requête courante.

    + + + +

    nokeepalive

    + + +

    Quand cette variable est définie, la directive + KeepAlive est désactivée.

    + + + +

    prefer-language

    + +

    Cette variable modifie le comportement du module + mod_negotiation. Si elle contient un symbole de + langage (tel que en, ja + ou x-klingon), mod_negotiation essaie de + délivrer une variante dans ce langage. S'il n'existe pas de telle + variante, le processus normal de + négociation s'applique.

    + + + +

    redirect-carefully

    + + +

    Cette variable force le serveur à être plus prudent lors de l'envoi + d'une redirection au client. Elle est en général utilisée quand un + client présente un problème connu avec les redirections. Elle fut + implémentée à l'origine suite a un problème rencontré avec le logiciel + WebFolders de Microsoft qui ne gère pas correctement les redirections + vers des ressources de type répertoire via des méthodes DAV.

    + + + +

    suppress-error-charset

    + + +

    Disponible dans les versions postérieures à 2.0.54

    + +

    Quand Apache httpd génère une redirection en réponse à une requête client, + la réponse inclut un texte destiné à être affiché au cas où le client ne + suivrait pas, ou ne pourrait pas suivre automatiquement la redirection. + Habituellement, Apache httpd marque ce texte en accord avec le jeu de caractères + qu'il utilise, à savoir ISO-8859-1.

    +

    Cependant, si la redirection fait référence à une page qui utilise un + jeu de caractères différent, certaines versions de navigateurs obsolètes + essaieront d'utiliser le jeu de caractères du texte de la redirection + plutôt que celui de la page réelle. + Cela peut entraîner, par exemple, un rendu incorrect du Grec.

    +

    Si cette variable d'environnement est définie, Apache httpd omettra le jeu de + caractères pour le texte de la redirection, et les navigateurs obsolètes + précités utiliseront correctement celui de la page de destination.

    + +
    +

    Note concernant la sécurité

    + +

    L'envoi de pages d'erreur sans spécifier un jeu de caractères peut + conduire à des attaques de type "cross-site-scripting" pour les + navigateurs qui ne respectent pas la spécification HTTP/1.1 (MSIE) et + tentent de déduire le jeu de caractères à partir du contenu. De tels + navigateurs peuvent être facilement trompés et utiliser le jeu de + caractères UTF-7 ; les contenus des données en entrée de type UTF-7 + (comme les URI de requête) ne seront alors plus protégés par les + mécanismes d'échappement usuels conçus pour prévenir les attaques + de type "cross-site-scripting".

    +
    + + + +

    force-proxy-request-1.0, proxy-nokeepalive, proxy-sendchunked, + proxy-sendcl, proxy-chain-auth, proxy-interim-response, proxy-initial-not-pooled

    + +

    Ces directives modifient le comportement protocolaire du module + mod_proxy. Voir la documentation sur + mod_proxy et mod_proxy_http pour plus de détails.

    + + +

    ap_trust_cgilike_cl

    +

    Disponible à partir de la version 2.4.59 du serveur HTTP Apache

    +

    Cette variable permet à un script qui s’exécute dans un module de type CGI + de fournir son propre en-tête de réponse HTTP Content-Length. Elle ne doit + être définie que dans les sections de configuration qui contiennent des + scripts de confiance.

    + + +
    top
    +
    +

    Exemples

    + + +

    Transmission du contenu d'en-têtes non valides aux scripts + CGI

    + + +

    Avec la version 2.4, Apache httpd est plus strict avec la conversion + des en-têtes HTTP en variables d'environnement dans + mod_cgi et d'autres modules : dans les versions + précédentes, tout caractère non valable dans les noms d'en-têtes + était tout simplement remplacé par un caractère '_', ce qui + pouvait exposer à des attaques de type cross-site-scripting via + injection d'en-têtes (voir Bogues + du Web inhabituelles, planche 19/20).

    + +

    Si vous devez prendre en charge un client qui envoie des en-têtes non + conformes et si ceux-ci ne peuvent pas être corrigés, il existe + une solution de contournement simple mettant en jeu les modules + mod_setenvif et mod_headers, + et permettant de prendre en compte ces en-têtes :

    + +
    # L'exemple suivant montre comment prendre en compte un en-tête
    +# Accept_Encoding non conforme envoyé par un client. +# +SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1 +RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding
    + + + + +

    Modification du comportement protocolaire face à des clients + réagissant de manière non conforme

    + + +

    Les versions antérieures recommandaient l'ajout de ces lignes dans + httpd.conf pour tenir compte de problèmes connus avec certains clients. + Comme les clients concernés sont maintenant très peu utilisés, cet + ajout n'est pratiquement plus nécessaire.

    +
    #
    +# The following directives modify normal HTTP response behavior.
    +# The first directive disables keepalive for Netscape 2.x and browsers that
    +# spoof it. There are known problems with these browser implementations.
    +# The second directive is for Microsoft Internet Explorer 4.0b2
    +# which has a broken HTTP/1.1 implementation and does not properly
    +# support keepalive when it is used on 301 or 302 (redirect) responses.
    +#
    +BrowserMatch "Mozilla/2" nokeepalive
    +BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
    +
    +#
    +# The following directive disables HTTP/1.1 responses to browsers which
    +# are in violation of the HTTP/1.0 spec by not being able to grok a
    +# basic 1.1 response.
    +#
    +BrowserMatch "RealPlayer 4\.0" force-response-1.0
    +BrowserMatch "Java/1\.0" force-response-1.0
    +BrowserMatch "JDK/1\.0" force-response-1.0
    + + + +

    Ne pas tracer les requêtes pour des images dans le fichier de + trace des accès

    + + +

    Dans cet exemple, les requêtes pour des images n'apparaissent pas + dans le fichier de trace des accès. Il peut être facilement adapté pour + empêcher le traçage de répertoires particuliers, ou de requêtes + en provenance de certains hôtes.

    +
    SetEnvIf Request_URI \.gif image-request
    +SetEnvIf Request_URI \.jpg image-request
    +SetEnvIf Request_URI \.png image-request
    +CustomLog "logs/access_log" common env=!image-request
    + + + +

    Prévention du « Vol d'image Â»

    + + +

    Cet exemple montre comment empêcher les utilisateurs ne faisant pas + partie de votre serveur d'utiliser des images de votre serveur comme + images en ligne dans leurs pages. Cette configuration n'est pas + recommandée, mais elle peut fonctionner dans des circonstances bien + définies. Nous supposons que toutes vos images sont enregistrées dans + un répertoire nommé /web/images.

    +
    SetEnvIf Referer "^http://www\.example\.com/" local_referal
    +# Autorise les navigateurs qui n'envoient aucune information de Referer
    +SetEnvIf Referer "^$" local_referal
    +<Directory "/web/images">
    +    Require env local_referal
    +</Directory>
    + + +

    Pour plus d'informations sur cette technique, voir le tutoriel sur + ServerWatch + "Keeping Your Images from Adorning Other Sites".

    + +
    +
    +

    Langues Disponibles:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/env.html.ja.utf8 b/docs/manual/env.html.ja.utf8 new file mode 100644 index 0000000..a2ea316 --- /dev/null +++ b/docs/manual/env.html.ja.utf8 @@ -0,0 +1,456 @@ + + + + + +Apache ã®ç’°å¢ƒå¤‰æ•° - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    Apache ã®ç’°å¢ƒå¤‰æ•°

    +
    +

    翻訳済ã¿è¨€èªž:  en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + +

    Apache HTTP サーãƒã¯ç’°å¢ƒå¤‰æ•°ã¨å‘¼ã°ã‚Œã‚‹ã€åå‰ã®ã¤ã„㟠+ å¤‰æ•°ã«æƒ…報を記憶ã™ã‚‹ä»•組ã¿ã‚’æä¾›ã—ã¦ã„ã¾ã™ã€‚ã“ã®æƒ…å ±ã¯ãƒ­ã‚°åŽé›†ã‚„ + アクセス制御ãªã©ã®ã„ã‚ã„ã‚ãªæ“作を制御ã™ã‚‹ãŸã‚ã«ä½¿ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã“れらã®å¤‰æ•°ã¯ CGI スクリプトãªã©ã®å¤–部プログラムã¨é€šä¿¡ã™ã‚‹ãŸã‚ã«ã‚‚ + 使ã‚れã¾ã™ã€‚ã“ã®æ–‡æ›¸ã¯ãれらã®å¤‰æ•°ã®æ“作方法ã¨ä½¿ç”¨æ–¹æ³•ã‚’ã„ãã¤ã‹ + 紹介ã—ã¾ã™ã€‚

    + +

    ã“れらã®å¤‰æ•°ã¯ç’°å¢ƒå¤‰æ•°ã¨å‘¼ã°ã‚Œã¦ã„ã¾ã™ãŒã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚° + システムã«ã‚ˆã£ã¦åˆ¶å¾¡ã•れã¦ã„る環境変数ã¨åŒã˜ã§ã¯ã‚りã¾ã›ã‚“。 + 実際ã¯ã€ã“れらã®å¤‰æ•°ã¯ Apache ã®å†…部構造ã®ä¸­ã«è¨˜æ†¶ã•ã‚Œã€æ“作ã•れã¦ã„ã¾ã™ã€‚ + ãれらã¯ã€CGI ã‚„ SSI ã‚¹ã‚¯ãƒªãƒ—ãƒˆã«æ¸¡ã•れãŸã¨ãã ã‘ã€å®Ÿéš›ã® + オペレーティングシステムã®ç’°å¢ƒå¤‰æ•°ã«ãªã‚Šã¾ã™ã€‚サーãƒè‡ªèº«ãŒ + 実行ã•れã¦ã„るオペレーティングシステムã®ç’°å¢ƒã‚’æ“作ã—ãŸã„å ´åˆã¯ã€ + オペレーティングシステムã®ã‚·ã‚§ãƒ«ãŒæä¾›ã—ã¦ã„る標準ã®ç’°å¢ƒå¤‰æ•°ã® + æ“作方法を使ã‚ãªã‘れã°ãªã‚Šã¾ã›ã‚“。

    +
    + +
    top
    +
    +

    環境変数ã®è¨­å®š

    + + + +

    基本的ãªç’°å¢ƒã®æ“作

    + + +

    Apache ã«ãŠã„ã¦ç’°å¢ƒå¤‰æ•°ã‚’設定ã™ã‚‹ä¸€ç•ªåŸºæœ¬çš„ãªæ–¹æ³•ã¯ã€ + ç„¡æ¡ä»¶ã«ç’°å¢ƒå¤‰æ•°ã‚’設定ã™ã‚‹ SetEnv ディレクティブを使用ã™ã‚‹ã“ã¨ã§ã™ã€‚ + PassEnv + ディレクティブã«ã‚ˆã‚Šã€Apache ãŒèµ·å‹•ã•れãŸã‚·ã‚§ãƒ«ã® + 環境変数を渡ã™ã“ã¨ã‚‚ã§ãã¾ã™ã€‚

    + + +

    ãƒªã‚¯ã‚¨ã‚¹ãƒˆæ¯Žã«æ¡ä»¶ã«åŸºã¥ã„ã¦è¨­å®šã™ã‚‹

    + + +

    より柔軟性を高ã‚ã‚‹ãŸã‚ã«ã€mod_setenvif + ã§æä¾›ã•れã¦ã„るディレクティブを使用ã™ã‚‹ã“ã¨ã§ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã® + 特性ã«åŸºã¥ã„ã¦ç’°å¢ƒå¤‰æ•°ã‚’設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚例ãˆã°ã€ç‰¹å®šã®ãƒ–ラウザ + (User-Agent) ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚„特定㮠Referer [æ„図的ãªç¶´ã‚Šã§ã™] + (訳注: æ­£ã—ã„綴り㯠referrer ã§ã™ãŒã€HTTP ã®ä»•様ã§ã¯ Referer + ã¨ãªã£ã¦ã„ã¾ã™)ヘッダãŒè¦‹ã¤ã‹ã£ãŸã¨ãã®ã¿å¤‰æ•°ã‚’設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + mod_rewrite ã® RewriteRule + ディレクティブã«ãŠã„ã¦ç’°å¢ƒå¤‰æ•°ã‚’設定ã™ã‚‹ [E=...] + オプションを使用ã™ã‚‹ã“ã¨ã§ã€ + より柔軟ãªè¨­å®šã‚’行ãªã†ã“ã¨ãŒã§ãã¾ã™ã€‚

    + + +

    一æ„ãªè­˜åˆ¥å­

    + + +

    mod_unique_id ã¯ã€éžå¸¸ã«é™ã‚‰ã‚ŒãŸæ¡ä»¶ã®ä¸‹ã§ + 「ã™ã¹ã¦ã€ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¤ã„ã¦ã€ä¸€æ„ã§ã‚ã‚‹ã“ã¨ãŒä¿è¨¼ã•れã¦ã„る値を環境変数 + UNIQUE_ID ã«è¨­å®šã—ã¾ã™ã€‚

    + + +

    標準 CGI 変数

    + + +

    Apache ã®è¨­å®šãƒ•ァイルã§è¨­å®šã•れãŸç’°å¢ƒå¤‰æ•°ã¨ã‚·ã‚§ãƒ«ã‹ã‚‰æ¸¡ã•れる + 環境変数ã«åŠ ãˆã¦ã€CGI スクリプト㨠SSI ページã«ã¯ CGI ã®ä»•様ã§è¦æ±‚ã•れã¦ã„る〠+ リクエストã®ãƒ¡ã‚¿æƒ…報をæŒã£ãŸç’°å¢ƒå¤‰æ•°ã®çµ„ãŒæä¾›ã•れã¾ã™ã€‚

    + + +

    ã„ãã¤ã‹ã®æ³¨æ„

    + + +
      +
    • 環境をæ“作ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–を使ã£ã¦æ¨™æº– CGI + 変数を上書ãã—ãŸã‚Šå¤‰æ›´ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
    • + +
    • CGI スクリプトを起動ã™ã‚‹ãŸã‚ã« suexec + ãŒä½¿ç”¨ã•れã¦ã„ã‚‹å ´åˆã€CGI スクリプトãŒèµ·å‹•ã™ã‚‹ãŸã‚ã«ã€ç’°å¢ƒå¤‰æ•°ã¯å®‰å…¨ãªç’°å¢ƒå¤‰æ•°ã®çµ„ã«æ•´ç†ã•れã¾ã™ã€‚ + ã“ã®å®‰å…¨ãªç’°å¢ƒå¤‰æ•°ã®é›†åˆã¯ã€ã‚³ãƒ³ãƒ‘イル時㫠suexec.c + ã§å®šç¾©ã•れã¾ã™ã€‚
    • + +
    • ç§»æ¤æ€§ã®ãŸã‚ã«ã€ç’°å¢ƒå¤‰æ•°ã®åå‰ã¯ã‚¢ãƒ«ãƒ•ァベット〠+ æ•°å­—ã¨ã‚¢ãƒ³ãƒ€ãƒ¼ã‚¹ã‚³ã‚¢ (訳注: '_') ã ã‘ã‹ã‚‰æˆã‚Šã¾ã™ã€‚ + ã•らã«ã€æœ€åˆã®æ–‡å­—ã¯æ•°å­—ã§ã‚ã£ã¦ã¯ã„ã‘ã¾ã›ã‚“。 + ã“ã®åˆ¶é™ã«åˆã‚ãªã„文字㯠CGI スクリプト㨠SSI + ãƒšãƒ¼ã‚¸ã«æ¸¡ã•れるã¨ãã«ã‚¢ãƒ³ãƒ€ãƒ¼ã‚¹ã‚³ã‚¢ã«ç½®æ›ã•れã¾ã™ã€‚
    • + +
    • SetEnv ã¯ãƒªã‚¯ã‚¨ã‚¹ãƒˆå‡¦ç†ã® + 段階ã®ä¸­ã§ã‚‚é…ãã«å®Ÿè¡Œã•れã¾ã™ã€‚ã¤ã¾ã‚Š + SetEnvIf ã‚„ + RewriteCond + ãªã©ã‹ã‚‰ã¯ã€å¤‰æ•°ãŒãã“ã§è¨­å®šã•れã¦ã„ã‚‹ã“ã¨ãŒã‚ã‹ã‚Šã¾ã›ã‚“。
    • +
    + +
    top
    +
    +

    環境変数ã®ä½¿ç”¨

    + + + + +

    CGI スクリプト

    + + +

    環境変数ã®ä¸»ãªåˆ©ç”¨æ³•ã®ä¸€ã¤ã¯ã€CGI ã‚¹ã‚¯ãƒªãƒ—ãƒˆã«æƒ…報をä¼ãˆã‚‹ã“ã¨ã§ã™ã€‚ + 上ã§èª¬æ˜Žã•れã¦ã„るよã†ã«ã€CGI ã‚¹ã‚¯ãƒªãƒ—ãƒˆã«æ¸¡ã•れる環境変数㯠Apache + ã®è¨­å®šã«ã‚ˆã‚Šè¨­å®šã•れる変数ã«åŠ ãˆã¦ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®æ¨™æº–ã®ãƒ¡ã‚¿æƒ…報をå«ã‚“ã§ã„ã¾ã™ã€‚ + 詳細㯠CGI ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ« + ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

    + + +

    SSI ページ

    + + +

    mod_include ã® INCLUDES フィルタã§å‡¦ç†ã•れる + server-parsed (SSI) ドキュメントã§ã¯ã€echo + è¦ç´ ã‚’使用ã™ã‚‹ã¨ç’°å¢ƒå¤‰æ•°ãŒå‡ºåŠ›ã•れã¾ã™ã€‚ + ã¾ãŸã€ãƒšãƒ¼ã‚¸ã®ã‚る部分ãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã®æ€§è³ªã«å¿œã˜ã¦å¤‰æ›´ã•れるよã†ã«ã€ + 環境変数をフロー制御è¦ç´ ã§ä½¿ã†ã“ã¨ãŒã§ãã¾ã™ã€‚詳細㯠+ SSI ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ« ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

    + + +

    アクセス制御

    + + +

    allow from env= ディレクティブ㨠deny from env= + ディレクティブを使用ã—ã¦ã€ã‚µãƒ¼ãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’環境変数ã®å€¤ã§åˆ¶å¾¡ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + SetEnvIf + ディレクティブã¨çµ„ã¿åˆã‚ã›ã‚‹ã“ã¨ã§ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®ç‰¹æ€§ã«åŸºã¥ã„㦠+ サーãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã‚’柔軟ã«è¡Œãªã†ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ + ãŸã¨ãˆã°ã€ã“れらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–を使用ã—ã¦ã€ç‰¹å®šã®ãƒ–ラウザ (User-Agent) + ã‹ã‚‰ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + + +

    æ¡ä»¶ä»˜ãログ記録

    + + +

    LogFormat + ディレクティブã®ã‚ªãƒ—ション %e + を使用ã™ã‚‹ã“ã¨ã§ã€ç’°å¢ƒå¤‰æ•°ã‚’アクセスログã«è¨˜éŒ²ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã•らã«ã€ + CustomLog + ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã®æ¡ä»¶åˆ†å²å¼ã‚’使用ã™ã‚‹ã“ã¨ã§ã€ + 環境変数ã®å€¤ã«ã‚ˆã£ã¦ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ログã«è¨˜éŒ²ã™ã‚‹ã‹ã©ã†ã‹ã‚’決ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + SetEnvIf + ディレクティブã¨çµ„ã¿åˆã‚ã›ã‚‹ã“ã¨ã§ã€ + ã©ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ログã«è¨˜éŒ²ã™ã‚‹ã‹ã‚’柔軟ã«åˆ¶å¾¡ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ãŸã¨ãˆã°ã€ + gif ã§çµ‚ã‚るファイルåã¸ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ãƒ­ã‚°ã«è¨˜éŒ²ã—ãªã„〠+ é•ã†ã‚µãƒ–ãƒãƒƒãƒˆã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã ã‘をログã«è¨˜éŒ²ã™ã‚‹ã€ + ã¨ã„ã†é¸æŠžãŒå¯èƒ½ã§ã™ã€‚

    + + +

    æ¡ä»¶ä»˜ã応答ヘッダ

    + + +

    Header + ディレクティブã¯ç’°å¢ƒå¤‰æ•°ã®å­˜åœ¨ã‚„ä¸åœ¨ã«ã‚ˆã£ã¦ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¸ã®å¿œç­”ã«ç‰¹å®šã® + HTTP ヘッダを付ã‘ã‚‹ã‹ã©ã†ã‹ã‚’決ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã“れã«ã‚ˆã‚Šã€ãŸã¨ãˆã°ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆ + ã«ã‚るヘッダãŒã‚ã‚‹å ´åˆã«ã®ã¿ç‰¹å®šã®å¿œç­”ヘッダをé€ã‚‹ã€ã¨ã„ã†ã‚ˆã†ãªã“ã¨ãŒ + ã§ãã¾ã™ã€‚

    + + + +

    外部フィルタã®é©ç”¨

    + + +

    ExtFilterDefine + ディレクティブを使用ã—㦠+ mod_ext_filter ã§è¨­å®šã•れる外部フィルタã¯ã€ + disableenv= 㨠enableenv= + オプションを使ã£ã¦ã€ç’°å¢ƒå¤‰æ•°ã«ã‚ˆã‚‹æ¡ä»¶ä»˜ãé©ç”¨ãŒã§ãã¾ã™ã€‚

    + + +

    URL ã®æ›¸ãæ›ãˆ

    + + +

    RewriteCond + ディレクティブã§è©•価文字列ã¨ã—㦠+ %{ENV:...} å¼ã‚’指定ã™ã‚‹ã“ã¨ã§ã€mod_rewrite + ã®æ›¸ãæ›ãˆã‚¨ãƒ³ã‚¸ãƒ³ãŒç’°å¢ƒå¤‰æ•°ã«åŸºã„ã¦æ¡ä»¶åˆ†å²ã‚’行ãªã†ã“ã¨ãŒã§ãã¾ã™ã€‚ + mod_rewrite ãŒä½¿ç”¨å¯èƒ½ãªå¤‰æ•°ã§ ENV: ãŒå‰ã«ã¤ã„ã¦ã„ãªã„変数ã¯ã€ + 実際ã¯ç’°å¢ƒå¤‰æ•°ã§ã¯ãªã„ã¨ã„ã†ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。 + ãれらã¯ä»–ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‹ã‚‰ã¯ä½¿ç”¨ã§ããªã„ mod_rewrite 用ã®ç‰¹åˆ¥ãªå¤‰æ•°ã§ã™ã€‚ +

    + +
    top
    +
    +

    特別ãªç›®çš„ã®ç’°å¢ƒå¤‰æ•°

    + + +

    äº’æ›æ€§ã®å•題を解決ã™ã‚‹ãŸã‚ã«ã€ç‰¹å®šã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¨é€šä¿¡ã—ã¦ã„ã‚‹ã¨ã㯠+ Apache ã®å‹•作を変更ã§ãる機構ãŒå°Žå…¥ã•れã¾ã—ãŸã€‚ã§ãã‚‹ã ã‘柔軟ã«ã™ã‚‹ãŸã‚ã«ã€ + ã“ã‚Œã‚‰ã®æ©Ÿæ§‹ã¯ç’°å¢ƒå¤‰æ•°ã‚’定義ã™ã‚‹ã“ã¨ã§å‘¼ã³å‡ºã•れã¾ã™ã€‚普通ã¯ã€ + BrowserMatch + ディレクティブを使ã„ã¾ã™ãŒã€ãŸã¨ãˆã° SetEnv ディレクティブや PassEnv ディレクティブも使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    downgrade-1.0

    + + +

    ã“れを指定ã™ã‚‹ã“ã¨ã§ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒ HTTP/1.0 + より新ã—ã„プロトコルã®å ´åˆã§ã‚‚ã€HTTP/1.0 ã¨ã—ã¦æ‰±ã‚れã¾ã™ã€‚

    + + +

    force-gzip

    + +

    DEFLATE フィルタãŒä½¿ç”¨ã™ã‚‹ã‚ˆã†ã«è¨­å®šã•れã¦ã„ã‚‹ã¨ãã«ã€ + ã“ã®ç’°å¢ƒå¤‰æ•°ã¯ãƒ–ラウザ㮠accept-encoding ã®è¨­å®šã‚’無視ã—ã¦å¸¸ã« + 圧縮ã•れãŸå‡ºåŠ›ã‚’é€ã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚

    + +

    force-no-vary

    + + +

    応答ヘッダãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«é€ã‚‰ã‚Œã‚‹å‰ã« Vary + フィールドをå–り除ãã¾ã™ã€‚ + クライアントã®ä¸­ã«ã¯ã“ã®ãƒ•ィールドを正ã—ã解釈ã—ãªã„ã‚‚ã®ãŒã‚りã¾ã™ã€‚ + ã“ã®å¤‰æ•°ã‚’設定ã™ã‚‹ã“ã¨ã§ãã®å•題を回é¿ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã“ã®å¤‰æ•°ã‚’設定ã™ã‚‹ã¨ã€force-response-1.0 + ãŒè¨­å®šã•れãŸã“ã¨ã«ãªã‚Šã¾ã™ã€‚

    + + +

    force-response-1.0

    + + +

    ã“れãŒè¨­å®šã•れã¦ã„ã‚‹ã¨ã€HTTP/1.0 リクエストを発行ã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«å¯¾ã—ã¦ã¯ + 常㫠HTTP/1.0 ã§å¿œç­”ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€ + 元々㯠AOL ã®ãƒ—ロキシã®å•題ã®ãŸã‚ã«å®Ÿè£…ã•れã¾ã—ãŸã€‚HTTP/1.0 クライアントã®ä¸­ã«ã¯ã€ + HTTP/1.1 ã®å¿œç­”ã‚’è¿”ã•ã‚Œã‚‹ã¨æ­£ã—ã動作ã—ãªã„ã‚‚ã®ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 + ã“ã®æ©Ÿèƒ½ã‚’使用ã™ã‚‹ã“ã¨ã§ã€ãã®ã‚ˆã†ãªã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¨ã®é–“ã®äº’æ›æ€§å•題を解決ã§ãã¾ã™ã€‚

    + + +

    gzip-only-text/html

    + + +

    ã“れ㌠1 ã«è¨­å®šã•れるã¨ã€ã“ã®å¤‰æ•°ã¯ text/html + 以外ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒˆã‚¿ã‚¤ãƒ—ã«å¯¾ã™ã‚‹ã€mod_deflate + æä¾›ã® DEFLATE 出力フィルタを無効ã«ã—ã¾ã™ã€‚ + ã¾ãŸã€é™çš„ã«ã€æ—¢ã«åœ§ç¸®ã•れãŸãƒ•ァイルを使用ã—ãŸã„å ´åˆã€ + (gzip ã ã‘ã§ãªãã€"identity" ã¨ç•°ãªã‚‹å…¨ã¦ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã«å¯¾ã—ã¦) + mod_negotiation も変数を評価ã—ã¾ã™ã€‚

    + + +

    no-gzip

    +

    セットã•れるã¨ã€mod_deflate ã® + DEFLATE フィルタãŒã‚ªãƒ•ã«ãªã‚Šã¾ã™ã€‚ + ãã—㦠mod_negotiation + ã¯ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•れãŸãƒªã‚½ãƒ¼ã‚¹ã‚’é€ã‚‰ãªã„よã†ã«ã—ã¾ã™ã€‚

    + + +

    nokeepalive

    + + +

    ã“れãŒè¨­å®šã•れã¦ã„ã‚‹å ´åˆã¯ã€KeepAlive を使用ã—ãªã„よã†ã«ã—ã¾ã™ã€‚

    + +

    prefer-language

    + +

    mod_negotiation ã®æŒ™å‹•ã«å½±éŸ¿ã‚’与ãˆã¾ã™ã€‚ + (en, ja, x-klingonã¨ã„ã£ãŸ) + è¨€èªžã‚¿ã‚°ãŒæ ¼ç´ã•れã¦ã„れã°ã€ãã®è¨€èªžã® variant ã‚’é€ä¿¡ã—よã†ã¨ã—ã¾ã™ã€‚ + ãã®ã‚ˆã†ãª variant ãŒãªã„å ´åˆã¯ã€ + 通常ã®ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³å‡¦ç†ãŒ + é©ç”¨ã•れã¾ã™ã€‚

    + + + + +

    redirect-carefully

    + + +

    ã“れã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã®é€ä¿¡ã‚’サーãƒãŒã‚ˆã‚Šæ³¨æ„æ·±ã + 行ãªã†ã‚ˆã†ã«ã—ã¾ã™ã€‚ + ã“れã¯é€šå¸¸ã€ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã«éš›ã—ã¦ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã« + å•題ãŒã‚ã‚‹ã“ã¨ãŒåˆ†ã‹ã£ã¦ã„ã‚‹å ´åˆã«ä½¿ã‚れã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯å…ƒã€…㯠+ マイクロソフトã®ã‚¦ã‚§ãƒ–フォルダã®ã‚½ãƒ•ト㌠DAV + メソッドã«ã‚ˆã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒªã‚½ãƒ¼ã‚¹ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã®æ‰±ã„ã« + å•題ãŒã‚Šã€ãれを回é¿ã™ã‚‹ãŸã‚ã«å®Ÿè£…ã•れã¾ã—ãŸã€‚

    + + + +

    suppress-error-charset

    + + +

    Apache 2.2 以é™ã§åˆ©ç”¨å¯èƒ½

    + +

    クライアントã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«å¯¾ã™ã‚‹å¿œç­”ã¨ã—ã¦ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’é€ä¿¡ã™ã‚‹éš›ã€ + レスãƒãƒ³ã‚¹ã«ã¯ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆãŒè‡ªå‹•çš„ã«è¡Œãªãˆãªã„ (行ãªã‚れãªã„) + å ´åˆã«è¡¨ç¤ºã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆãŒå«ã¾ã‚Œã¾ã™ã€‚ + 通常ã€ã“ã®ãƒ†ã‚­ã‚¹ãƒˆã«åˆè‡´ã—ãŸã‚­ãƒ£ãƒ©ã‚¯ã‚¿ã‚»ãƒƒãƒˆã€ISO-8859-1 + ã§ãƒ©ãƒ™ãƒ«ä»˜ã‘ã‚’ã—ã¾ã™ã€‚

    +

    ã—ã‹ã—ã€ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆå…ˆãŒåˆ¥ã®æ–‡å­—セットを使ã£ã¦ã„ã‚‹å ´åˆã€ + ã‚ã‚‹å•題ã®ã‚るブラウザã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€ + リダイレクト先ã®å®Ÿéš›ã®æ–‡å­—セットã®ä»£ã‚りã«ã€ + ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆå…ƒã®æ–‡å­—セットを使ã£ã¦ã—ã¾ã†ã“ã¨ãŒã‚りã¾ã™ã€‚ + ãã®çµæžœã€ä¾‹ãˆã°å¤‰ãªæç”»ãŒè¡Œãªã‚れãŸã‚Šã—ã¦ã€èª­ã‚ãªããªã£ãŸã‚Šã—ã¾ã™ã€‚

    +

    ã“ã®ç’°å¢ƒå¤‰æ•°ã‚’設定ã™ã‚‹ã“ã¨ã§ã€ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«å¯¾ã™ã‚‹ + ã‚­ãƒ£ãƒ©ã‚¯ã‚¿ã‚»ãƒƒãƒˆã®æŒ‡å®šã‚’除去ã—ã¾ã™ã®ã§ã€ãれらå•題ã®ã‚るブラウザã§ã‚‚ + ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆå…ˆã®æ–‡å­—セットを正ã—ã使ã†ã‚ˆã†ã«ã§ãã¾ã™ã€‚

    + +
    +

    セキュリティ

    + +

    文字セットを指定ã›ãšã«ã‚¨ãƒ©ãƒ¼ãƒšãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹ã¨ã€ + クロスサイトスクリプティング (訳注: XSS) + 攻撃ã®å±é™ºæ€§ãŒã§ã¦ãã¾ã™ã€‚ + HTTP/1.1 ä»•æ§˜ã«æº–æ‹ ã—ã¦ã„ãªãã¦ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ä¸­èº«ã‹ã‚‰æ–‡å­—セットを + "推測" ã—よã†ã¨ã™ã‚‹ãƒ–ラウザ (MSIE) ãŒå®Ÿéš›ã«ã‚ã‚‹ã‹ã‚‰ã§ã™ã€‚ + ãã®ã‚ˆã†ãªãƒ–ラウザ㯠UTF-7 文字セットを使ã£ã¦ç°¡å˜ã«é¨™ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ + クロスサイトスクリプティング攻撃を防ããŸã‚ã«å®Ÿè£…ã•れã¦ã„ã‚‹ + 通常ã®ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—機構ãŒã€å…¥åŠ›ãƒ‡ãƒ¼ã‚¿ä¸­ã«ã‚ã‚‹ UTF-7 ã§ + エンコードã•れãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ (リクエスト URI ãªã©) ã«ã¯ + ã†ã¾ã動作ã—ãªã„ã‹ã‚‰ã§ã™ã€‚

    +
    + + + +

    force-proxy-request-1.0, proxy-nokeepalive, proxy-sendchunked, proxy-sendcl

    + +

    ã“ã‚Œã‚‰ã®æŒ‡ç¤ºå­ã¯ mod_proxy ã®æŒ™å‹•を変更ã—ã¾ã™ã€‚ + 詳細㯠mod_proxy ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’ã”å‚ç…§ãã ã•ã„。

    + + +
    top
    +
    +

    例

    + + +

    ãŠã‹ã—ãªæŒ™å‹•ã‚’ã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«å¯¾ã—ã¦ãƒ—ロトコルã®å‹•作を変更ã™ã‚‹

    + + +

    クライアントã«é–¢ã™ã‚‹æ—¢çŸ¥ã®å•題ã«å¯¾å‡¦ã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã®è¡Œã‚’ + httpd.conf ã«å…¥ã‚Œã‚‹ã“ã¨ã‚’推奨ã—ã¦ã„ã¾ã™ã€‚

    +

    å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® Apache ã§ã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®å•題ã«å¯¾å¿œã™ã‚‹ãŸã‚ã« + httpd.conf ã«æ¬¡ã®è¡Œã‚’加ãˆã‚‹ã‚ˆã†æŽ¨å¥¨ã•れã¦ã„ã¾ã—ãŸãŒã€ + 今ã¨ãªã£ã¦ã¯ã€å•題ã¨ã—ã¦ã„ãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯å®Ÿéš›ã«ã¯è¦‹ã‹ã‘ã‚‹ã“ã¨ã¯ + ãªããªã£ã¦ããŸã®ã§ã€ã“ã®è¨­å®šã¯ã‚‚ã¯ã‚„å¿…è¦ãªã„ã‹ã‚‚ã—れã¾ã›ã‚“。

    +
    #
    +# The following directives modify normal HTTP response behavior.
    +# The first directive disables keepalive for Netscape 2.x and browsers that
    +# spoof it. There are known problems with these browser implementations.
    +# The second directive is for Microsoft Internet Explorer 4.0b2
    +# which has a broken HTTP/1.1 implementation and does not properly
    +# support keepalive when it is used on 301 or 302 (redirect) responses.
    +#
    +BrowserMatch "Mozilla/2" nokeepalive
    +BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
    +
    +#
    +# The following directive disables HTTP/1.1 responses to browsers which
    +# are in violation of the HTTP/1.0 spec by not being able to grok a
    +# basic 1.1 response.
    +#
    +BrowserMatch "RealPlayer 4\.0" force-response-1.0
    +BrowserMatch "Java/1\.0" force-response-1.0
    +BrowserMatch "JDK/1\.0" force-response-1.0
    + + +

    ç”»åƒã¸ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’アクセスログã«è¨˜éŒ²ã—ãªã„

    + + +

    ã“ã®ä¾‹ã§ã¯ã€ç”»åƒã¸ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒã‚¢ã‚¯ã‚»ã‚¹ãƒ­ã‚°ã«ç¾ã‚Œãªã„よã†ã«ã—ã¾ã™ã€‚ + ã“れを変更ã™ã‚‹ã“ã¨ã§ã€ç‰¹å®šã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ­ã‚°åŽé›†ã‚’ã‚„ã‚ãŸã‚Šã€ + 特定ã®ãƒ›ã‚¹ãƒˆã‹ã‚‰ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ãƒ­ã‚°åŽé›†ã‚’ã‚„ã‚ãŸã‚Šã™ã‚‹ã“ã¨ãŒç°¡å˜ã«ã§ãã¾ã™ã€‚ +

    +
    SetEnvIf Request_URI \.gif image-request
    +SetEnvIf Request_URI \.jpg image-request
    +SetEnvIf Request_URI \.png image-request
    +CustomLog logs/access_log common env=!image-request
    + + +

    「画åƒã®ç›—用ã€ã‚’防ã

    + + +

    ã“ã®ä¾‹ã¯ã€åˆ¥ã®ã‚µãƒ¼ãƒã«ã„る人ãŒã€ã‚ãªãŸã®ã‚µãƒ¼ãƒã«ã‚ã‚‹ç”»åƒã‚’ + inline ç”»åƒã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã“ã¨ã‚’防ãŽã¾ã™ã€‚ + ã“ã‚Œã¯æŽ¨å¥¨ã•れã¦ã„る設定ã§ã¯ã‚りã¾ã›ã‚“ãŒã€ã‚ã‚‹é™å®šã•れãŸçжæ³ã§ã¯æœ‰åйã§ã™ã€‚ + ã“ã“ã§ã¯ã€ã™ã¹ã¦ã®ç”»åƒã¯ /web/images + ã¨ã„ã†ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚ã‚‹ã¨ä»®å®šã—ã¾ã™ã€‚

    +
    SetEnvIf Referer "^http://www\.example\.com/" local_referal
    +# Allow browsers that do not send Referer info
    +SetEnvIf Referer "^$" local_referal
    +<Directory /web/images>
    +   Order Deny,Allow
    +   Deny from all
    +   Allow from env=local_referal
    +</Directory>
    + +

    ã“ã®æ‰‹æ³•ã«é–¢ã™ã‚‹è©³ã—ã„æƒ…報㯠ServerWatch ã«ã‚ã‚‹ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ« + 「Keeping Your Images from Adorning Other Sites + ã€ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

    + +
    +
    +

    翻訳済ã¿è¨€èªž:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/env.html.ko.euc-kr b/docs/manual/env.html.ko.euc-kr new file mode 100644 index 0000000..24a117b --- /dev/null +++ b/docs/manual/env.html.ko.euc-kr @@ -0,0 +1,400 @@ + + + + + +¾ÆÆÄÄ¡ÀÇ È¯°æº¯¼ö - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡ÀÇ È¯°æº¯¼ö

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + +

    ¾ÆÆÄÄ¡ À¥¼­¹ö´Â ȯ°æº¯¼ö(environment variable)¶ó´Â + º¯¼ö¿¡ Á¤º¸¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Ù. ÀÌ Á¤º¸¸¦ »ç¿ëÇÏ¿© ·Î±×³ª + Á¢±ÙÁ¦¾î µî ¿©·¯ ÀÛ¾÷À» Á¶ÀýÇÑ´Ù. ¶Ç, ȯ°æº¯¼ö´Â CGI ½ºÅ©¸³Æ®¿Í + °°Àº ¿ÜºÎ ÇÁ·Î±×·¥°ú Åë½ÅÇÏ´Â ¼ö´ÜÀÌ µÈ´Ù. ÀÌ ¹®¼­´Â ȯ°æº¯¼ö¸¦ + ´Ù·ç°í »ç¿ëÇÏ´Â ´Ù¾çÇÑ ¹æ¹ýµéÀ» ¼³¸íÇÑ´Ù.

    + +

    ÀÌ º¯¼öµéÀ» ȯ°æº¯¼ö¶ó°í ºÎ¸£Áö¸¸, ¿î¿µÃ¼Á¦¿¡¼­ + ¸»Çϴ ȯ°æº¯¼ö¿Í ´Ù¸£´Ù. ÀÌ º¯¼ö´Â ¾ÆÆÄÄ¡ ³»ºÎ¿¡ ÀúÀåµÇ°í + »ç¿ëµÈ´Ù. ȯ°æº¯¼ö´Â CGI ½ºÅ©¸³Æ®³ª Server Side Include + ½ºÅ©¸³Æ®·Î ³Ñ°ÜÁú¶§¸¸ ½ÇÁ¦ ¿î¿µÃ¼Á¦ ȯ°æº¯¼ö°¡ µÈ´Ù. ¼­¹ö¸¦ + ½ÇÇàÇÏ´Â ¿î¿µÃ¼Á¦ ȯ°æÀ» ¼öÁ¤ÇÏ°í ½Í´Ù¸é ¿î¿µÃ¼Á¦ ½©¿¡¼­ + ȯ°æÀ» ¼öÁ¤ÇØ¾ß ÇÑ´Ù.

    +
    + +
    top
    +
    +

    ȯ°æº¯¼ö ¼³Á¤Çϱâ

    + + + +

    ±âº»ÀûÀΠȯ°æ¼³Á¤

    + + +

    ¾ÆÆÄÄ¡¿¡¼­ ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÏ´Â °¡Àå ±âº»ÀûÀÎ ¹æ¹ýÀº + ¹«Á¶°ÇÀûÀÎ SetEnv Áö½Ã¾î¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. PassEnv Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© + ¼­¹ö¸¦ ½ÃÀÛÇÑ ½©¿¡¼­ ȯ°æº¯¼ö¸¦ °¡Á®¿Ã ¼öµµ ÀÖ´Ù.

    + + +

    ¿äû¿¡ µû¸¥ Á¶°ÇºÎ ¼³Á¤

    + + +

    ´õ À¯¿¬ÇϰÔ, mod_setenvif°¡ Á¦°øÇÏ´Â Áö½Ã¾î´Â ¿äû¸¶´Ù + ¿äûÀÇ Æ¯Â¡¿¡ µû¶ó ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù. ¿¹¸¦ µé¾î, ƯÁ¤ + ºê¶ó¿ìÀú·Î (User-Agent) ¿äûÇϰųª ƯÁ¤ Referer (¸ÂÃã¹ýÀÌ + Ʋ¸®Áö ¾Ê¾Ò´Ù) Çì´õ°¡ ÀÖ´Â °æ¿ì¿¡¸¸ º¯¼ö¸¦ ¼³Á¤ÇÒ ¼ö + ÀÖ´Ù. ½ÉÁö¾î mod_rewrite¿¡ ÀÖ´Â RewriteRuleÀÇ + [E=...] ¿É¼ÇÀ» »ç¿ëÇÏ¿© ´õ À¯¿¬ÇÏ°Ô È¯°æº¯¼ö¸¦ + ¼³Á¤ÇÒ ¼öµµ ÀÖ´Ù.

    + + +

    À¯ÀÏÇÑ ½Äº°ÀÚ

    + + +

    ¸¶Áö¸·À¸·Î mod_unique_id´Â °¢ ¿äû¿¡ ´ëÇØ ¾î¶² °æ¿ì¿¡µµ + "¸ðµç" ¿äûÁß¿¡ È®½ÇÈ÷ À¯ÀÏÇÑ(°ãÄ¡Áö¾ÊÀº) °ªÀ¸·Î + UNIQUE_ID ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù.

    + + +

    Ç¥ÁØ CGI º¯¼ö

    + + +

    CGI ½ºÅ©¸³Æ®¿Í SSI ¹®¼­´Â ¾ÆÆÄÄ¡ ¼³Á¤¿¡¼­ ¼³Á¤ÇÏ¿´°Å³ª + ½©¿¡¼­ °¡Á®¿Â ȯ°æº¯¼ö ¿Ü¿¡ Ãß°¡·Î CGI ±Ô¾àÀÌ ±ÔÁ¤ÇÑ + ¿äû¿¡ ´ëÇÑ Á¤º¸¸¦ ¾Ë·ÁÁִ ȯ°æº¯¼öµéÀ» ¹Þ´Â´Ù.

    + + +

    ÁÖÀÇÇÒ Á¡

    + + +
      +
    • ȯ°æ¼³Á¤ Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© Ç¥ÁØ CGI º¯¼ö¸¦ ¹«½ÃÇϰųª + ¼öÁ¤ÇÒ ¼ö ¾ø´Ù.
    • + +
    • suexec°¡ CGI ½ºÅ©¸³Æ®¸¦ + ½ÇÇàÇÏ´Â °æ¿ì, ½ÃÀÛÇϱâÀü¿¡ CGI ½ºÅ©¸³Æ®ÀÇ È¯°æÀº + ¾ÈÀüÇÑ º¯¼öµé¸¸ °¡Áöµµ·Ï û¼ÒµÈ´Ù. + ¾ÈÀüÇÑ º¯¼ö ¸ñ·ÏÀº ÄÄÆÄÀϽà + suexec.c¿¡ Á¤ÀǵȴÙ.
    • + +
    • Æ÷ÆÃÀ» À§ÇØ È¯°æº¯¼ö À̸§¿¡´Â ¿ÀÁ÷ ¹®ÀÚ, ¼ýÀÚ, + ¹ØÁÙ¹®ÀÚ¸¸ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¶Ç, ù¹øÂ° ¹®ÀÚ·Î + ¼ýÀÚ¸¦ »ç¿ëÇÏÁö¾Ê´Â °ÍÀÌ ÁÁ´Ù. CGI ½ºÅ©¸³Æ®³ª SSI + ÆäÀÌÁö¿¡ ³Ñ¾î°¥¶§ ÀÌ¿ÜÀÇ ¹®ÀÚ´Â ¹ØÁÙ·Î ´ëüµÈ´Ù.
    • +
    + +
    top
    +
    +

    ȯ°æº¯¼ö »ç¿ëÇϱâ

    + + + + +

    CGI ½ºÅ©¸³Æ®

    + + +

    ȯ°æº¯¼öÀÇ ÁÖµÈ ¿ëµµÁß Çϳª´Â CGI ½ºÅ©¸³Æ®¿Í Á¤º¸¸¦ + ±³È¯ÇÏ´Â °ÍÀÌ´Ù. ¾Õ¿¡¼­ ¼³¸íÇßµíÀÌ ¾ÆÆÄÄ¡ ¼³Á¤¿¡¼­ ¼³Á¤ÇÑ + º¯¼ö¿Ü¿¡ ¿äû¿¡ ´ëÇÑ Ç¥ÁØ Á¤º¸¸¦ °¡Áø º¯¼ö°¡ CGI ½ºÅ©¸³Æ®·Î + ³Ñ¾î°£´Ù. ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº CGI + ÅõÅ丮¾óÀ» Âü°íÇ϶ó.

    + + +

    SSI ÆäÀÌÁö

    + + +

    mod_includeÀÇ INCLUDES ÇÊÅͰ¡ ó¸®ÇÏ´Â + ¼­¹öÆÄ½Ì (SSI) ¹®¼­´Â echo ¿ä¼Ò¸¦ »ç¿ëÇÏ¿© + ȯ°æº¯¼ö¸¦ Ãâ·ÂÇÒ ¼ö ÀÖ°í, ȯ°æº¯¼ö¸¦ »ç¿ëÇÏ¿© ¿äûÀÇ + Ư¡¿¡ µû¶ó È帧Á¦¾î ¿ä¼Ò·Î ÆäÀÌÁöÀÇ ÀϺθ¦ º¯°æÇÒ ¼ö + ÀÖ´Ù. ¾ÆÆÄÄ¡´Â ¶Ç SSI ¹®¼­¿¡°Ô À§¿¡¼­ ¼³¸íÇÑ Ç¥ÁØ CGI + ȯ°æº¯¼ö¸¦ Á¦°øÇÑ´Ù. ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº SSI ÅõÅ丮¾óÀ» Âü°íÇ϶ó.

    + + +

    Á¢±ÙÁ¦¾î

    + + +

    allow from env=°ú deny from env= + Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ȯ°æº¯¼ö °ª¿¡ µû¶ó ¼­¹ö·ÎÀÇ Á¢±ÙÀ» + Á¶ÀýÇÒ ¼ö ÀÖ´Ù. SetEnvIf¿Í °°ÀÌ »ç¿ëÇϸé + Ŭ¶óÀ̾ðÆ®ÀÇ Æ¯Â¡¿¡ µû¶ó ÀÚÀ¯·Ó°Ô ¼­¹ö·ÎÀÇ Á¢±ÙÀ» Á¦¾îÇÒ + ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ƯÁ¤ ºê¶ó¿ìÀúÀÇ (User-Agent) Á¢±ÙÀ» + °ÅºÎÇÒ ¼ö ÀÖ´Ù.

    + + +

    Á¶°ÇºÎ ·Î±×

    + + +

    LogFormatÀÇ + %e ¿É¼ÇÀ» »ç¿ëÇÏ¿© ȯ°æº¯¼ö¸¦ Á¢±Ù ·Î±×¿¡ + ±â·ÏÇÒ ¼ö ÀÖ´Ù. ¶Ç, CustomLog Áö½Ã¾îÀÇ + Á¶°ÇºÎ Çü½ÄÀ» »ç¿ëÇϸé ȯ°æº¯¼öÀÇ »óȲ¿¡ µû¶ó ¿äûÀ» + ·Î±×ÇÒÁö ¿©ºÎ¸¦ °áÁ¤ÇÒ ¼ö ÀÖ´Ù. SetEnvIf¿Í °°ÀÌ »ç¿ëÇÏ¿© + ¾î¶² ¿äûÀ» ·Î±×ÇÒÁö ÀÚÀ¯·Ó°Ô °áÁ¤ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, + ÆÄÀϸíÀÌ gif·Î ³¡³ª´Â ¿äûÀº ·Î±×ÇÏÁö ¾Ê°Å³ª, + ¿ÜºÎ ³×Æ®¿÷¿¡ Àִ Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû¸¸À» ·Î±×ÇÒ ¼ö ÀÖ´Ù.

    + + +

    Á¶°ÇºÎ ÀÀ´ä Çì´õ

    + + +

    Header + Áö½Ã¾î´Â Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ÀÀ´äÀ» º¸³¾¶§ ȯ°æº¯¼öÀÇ À¯¹«¿¡ + µû¶ó ¾î¶² HTTP Çì´õ¸¦ Æ÷ÇÔÇÒÁö °áÁ¤ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ + µé¾î, Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû¿¡ ƯÁ¤ Çì´õ°¡ ÀÖ´Â °æ¿ì¿¡¸¸ + ¾î¶² ÀÀ´ä Çì´õ¸¦ º¸³¾ ¼ö ÀÖ´Ù.

    + + + +

    ¿ÜºÎ ÇÊÅÍ ½ÇÇàÇϱâ

    + + +

    mod_ext_filterÀÇ ExtFilterDefine + Áö½Ã¾î·Î ¼³Á¤ÇÑ ¿ÜºÎ ÇÊÅ͸¦ disableenv=¿Í + enableenv= ¿É¼ÇÀ» »ç¿ëÇÏ¿© ȯ°æº¯¼ö¿¡ µû¶ó + ¼±ÅÃÀûÀ¸·Î ½ÇÇàÇÒ ¼ö ÀÖ´Ù.

    + + +

    URL ÀçÀÛ¼º(Rewriting)

    + + +

    RewriteCondÀÇ + TestString¿¡ %{ENV:...} Çü½ÄÀ» + »ç¿ëÇϸé mod_rewriteÀÇ ÀçÀÛ¼º ¿£ÁøÀÌ È¯°æº¯¼ö¿¡ µû¶ó + ´Ù¸£°Ô ÇൿÇÑ´Ù. mod_rewrite¿¡¼­ ¾Õ¿¡ ENV:¸¦ + ºÙÀÌÁö¾Ê°í Á¢±ÙÇÏ´Â º¯¼ö´Â ½ÇÁ¦ ȯ°æº¯¼ö°¡ ¾Æ´ÔÀ» ÁÖÀÇÇ϶ó. + ±×µéÀº ´Ù¸¥ ¸ðµâ¿¡¼­ ÀÐÀ» ¼ö ¾ø´Â mod_rewrite¿¡ ÇÑÁ¤µÈ + º¯¼ö´Ù.

    + +
    top
    +
    +

    Ưº°ÇÑ ¸ñÀûÀÇ È¯°æº¯¼ö

    + + +

    Ŭ¶óÀÌ¾ðÆ®¿Í ¿øÈ°ÇÑ µ¿ÀÛÇϱâÀ§ÇØ ¾ÆÆÄÄ¡´Â Ưº°ÇÑ + Ŭ¶óÀÌ¾ðÆ®¿¡ ´ëÇØ ÀÚ½ÅÀÇ ÇൿÀ» ¼öÁ¤ÇÑ´Ù. º¸Åë BrowserMatch¿¡¼­ + ȯ°æº¯¼ö¸¦ Á¤ÀÇÇÏ¿© ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇÑ´Ù. ±×·¯³ª SetEnv¿Í PassEnv·Îµµ °¡´ÉÇÏ´Ù.

    + +

    downgrade-1.0

    + + +

    ¿äûÀÌ ÀÌÈÄ ¹öÀüÀ» »ç¿ëÇÏ´õ¶óµµ HTTP/1.0 ¿äûÀ¸·Î + ó¸®ÇÑ´Ù.

    + + +

    force-gzip

    + +

    DEFLATE ÇÊÅ͸¦ »ç¿ëÇÒ¶§ ÀÌ È¯°æº¯¼ö´Â + ºê¶ó¿ìÀúÀÇ accept-encoding ¼³Á¤À» ¹«½ÃÇÏ°í ¹«Á¶°Ç + ¾ÐÃàµÈ °á°ú¸¦ º¸³½´Ù.

    + +

    force-no-vary

    + + +

    ÀÀ´äÀ» Ŭ¶óÀÌ¾ðÆ®¿¡°Ô º¸³»±â Àü¿¡ ÀÀ´ä Çì´õ¿¡¼­ + Vary Çʵ带 »«´Ù. ¾î¶² Ŭ¶óÀÌ¾ðÆ®´Â ÀÌ + Çʵ带 Á¦´ë·Î ÇØ¼®ÇÏÁö ¸øÇÑ´Ù. ÀÌ º¯¼ö´Â ÀÌ·± ¹®Á¦¸¦ + ÇØ°áÇÑ´Ù. ¶ÇÇÑ, ÀÌ º¯¼ö´Â + force-response-1.0À» °¡Á¤ÇÑ´Ù.

    + + +

    force-response-1.0

    + + +

    HTTP/1.0 ¿äûÀ» Çϴ Ŭ¶óÀÌ¾ðÆ®¿¡°Ô HTTP/1.0 ÀÀ´äÀ» + °­Á¦ÇÑ´Ù. ¿ø·¡ AOL ÇÁ·Ï½Ã¿¡ ¹®Á¦°¡ À־ ¸¸µé¾îÁ³´Ù. + ¾î¶² HTTP/1.0 Ŭ¶óÀÌ¾ðÆ®´Â HTTP/1.1 ÀÀ´äÀ» ¹ÞÀ¸¸é Á¦´ë·Î + µ¿ÀÛÇÏÁö ¾ÊÀ¸¹Ç·Î, ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâÀ§ÇØ »ç¿ëÇÑ´Ù.

    + + +

    gzip-only-text/html

    + + +

    °ªÀÌ "1"À̸é text/htmlÀÌ ¾Æ´Ñ content-type¿¡ + ´ëÇØ mod_deflateÀÇ DEFLATE Ãâ·ÂÇÊÅ͸¦ + »ç¿ëÇÏÁö ¾Ê´Â´Ù. (gzip »Ó¸¸ ¾Æ´Ï¶ó "identity"°¡ ¾Æ´Ñ ¸ðµç + ÀÎÄÚµùÀÇ) Á¤ÀûÀ¸·Î ¾ÐÃàÇÑ ÆÄÀÏÀÇ °æ¿ì¿¡µµ + mod_negotiationÀº ÀÌ º¯¼ö¸¦ Âü°íÇÑ´Ù.

    + + +

    no-gzip

    + +

    ÀÌ ¿É¼ÇÀ» ¼³Á¤Çϸé mod_deflateÀÇ + DEFLATE ÇÊÅ͸¦ »ç¿ëÇÏÁö ¾Ê°í, + mod_negotiationÀº ÀÎÄÚµùµÈ ÀÚ¿øÀ» + º¸³»Áö ¾Ê´Â´Ù.

    + + + +

    nokeepalive

    + + +

    KeepAlive¸¦ + ¹«½ÃÇÑ´Ù.

    + + + +

    prefer-language

    + +

    ÀÌ º¯¼ö´Â mod_negotiationÀÇ Çൿ¿¡ + ¿µÇâÀ» ¹ÌÄ£´Ù. º¯¼ö°¡ (en, ja, + x-klingon µî) ¾ð¾îű׸¦ ´ã°íÀÖ´Ù¸é, + mod_negotiation´Â ±× ¾ð¾î·Î µÈ º¯ÇüÀ» + º¸³»±æ ½ÃµµÇÑ´Ù. ±×·± º¯ÇüÀÌ ¾ø´Ù¸é ÀϹÝÀûÀÎ Çù»ó °úÁ¤À» ½ÃÀÛÇÑ´Ù.

    + + + +

    redirect-carefully

    + + +

    ¼­¹ö°¡ ´õ Á¶½ÉÈ÷ Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ¸®´ÙÀÌ·º¼ÇÀ» º¸³½´Ù. + º¸Åë ¸®´ÙÀÌ·º¼ÇÀ» ó¸®Çϴµ¥ ¹®Á¦°¡ Àִ Ŭ¶óÀ̾ðÆ®À» + À§ÇØ »ç¿ëÇÑ´Ù. ¿ø·¡ MicrosoftÀÇ WebFolders ¼ÒÇÁÆ®¿þ¾î°¡ + DAV ¸Þ½áµå¸¦ ÅëÇØ µð·ºÅ丮 ÀÚ¿øÀÇ ¸®´ÙÀÌ·º¼ÇÀ» ó¸®Çϴµ¥ + ¹®Á¦°¡ À־ ¸¸µé¾îÁ³´Ù.

    + + + +

    suppress-error-charset

    + + +

    2.0.40 ÀÌÈÄ ¹öÀü¿¡ ÀÖ´Ù

    + +

    ¾ÆÆÄÄ¡°¡ Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû¿¡ ´ëÇÑ ÀÀ´äÀ¸·Î ¸®´ÙÀÌ·º¼ÇÀ» + º¸³¾¶§ Ŭ¶óÀÌ¾ðÆ®°¡ ÀÚµ¿À¸·Î ¸®´ÙÀÌ·º¼ÇÀ» µû¶ó°¡Áö ¸øÇÏ´Â(ȤÀº + ¾Ê´Â) °æ¿ì¿¡ ´ëºñÇÏ¿© ÀÀ´ä¿¡ »ç¿ëÀÚ¿¡°Ô º¸¿©ÁÙ ¹®±¸¸¦ Æ÷ÇÔÇÑ´Ù. + ¾ÆÆÄÄ¡´Â º¸Åë ÀÌ ±ÛÀ» ¾ÆÆÄÄ¡°¡ »ç¿ëÇÏ´Â ¹®ÀÚÁýÇÕÀÎ ISO-8859-1·Î + Ç¥½ÃÇÑ´Ù.

    +

    ±×·¯³ª ¸®´ÙÀÌ·º¼ÇµÈ ÆäÀÌÁö°¡ ´Ù¸¥ ¹®ÀÚÁýÇÕÀ» »ç¿ëÇÒ °æ¿ì + ¾î¶² ÀÌ»óÇÑ ºê¶ó¿ìÀú ¹öÀüÀº ½ÇÁ¦ ÆäÀÌÁö°¡ ¾Æ´Ï¶ó ¸®´ÙÀÌ·º¼Ç + ÆäÀÌÁöÀÇ ¹®ÀÚÁýÇÕÀ» »ç¿ëÇÏ·Á°í ÇÑ´Ù. ¿¹¸¦ µé¾î, ±×¸®½º¾î°¡ + ÀÌ»óÇÏ°Ô º¸ÀÏ ¼ö ÀÖ´Ù.

    +

    ÀÌ È¯°æº¯¼ö´Â ¾ÆÆÄÄ¡°¡ ¸®´ÙÀÌ·º¼Ç ÆäÀÌÁö¿¡ ¹®ÀÚÁýÇÕÀ» + ¼³Á¤ÇÏÁö¾Êµµ·Ï ÇÏ¿©, ÀÌ·± ºê¶ó¿ìÀú°¡ ½ÇÁ¦ ÆäÀÌÁöÀÇ ¹®ÀÚÁýÇÕÀ» + ¿Ã¹Ù·Î »ç¿ëÇÏ°Ô ¸¸µç´Ù.

    + + + +
    top
    +
    +

    ¿¹Á¦

    + + +

    À߸ø µ¿ÀÛÇϴ Ŭ¶óÀÌ¾ðÆ®µéÀ» À§ÇØ ÇÁ·ÎÅäÄÝ Çൿ + º¯°æÇϱâ

    + + +

    Ŭ¶óÀÌ¾ðÆ®µéÀÇ ÀÌ¹Ì ¾Ë·ÁÁø ¹®Á¦¸¦ ÇØ°áÇϱâÀ§ÇØ + httpd.conf¿¡ ´ÙÀ½ ³»¿ëÀ» Æ÷ÇÔÇÏ±æ ¹Ù¶õ´Ù.

    +
    #
    +# ´ÙÀ½ Áö½Ã¾îµéÀº ÀϹÝÀûÀÎ HTTP ÀÀ´äÀ» º¯°æÇÑ´Ù.
    +# ù¹øÂ° Áö½Ã¾î´Â Netscape 2.x¿Í À̸¦ °¡ÀåÇÑ ºê¶ó¿ìÀú¿¡°Ô
    +# keepalive¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù. ÀÌµé ºê¶ó¿ìÀú ±¸Çö¿¡ ¹®Á¦°¡ ÀÖ´Ù.
    +# µÎ¹øÂ° Áö½Ã¾î´Â HTTP/1.1 ±¸ÇöÀÌ À߸øµÇ¾ú°í 301À̳ª 302
    +# (¸®´ÙÀÌ·º¼Ç) ÀÀ´ä¿¡ »ç¿ëÇÑ keepalive¸¦ Á¦´ë·Î Áö¿øÇÏÁö
    +# ¸øÇÏ´Â Microsoft Internet Explorer 4.0b2¸¦ À§ÇÑ °ÍÀÌ´Ù.
    +#
    +BrowserMatch "Mozilla/2" nokeepalive
    +BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
    +
    +#
    +# ´ÙÀ½ Áö½Ã¾î´Â ±âº»ÀûÀÎ HTTP/1.1 ÀÀ´äÀ» ÀÌÇØÇÏÁö ¸øÇÏ¿©
    +# HTTP/1.0 ±Ô¾àÀ» ¾î±â´Â ºê¶ó¿ìÀú¿¡°Ô HTTP/1.1 ÀÀ´äÀ» º¸³»Áö ¾Ê´Â´Ù.
    +#
    +BrowserMatch "RealPlayer 4\.0" force-response-1.0
    +BrowserMatch "Java/1\.0" force-response-1.0
    +BrowserMatch "JDK/1\.0" force-response-1.0
    + + +

    Á¢±Ù ·Î±×¿¡ À̹ÌÁö¿¡ ´ëÇÑ ¿äûÀ» ·Î±×ÇÏÁö ¾Ê±â

    + + +

    ÀÌ ¿¹Á¦´Â À̹ÌÁö¿¡ ´ëÇÑ ¿äûÀ» Á¢±Ù ·Î±×¿¡ ±â·ÏÇÏÁö + ¾Ê´Â´Ù. ƯÁ¤ µð·ºÅ丮¿¡ ´ëÇÑ È¤Àº ƯÁ¤ È£½ºÆ®¿¡¼­ ¿Â + ¿äûÀ» ·Î±×ÇÏÁö ¾Êµµ·Ï ½±°Ô ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.

    +
    SetEnvIf Request_URI \.gif image-request
    +SetEnvIf Request_URI \.jpg image-request
    +SetEnvIf Request_URI \.png image-request
    +CustomLog logs/access_log common env=!image-request
    + + +

    "À̹ÌÁö µµµÏ" ¹æÁö

    + + +

    ÀÌ ¿¹´Â ÇöÀç ¼­¹ö¿ÜÀÇ »ç¿ëÀÚ°¡ ÆäÀÌÁö¿¡ ¼­¹ö¿¡ ÀÖ´Â + À̹ÌÁö¸¦ Æ÷ÇÔÇÏÁö ¸øÇϵµ·Ï ÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù. ÀÌ + ¼³Á¤À» ±ÇÀåÇÏÁö´Â ¾ÊÀ¸¸ç, Á¦ÇÑµÈ °æ¿ì¿¡¸¸ µ¿ÀÛÇÑ´Ù. + ¿ì¸®´Â ¸ðµç À̹ÌÁö°¡ /web/images µð·ºÅ丮 ¾È¿¡ ÀÖ´Ù°í + °¡Á¤ÇÑ´Ù.

    +
    SetEnvIf Referer "^http://www.example.com/" local_referal
    +# Referer Á¤º¸¸¦ º¸³»Áö ¾Ê´Â ºê¶ó¿ìÀú¸¦ Çã¿ëÇÑ´Ù
    +SetEnvIf Referer "^$" local_referal
    +<Directory /web/images>
    +   Order Deny,Allow
    +   Deny from all
    +   Allow from env=local_referal
    +</Directory>
    + +

    ÀÌ ±â¹ý¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº ApacheToday ÅõÅ丮¾ó " + Keeping Your Images from Adorning Other Sites"¸¦ Âü°íÇ϶ó.

    + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/env.html.tr.utf8 b/docs/manual/env.html.tr.utf8 new file mode 100644 index 0000000..51c1733 --- /dev/null +++ b/docs/manual/env.html.tr.utf8 @@ -0,0 +1,530 @@ + + + + + +Apache’de Ortam Değişkenleri - Apache HTTP Sunucusu Sürüm 2.4 + + + + + + + +
    <-
    +

    Apache’de Ortam Değişkenleri

    +
    +

    Mevcut Diller:  en  | + fr  | + ja  | + ko  | + tr 

    +
    +
    Bu çeviri güncel olmayabilir. Son değişiklikler için İngilizce sürüm geçerlidir.
    + +

    Apache HTTP Sunucusunu etkileyen ortam değişkenleri iki çeşittir.

    + +

    İlki, işletim sisteminin denetimindeki ortam değişkenleridir. Bu + değişkenlere değer atama işlemi sunucu başlatılmadan önce yapılır. + Bunlar yapılandırma dosyalarının içinde kullanılabilir. Ayrıca, + istenirse PassEnv yönergesi kullanılarak bunlar CGI betiklerine ve + SSI sayfalarına da aktarılabilir.

    + +

    İkincisi ise, Apache HTTP Sunucusunun kendi ortam değişkenleridir. + Bu değişkenlerde saklanan bilgi erişim denetimi, günlük kaydı gibi + çeşitli işlemleri denetlemekte kullanılabilir. Değişkenler ayrıca, CGI + betikleri gibi harici uygulamalarla iletişim mekanizması olarak da + kullanılabilir. Bu belgede bu değişkenler üzerindeki işlemlere ve + kullanım şekillerine değinilmiştir.

    + +

    Bu değişkenlere ortam değişkenleri dense de işletim sisteminin + ortam değişkenleri gibi değillerdir. Bunlar sadece Apache ortamında + geçerli değişkenler olup işletim sisteminin bu değişkenlerden haberi + olmaz. Sadece CGI betikleri ve SSI sayfaları gibi harici uygulamalar + tarafından üretilen ortam değişkenleri sistem ortamının değişkenleri + haline gelirler. İşletim sistemi ortamına çalışmakta olan sunucudan + müdahale etmek isterseniz işletim sisteminizin kabuğu tarafından sağlanan + standart ortam müdahale mekanizmalarını kullanmalısınız.

    +
    + +
    top
    +
    +

    Ortam Değişkenlerinin Atanması

    + + + +

    Temel Ortamda DeÄŸiÅŸiklik

    + + +

    Apache ortamında bir ortam değişkenine müdahale etmenin en temel + yolu hiçbir koşula tabi olmayan SetEnv yönergesini kullanmaktır. Bu değişkenleri Apache + başlatılırken sistem ortam değişkenleri haline getirmek için + PassEnv yönergesi + kullanılabilir.

    + + +

    İsteğe Bağlı Şartlı Atamalar

    + + +

    Esnekliği arttırmak için, mod_setenvif modülü ile + isteğin özelliklerine uygun olarak her isteğe özel değişkenler + atayabilmek mümkün kılınmıştır. Örneğin, bir değişken sadece isteği + yapan tarayıcıya özgü bir değerle veya sadece belli bir başlık + alanınına bağlı olarak atanabilir. Daha da esnek bir mekanizma, + ortam değişkeni atamak için [E=...] seçeneğinin + kullanıldığı mod_rewrite modülünün RewriteRule yönergesi ile + sağlanmıştır.

    + + +

    EÅŸsiz Betimleyiciler

    + + +

    Son olarak, mod_unique_id UNIQUE_ID + ortam değişkenine her istek için o isteğin çok özel koşullar altında + tüm diğer istekler arasında eşsizliğini garanti edecek bir değer + atar.

    + + +

    Standart CGI DeÄŸiÅŸkenleri

    + + +

    Apache yapılandırmasıyla atanan ve kabuğa aktarılan ortam + değişkenlerinden başka CGI + Belirtiminin gerektirdiği istekler hakkında temel bilgileri + içeren ortam değişkenlerinin CGI betikleri ve SSI sayfalarınca + atanabilmesi sağlanmıştır.

    + + +

    Bazı Yetersizlikler

    + + +
      +
    • Standart CGI deÄŸiÅŸkenlerini ortam deÄŸiÅŸkenlerine müdahale + yönergelerini kullanarak deÄŸiÅŸtirmek veya geçersiz kılmak mümkün + deÄŸildir.
    • + +
    • CGI betiklerini çalıştırmak için suexec + kullanıldığında ortam, CGI betikleri çalıştırılmadan önce + güvenilir deÄŸiÅŸkenler kalacak ÅŸekilde temizlenir. + Güvenilir deÄŸiÅŸken listesi suexec.c içinde + derleme sırasında tanımlanır.
    • + +
    • Taşınabilirlik adına, ortam deÄŸiÅŸkenlerinin isimleri sadece + harfler, rakamlar ve alt çizgi imlerini içerebilir. Bunlara ek + olarak ismin ilk karakteri bir rakam olmamalıdır. DeÄŸiÅŸkenler CGI + betiklerine ve SSI sayfalarına aktarılırken bu sınırlamalara uygun + olmayan karakterlerin yerlerine alt çizgi imleri konur.
    • + +
    • Bir özel durum, CGI betiklerine ve benzerlerine ortam + deÄŸiÅŸkenleri üzerinden aktarılan HTTP baÅŸlıklarıdır (aÅŸağıya + bakın). Bunlar büyük harfe dönüştürülür ve sadece tireler + altçizgilere dönüştürülür. EÄŸer HTTP baÅŸlığı geçersiz karakter + içeriyorsa baÅŸlığın tamamı yoksayılır. Böyle bir durumda ne + yapılacağı öğrenmek için aÅŸağıya + bakın.
    • + +
    • İsteklerin iÅŸleme konması sırasında SetEnv yönergesi geç çalıştırılır, + yani SetEnvIf ve + RewriteCond gibi + yönergeler SetEnv ile + atanan deÄŸiÅŸken deÄŸerlerini görmezler.
    • + +
    • mod_autoindex ile dizin listesi oluÅŸturulması + veya bir DirectoryIndex + için yol aranması gibi bir dahili alt + istek için sunucu yol araması yaparken isteklere özgü + ortam deÄŸiÅŸkenleri alt istekler tarafından miras alınMAZ. Buna ek + olarak, mod_setenvif modülünün devreye girdiÄŸi API + fazlarından dolayı yapılan alt isteklerde + SetEnvIf yönergeleri + ayrı ayrı deÄŸerlendirilMEZ.
    • +
    + +
    top
    +
    +

    Ortam Değişkenlerinin Kullanımı

    + + + + +

    CGI Betikleri

    + + +

    Ortam değişkenlerinin başlıca amaçlarından biri CGI betikleriyle + iletişim kurmaktır. Yukarıda bahsedildiği gibi CGI betiklerine + aktarılan ortam Apache yapılandırmasında atanan değişkenlere ek + olarak istek hakkında standart temel bilgileri de içerir. Bu konuda + ayrıntılı bilgi edinmek için CGI + Öğreticisine bakabilirsiniz.

    + + +

    SSI Sayfaları

    + + +

    Sunucu tarafında mod_include modülünün + INCLUDES süzgeci ile yorumlanan SSI sayfalarında ortam + değişkenleri echo elemanı ile basılabilir ve sayfayı + isteğin özelliklerine uygun olarak oluşturmak için ortam + değişkenleri akış denetim elemanları içinde kullanılabilir. Apache + ayrıca, yukarıda bahsedildiği gibi standart CGI ortam değişkenli SSI + sayfalarını da sağlayabilmektedir. Daha ayrıntılı bilgi edinmek için + SSI Öğreticisine bakabilirsiniz.

    + + +

    EriÅŸim Denetimi

    + + +

    Require env ve Require not env + yönergeleri sayesinde ortam değişkenlerine dayalı olarak sunucuya + erişim denetim altında tutulabilir. Bunlar SetEnvIf yönergesi ile birlikte + kullanılmak suretiyle sunucuya erişim isteğin özelliklerine bağlı + olarak daha esnek bir tarzda denetlenebilir. Örneğin, belli bir + tarayıcının sunucuya erişimi bu yönergelerle engellenebilir.

    + + +

    Şartlı Günlük Kaydı

    + + +

    Ortam değişkenleri LogFormat yönergesinin %e seçeneği + kullanılarak erişim günlüğüne kaydedilebilir. Bundan başka, + CustomLog yönergesi + sayesinde isteklerin günlüğe kaydedilip kaydedilmeyeceğine ortam + değişkenlerine dayalı olarak karar verilmesi sağlanabilir. Bunlar + SetEnvIf yönergesi ile + birlikte kullanılmak suretiyle günlük kayıtları isteğin + özelliklerine bağlı olarak daha esnek bir tarzda denetlenebilir. + Örneğin, gif uzantılı dosyalar için yapılan isteklerin + günlüğe kaydedilmemesi veya sadece alt ağınızın dışından gelen + isteklerin günlüğe kaydedilmesini isteyebilirsiniz.

    + + +

    Şartlı Yanıt Başlıkları

    + + +

    Header yönergesi belli + bir yanıt başlığının istemciye gönderilip gönderilmeyeceğine belli + bir ortam değişkeninin varlığına bakarak karar vermek için + kullanılabilir. Böylece örneğin, belli bir başlığın istemciye + gönderilmesine istemciden belli bir başlığın alınıp alınmadığına + bağlı olarak karar verilebilir.

    + + + +

    Harici Süzgeçlerin Etkinleştirilmesi

    + + +

    mod_ext_filter tarafından yapılandırılan harici + süzgeçler ExtFilterDefine yönergesinin disableenv= ve + enableenv= seçenekleri kullanılarak bir ortam + değişkenine bağlı olarak etkinleştirilebilir.

    + + +

    URL Kurgulaması

    + + +

    RewriteCond + yönergesinin SınamaDizgesi olarak kullanılan + %{ENV:değişken} biçemi + mod_rewrite yeniden yazma motorunun ortam + değişkenlerine bağlı kararlar almasını mümkün kılar. Yalnız şuna + dikkat ediniz: mod_rewrite’ta ENV: + öneki kullanılmadan belirtilen değişkenler ortam değişkenleri + değillerdir. Onlar mod_rewrite’a özgü diğer + modüllerden erişilemeyen özel değişkenlerdir.

    + +
    top
    +
    +

    Özel Amaçlı Ortam Değişkenleri

    + + +

    Birlikte çalışabilirlik sorunları Apache’nin belli istemcilerle + veri alışverişi sırasında davranışını değiştirmesini gerektirebilir. + Genellikle SetEnv ve + PassEnv yönergelerinden + başka BrowserMatch + gibi yönergelerle ortam değişkenleri atanarak bunu sağlayan + mekanizmaların olabildiğince esnek davranabilmesi sağlanabilir.

    + +

    downgrade-1.0

    + + +

    İstek, daha yüksek bir HTTP protokolüyle yapılmış olsa bile + HTTP/1.0 isteği olarak ele alınır.

    + + +

    force-gzip

    + +

    DEFLATE süzgeci etkinse tarayıcının tercih ettiği + kodlama koşulsuz olarak yoksayılarak sıkıştırılmış çıktı + gönderilir.

    + +

    force-no-vary

    + + +

    İstemciye gönderilmeden önce yanıttan Vary alanının + çıkarılmasına sebep olur. Bazı istemciler bu alanı gerektiği gibi + yorumlayamazlar, bu değişken atanarak bu sorunla karşılaşılmamaya + çalışılır. Bu değişkenin atanması ayrıca + force-response-1.0 değişkeninin de atanmasına sebep + olur.

    + + +

    force-response-1.0

    + + +

    HTTP/1.0 isteği yapan istemcilere HTTP/1.0 yanıtı verilmesini zorunlu + kılar. AOL vekillerindeki bir sorun nedeniyle gerçeklenmiştir. Bazı + HTTP/1.0 istemciler HTTP/1.1 yanıtlarında doğru davranmayabilirler; bu + değişken atanarak bunların sorunları giderilebilir.

    + + + +

    gzip-only-text/html

    + + +

    Bu değişkene "1" değeri atandığında text/html’den + farklı içerik türleri için mod_deflate modülü + tarafından sağlanan DEFLATE çıktı süzgeci iptal + edilir. Sıkıştırılmış olarak saklanan dosyalar kullanıyorsanız bu + değişkeni mod_negotiation modülü de dikkate alır + (kimliğine bakarak sadece gzip için değil, tüm kodlamalar için bunu + yapar).

    + + +

    no-gzip

    + +

    Bu değişken atandığında, mod_deflate modülünün + DEFLATE süzgeci kapatılır ve + mod_negotiation modülü kodlanmış kaynak teslimatını + reddeder.

    + + + +

    no-cache

    +

    2.2.12 sürümünden beri kullanılabilmektedir.

    + +

    Atandığı takdirde, mod_cache artık + önbelleklenebilecek yanıtları kaydetmeyecektir. Bu ortam değişkeni bir + yanıtın halihazırda mevcut bir isteğe sunulmak üzere önbellekte olup + olmadığından etkilenmez.

    + + + +

    nokeepalive

    + + +

    Bu değişken atandığında, KeepAlive yönergesi iptal edilir.

    + + + +

    prefer-language

    + + +

    Değer olarak en, ja veya + x-klingon gibi bir dil kısaltması verilerek atanmışsa + mod_negotiation modülünün normal davranışını + değiştirerek belirtilen dilde bir teslimat yapılmaya çalışılır. + Böyle bir belge yoksa normal uzlaşım süreci uygulanır.

    + + + +

    redirect-carefully

    + + +

    İstemciye bir yönlendirme gönderirken sunucuyu daha dikkatli olmaya + zorlar. Bu genellikle istemcinin yönlendirmeler konusunda sorunlu + olduğu bilindiği takdirde yararlı olur. Bu değişkenin gerçeklenme + sebebi, dizin kaynaklarına yönlendirmeler için DAV yöntemlerini + kullanan Microsoft'un WebFolders yazılımındaki bir sorundur.

    + + + +

    suppress-error-charset

    + + +

    2.0.54 sürümünden beri mevcuttur.

    + +

    Apache bir isteğe bir yönlendirme ile yanıt verdiğinde istemci + yönlendirmeyi kendiliğinden yapmaz veya yapamazsa kullanıcıya yanıtla + birlikte gönderilen metin gösterilir. Apache normal olarak bu metni + ISO-8859-1 ile kodlar.

    + +

    Ancak, yönlendirmenin yapıldığı sayfa farklı bir karakter kümesine + sahipse bazı tarayıcı sürümleri asıl sayfanın karakter kodlaması yerine + yönlendirmenin kodlamasını kullanmaya çalışırlar. Bu özellikle Yunanca + gibi dillerde hedef sayfanın hatalı yorumlanmasına yol açar.

    + +

    Bu ortam değişkeninin atanması Apache’nin yönlendirme için karakter + kümesi belirtmemesini sağlamak suretiyle hatalı tarayıcıların hedef + sayfayı yanlış karakter kodlamasıyla yorumlamasını önler.

    + +
    +

    Güvenlik Uyarısı

    + +

    Hata sayfalarının bir karakter kümesi belirtilmeksizin yollanması, + HTTP/1.1 belirtimine uymayan ve karakter kümesini içeriğe bakarak + tahmin etmeye çalışan tarayıcılarda (MSIE) karşı siteden betik + saldırısı yorumuna sebep olabilir. Girdi verisindeki UTF-7 içerik + (istek betimleyici gibi) karşı siteden betik saldırılarını engellemek + için tasarlanmış normal önceleme mekanizmalarıyla öncelenmeyeceği için + böyle tarayıcılar UTF-7 karakter kodlaması kullanılarak kolayca + aldatılabilir.

    +
    + + + +

    force-proxy-request-1.0, + proxy-nokeepalive, proxy-sendchunked ve + proxy-sendcl, proxy-chain-auth, + proxy-interim-response, proxy-initial-not-pooled +

    + +

    Bu yönergeler mod_proxy modülünün normal protokol + davranışını değiştirirler. Daha ayrıntılı bilgi için + mod_proxy ve mod_proxy_http + belgelerine bakınız.

    + + +
    top
    +
    +

    Örnekler

    + + +

    Bozuk başlıkların CGI betiklerine aktarılması

    + + +

    2.4 sürümünden itibaren, mod_cgi modülü ve diğer + modüllerde HTTP başlıklarının ortam değişkenlerine dönüştürülmesi + bağlamında Apache daha seçici davranmaktadır. Önce HTTP başlığındaki + geçersiz karakterlerin tamamı altçizgilere dönüştürülür. Bu, başlık + zerki yoluyla yapılan karşı-site-betiklerini-çalıştırma saldırısını + önlemeye yöneliktir. (Bakınız: Unusual Web Bugs, slide 19/20).

    + +

    Bozuk başlıklar gönderdiği halde bunlara dokunulmamasını gerektiren + bir istemciniz varsa, mod_setenvif ve + mod_headers modüllerinin sunduğu yapıyı örnekteki gibi + kullanarak bu sorunun üstesinden gelebilirsiniz:

    + +
    #
    +# Aşağıdaki satırlarla bir istemcinin gönderdiği bozuk
    +# Accept_Encoding başlıklarının istenildiği gibi işlenmesi
    +# saÄŸlanabilir.
    +#
    +SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1
    +RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding
    + + + + +

    Protokolü yanlış yorumlayan tarayıcıların davranışlarının + değiştirilmesi

    + + +

    Önceki sürümlerde bilinen istemci davranışlarına karşı önlem olarak + aşağıdaki satırların httpd.conf içinde bulunması + önerilirdi. Fakat, böyle tarayıcılar artık ortalıkta görünmediğinden + bu yapılandırmaya da artık gerek kalmamıştır.

    + +
    #
    +# Aşağıdaki yönergeler normal HTTP yanıt davranışını değiştirirler.
    +# İlk yönerge Netscape 2.x ve kendini öyle gösteren tarayıcılar için
    +# kalıcı bağlantıyı (keepalive) iptal eder. İkinci yönerge ise HTTP/1.1
    +# protokolü bozuk olan ve 301/302 durum kodlu yönlendirme yanıtları
    +# kullanıldığında kalıcı bağlantıları gerektiği gibi desteklemeyen
    +# Microsoft Internet Explorer 4.0b2 içindir.
    +#
    +BrowserMatch "Mozilla/2" nokeepalive
    +BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
    +
    +#
    +# Aşağıdaki yönergeler HTTP/1.0 yanıtlarından başkasına yabancı olan
    +# tarayıcılara HTTP/1.1 yanıtlarının gönderilmesini iptal eder.
    +#
    +BrowserMatch "RealPlayer 4\.0" force-response-1.0
    +BrowserMatch "Java/1\.0" force-response-1.0
    +BrowserMatch "JDK/1\.0" force-response-1.0
    + + + +

    Resim isteklerinin erişim günlüğüne kaydedilmemesi

    + + +

    Bu örnek resim isteklerinin erişim günlüğüne yazılmasını engeller. + Bu örnek değiştirilerek belli dizinlerin veya belli konaklardan + gelen isteklerin günlüğe kaydedilmesini engellemek amacıyla da + kullanılabilir.

    + +
    SetEnvIf Request_URI \.gif image-request
    +SetEnvIf Request_URI \.jpg image-request
    +SetEnvIf Request_URI \.png image-request
    +CustomLog "logs/access_log" common env=!image-request
    + + + + +

    “Resim Hırsızlığı†için önlem alınması

    + + +

    Bu örnekte sunucunuzda bulunmayan sayfalarda sunucunuzdaki + resimlerin kullanılmasının nasıl önleneceği gösterilmiştir. Bu + yapılandırma önerilmemekle birlikte nadir durumlarda işe yarar. Tüm + resimlerin /siteler/resimler dizini altında tutulduğu + varsayılmıştır.

    + +
    SetEnvIf Referer "^http://www\.example\.com/" local_referal
    +# Referrer bilgisi göndermeyen tarayıcılara izin verelim
    +SetEnvIf Referer "^$" local_referal
    +<Directory "/siteler/resimler">
    +  Require env local_referal
    +</Directory>
    + + +

    Bu teknik hakkında daha ayrıntılı bilgi edinmek için ServerWatch + üzerindeki "Diğer sitelerin sizin resimlerinizle donatılmasını engellemek" + belgesine bakınız.

    + +
    +
    +

    Mevcut Diller:  en  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Yorumlar

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/expr.html b/docs/manual/expr.html new file mode 100644 index 0000000..1871cae --- /dev/null +++ b/docs/manual/expr.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: expr.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: expr.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/expr.html.en b/docs/manual/expr.html.en new file mode 100644 index 0000000..1fd99d3 --- /dev/null +++ b/docs/manual/expr.html.en @@ -0,0 +1,657 @@ + + + + + +Expressions in Apache HTTP Server - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Expressions in Apache HTTP Server

    +
    +

    Available Languages:  en  | + fr 

    +
    + +

    Historically, there are several syntax variants for expressions + used to express a condition in the different modules of the Apache + HTTP Server. There is some ongoing effort to only use a single + variant, called ap_expr, for all configuration directives. + This document describes the ap_expr expression parser. +

    +

    The ap_expr expression is intended to replace most other + expression variants in HTTPD. For example, the deprecated SSLRequire expressions can be replaced + by Require expr.

    +
    + +
    top
    +
    +

    Grammar in Backus-Naur Form notation

    + +

    Backus-Naur + Form (BNF) is a notation technique for context-free grammars, + often used to describe the syntax of languages used in computing. + In most cases, expressions are used to express boolean values. + For these, the starting point in the BNF is expr. + However, a few directives like LogMessage accept expressions + that evaluate to a string value. For those, the starting point in + the BNF is string. +

    +
    +
    expr        ::= "true" | "false"
    +              | "!" expr
    +              | expr "&&" expr
    +              | expr "||" expr
    +              | "(" expr ")"
    +              | comp
    +
    +comp        ::= stringcomp
    +              | integercomp
    +              | unaryop word
    +              | word binaryop word
    +              | word "in" "{" wordlist "}"
    +              | word "in" listfunction
    +              | word "=~" regex
    +              | word "!~" regex
    +
    +
    +stringcomp  ::= word "==" word
    +              | word "!=" word
    +              | word "<"  word
    +              | word "<=" word
    +              | word ">"  word
    +              | word ">=" word
    +
    +integercomp ::= word "-eq" word | word "eq" word
    +              | word "-ne" word | word "ne" word
    +              | word "-lt" word | word "lt" word
    +              | word "-le" word | word "le" word
    +              | word "-gt" word | word "gt" word
    +              | word "-ge" word | word "ge" word
    +
    +wordlist    ::= word
    +              | wordlist "," word
    +
    +word        ::= word "." word
    +              | digit
    +              | "'" string "'"
    +              | """ string """
    +              | variable
    +              | rebackref
    +              | function
    +
    +string      ::= stringpart
    +              | string stringpart
    +
    +stringpart  ::= cstring
    +              | variable
    +              | rebackref
    +
    +cstring     ::= ...
    +digit       ::= [0-9]+
    +
    +variable    ::= "%{" varname "}"
    +              | "%{" funcname ":" funcargs "}"
    +
    +rebackref   ::= "$" [0-9]
    +
    +function     ::= funcname "(" word ")"
    +
    +listfunction ::= listfuncname "(" word ")"
    +
    + +
    top
    +
    +

    Variables

    + + +

    The expression parser provides a number of variables of the form + %{HTTP_HOST}. Note that the value of a variable may depend + on the phase of the request processing in which it is evaluated. For + example, an expression used in an <If > + directive is evaluated before authentication is done. Therefore, + %{REMOTE_USER} will not be set in this case.

    + +

    The following variables provide the values of the named HTTP request + headers. The values of other headers can be obtained with the + req function. Using these + variables may cause the header name to be added to the Vary + header of the HTTP response, except where otherwise noted for the + directive accepting the expression. The req_novary + function may be used to circumvent this + behavior.

    + + + + + + + + + +
    Name
    HTTP_ACCEPT
    HTTP_COOKIE
    HTTP_FORWARDED
    HTTP_HOST
    HTTP_PROXY_CONNECTION
    HTTP_REFERER
    HTTP_USER_AGENT
    + +

    Other request related variables

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescription
    REQUEST_METHODThe HTTP method of the incoming request (e.g. + GET)
    REQUEST_SCHEMEThe scheme part of the request's URI
    REQUEST_URIThe path part of the request's URI
    DOCUMENT_URISame as REQUEST_URI
    REQUEST_FILENAMEThe full local filesystem path to the file or script matching the + request, if this has already been determined by the server at the + time REQUEST_FILENAME is referenced. Otherwise, such + as when used in virtual host context, the same value as + REQUEST_URI
    SCRIPT_FILENAMESame as REQUEST_FILENAME
    LAST_MODIFIEDThe date and time of last modification of the file in the format + 20101231235959, if this has already been determined by + the server at the time LAST_MODIFIED is referenced. +
    SCRIPT_USERThe user name of the owner of the script.
    SCRIPT_GROUPThe group name of the group of the script.
    PATH_INFOThe trailing path name information, see + AcceptPathInfo
    QUERY_STRINGThe query string of the current request
    IS_SUBREQ"true" if the current request is a subrequest, + "false" otherwise
    THE_REQUESTThe complete request line (e.g., + "GET /index.html HTTP/1.1")
    REMOTE_ADDRThe IP address of the remote host
    REMOTE_PORTThe port of the remote host (2.4.26 and later)
    REMOTE_HOSTThe host name of the remote host
    REMOTE_USERThe name of the authenticated user, if any (not available during <If>)
    REMOTE_IDENTThe user name set by mod_ident
    SERVER_NAMEThe ServerName of + the current vhost
    SERVER_PORTThe server port of the current vhost, see + ServerName
    SERVER_ADMINThe ServerAdmin of + the current vhost
    SERVER_PROTOCOLThe protocol used by the request
    DOCUMENT_ROOTThe DocumentRoot of + the current vhost
    AUTH_TYPEThe configured AuthType (e.g. + "basic")
    CONTENT_TYPEThe content type of the response (not available during <If>)
    HANDLERThe name of the handler creating + the response
    HTTP2"on" if the request uses http/2, + "off" otherwise
    HTTPS"on" if the request uses https, + "off" otherwise
    IPV6"on" if the connection uses IPv6, + "off" otherwise
    REQUEST_STATUSThe HTTP error status of the request (not available during <If>)
    REQUEST_LOG_IDThe error log id of the request (see + ErrorLogFormat)
    CONN_LOG_IDThe error log id of the connection (see + ErrorLogFormat)
    CONN_REMOTE_ADDRThe peer IP address of the connection (see the + mod_remoteip module)
    CONTEXT_PREFIX
    CONTEXT_DOCUMENT_ROOT
    + +

    Misc variables

    + + + + + + + + + + + + + + + + + + + + + + +
    NameDescription
    TIME_YEARThe current year (e.g. 2010)
    TIME_MONThe current month (01, ..., 12)
    TIME_DAYThe current day of the month (01, ...)
    TIME_HOURThe hour part of the current time + (00, ..., 23)
    TIME_MINThe minute part of the current time
    TIME_SECThe second part of the current time
    TIME_WDAYThe day of the week (starting with 0 + for Sunday)
    TIMEThe date and time in the format + 20101231235959
    SERVER_SOFTWAREThe server version string
    API_VERSIONThe date of the API version (module magic number)
    + +

    Some modules register additional variables, see e.g. + mod_ssl.

    + +
    top
    +
    +

    Binary operators

    + + +

    With the exception of some built-in comparison operators, binary + operators have the form "-[a-zA-Z][a-zA-Z0-9_]+", i.e. a + minus and at least two characters. The name is not case sensitive. + Modules may register additional binary operators.

    + +

    Comparison operators

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameAlternative Description
    ===String equality
    != + String inequality
    < + String less than
    <= + String less than or equal
    > + String greater than
    >= + String greater than or equal
    =~ + String matches the regular expression
    !~ + String does not match the regular expression
    -eqeqInteger equality
    -neneInteger inequality
    -ltltInteger less than
    -leleInteger less than or equal
    -gtgtInteger greater than
    -gegeInteger greater than or equal
    + + +

    Other binary operators

    + + + + + + + + + + + +
    NameDescription
    -ipmatchIP address matches address/netmask
    -strmatchleft string matches pattern given by right string (containing + wildcards *, ?, [])
    -strcmatchsame as -strmatch, but case insensitive
    -fnmatchsame as -strmatch, but slashes are not matched by + wildcards
    + + +
    top
    +
    +

    Unary operators

    + + +

    Unary operators take one argument and have the form + "-[a-zA-Z]", i.e. a minus and one character. + The name is case sensitive. + Modules may register additional unary operators.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRestricted
    -dThe argument is treated as a filename. + True if the file exists and is a directoryyes
    -eThe argument is treated as a filename. + True if the file (or dir or special) existsyes
    -fThe argument is treated as a filename. + True if the file exists and is regular fileyes
    -sThe argument is treated as a filename. + True if the file exists and is not emptyyes
    -LThe argument is treated as a filename. + True if the file exists and is symlinkyes
    -hThe argument is treated as a filename. + True if the file exists and is symlink + (same as -L)yes
    -FTrue if string is a valid file, accessible via all the server's + currently-configured access controls for that path. This uses an + internal subrequest to do the check, so use it with care - it can + impact your server's performance!
    -UTrue if string is a valid URL, accessible via all the server's + currently-configured access controls for that path. This uses an + internal subrequest to do the check, so use it with care - it can + impact your server's performance!
    -AAlias for -U
    -nTrue if string is not empty
    -zTrue if string is empty
    -TFalse if string is empty, "0", "off", + "false", or "no" (case insensitive). + True otherwise.
    -RSame as "%{REMOTE_ADDR} -ipmatch ...", but more + efficient +
    + +

    The operators marked as "restricted" are not available in some modules + like mod_include.

    +
    top
    +
    +

    Functions

    + + +

    Normal string-valued functions take one string as argument and return + a string. Functions names are not case sensitive. + Modules may register additional functions.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionSpecial notes
    req, httpGet HTTP request header; header names may be added to the Vary + header, see below
    req_novarySame as req, but header names will not be added to the + Vary header
    respGet HTTP response header (most response headers will not yet be set + during <If>)
    reqenvLookup request environment variable (as a shortcut, + v can also be used to access variables). + ordering
    osenvLookup operating system environment variable
    noteLookup request noteordering
    envReturn first match of note, reqenv, + osenvordering
    tolowerConvert string to lower case
    toupperConvert string to upper case
    escapeEscape special characters in %hex encoding
    unescapeUnescape %hex encoded string, leaving encoded slashes alone; + return empty string if %00 is found
    base64Encode the string using base64 encoding
    unbase64Decode base64 encoded string, return truncated string if 0x00 is + found
    md5Hash the string using MD5, then encode the hash with hexadecimal + encoding
    sha1Hash the string using SHA1, then encode the hash with hexadecimal + encoding
    fileRead contents from a file (including line endings, when present) + restricted
    filesizeReturn size of a file (or 0 if file does not exist or is not + regular file)restricted
    ldapEscape characters as required by LDAP distinguished name escaping + (RFC4514) and LDAP filter escaping (RFC4515).
    + (Available in httpd 2.4.53 and later)
    + +

    The functions marked as "restricted" in the final column are not + available in some modules like mod_include.

    + +

    The functions marked as "ordering" in the final column require some + consideration for the ordering of different components of the server, + especially when the function is used within the + <If> directive which is + evaluated relatively early.

    +
    +

    Environment variable ordering

    + When environment variables are looked up within an + <If> condition, it's important + to consider how extremely early in request processing that this + resolution occurs. As a guideline, any directive defined outside of virtual host + context (directory, location, htaccess) is not likely to have yet had a + chance to execute. SetEnvIf + in virtual host scope is one directive that runs prior to this resolution +
    +
    + When reqenv is used outside of <If>, the resolution will generally occur later, but the + exact timing depends on the directive the expression has been used within. +
    + +

    When the functions req or http are used, + the header name will automatically be added to the Vary header of the + HTTP response, except where otherwise noted for the directive accepting + the expression. The req_novary function can be used to + prevent names from being added to the Vary header.

    + +

    In addition to string-valued functions, there are also + list-valued functions which take one string as argument and return a + wordlist, i.e. a list of strings. The wordlist can be used with the + special -in operator. Functions names are not case + sensitive. Modules may register additional functions.

    + +

    There are no built-in list-valued functions. mod_ssl + provides PeerExtList. See the description of + SSLRequire for details + (but PeerExtList is also usable outside + of SSLRequire).

    + +
    top
    +
    +

    Example expressions

    + + +

    The following examples show how expressions might be used to + evaluate requests:

    + + +
    # Compare the host name to example.com and redirect to www.example.com if it matches
    +<If "%{HTTP_HOST} == 'example.com'">
    +    Redirect permanent "/" "http://www.example.com/"
    +</If>
    +
    +# Force text/plain if requesting a file with the query string contains 'forcetext'
    +<If "%{QUERY_STRING} =~ /forcetext/">
    +    ForceType text/plain
    +</If>
    +
    +# Only allow access to this content during business hours
    +<Directory "/foo/bar/business">
    +    Require expr %{TIME_HOUR} -gt 9 && %{TIME_HOUR} -lt 17
    +</Directory>
    +
    +# Check a HTTP header for a list of values
    +<If "%{HTTP:X-example-header} in { 'foo', 'bar', 'baz' }">
    +    Header set matched true
    +</If>
    +
    +# Check an environment variable for a regular expression, negated.
    +<If "! reqenv('REDIRECT_FOO') =~ /bar/">
    +    Header set matched true
    +</If>
    +
    +# Check result of URI mapping by running in Directory context with -f
    +<Directory "/var/www">
    +    AddEncoding x-gzip gz
    +<If "-f '%{REQUEST_FILENAME}.unzipme' && ! %{HTTP:Accept-Encoding} =~ /gzip/">
    +      SetOutputFilter INFLATE
    +</If>
    +</Directory>
    +
    +# Check against the client IP
    +<If "-R '192.168.1.0/24'">
    +    Header set matched true
    +</If>
    +
    +# Function example in boolean context
    +<If "md5('foo') == 'acbd18db4cc2f85cedef654fccc4a4d8'">
    +  Header set checksum-matched true
    +</If>
    +
    +# Function example in string context
    +Header set foo-checksum "expr=%{md5:foo}"
    +
    +# This delays the evaluation of the condition clause compared to <If>
    +Header always set CustomHeader my-value "expr=%{REQUEST_URI} =~ m#^/special_path\.php$#"
    +
    +# Conditional logging
    +CustomLog logs/access-errors.log common "expr=%{REQUEST_STATUS} >= 400"
    +CustomLog logs/access-errors-specific.log common "expr=%{REQUEST_STATUS} -in {'405','410'}"
    + +
    top
    +
    +

    Other

    + + + + + + + + + + + + + + +
    NameAlternative Description
    -ininstring contained in wordlist
    /regexp/m#regexp#Regular expression (the second form allows different + delimiters than /)
    /regexp/im#regexp#iCase insensitive regular expression
    $0 ... $9 + Regular expression backreferences
    + +

    Regular expression backreferences

    + +

    The strings $0 ... $9 allow to reference + the capture groups from a previously executed, successfully + matching regular expressions. They can normally only be used in the + same expression as the matching regex, but some modules allow special + uses.

    + + +
    top
    +
    +

    Comparison with SSLRequire

    + +

    The ap_expr syntax is mostly a superset of the syntax of the + deprecated SSLRequire directive. + The differences are described in SSLRequire's documentation.

    +
    top
    +
    +

    Version History

    + +

    The req_novary function + is available for versions 2.4.4 and later.

    +
    +
    +

    Available Languages:  en  | + fr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/expr.html.fr.utf8 b/docs/manual/expr.html.fr.utf8 new file mode 100644 index 0000000..ad36db6 --- /dev/null +++ b/docs/manual/expr.html.fr.utf8 @@ -0,0 +1,693 @@ + + + + + +Les expressions dans le serveur HTTP Apache - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Les expressions dans le serveur HTTP Apache

    +
    +

    Langues Disponibles:  en  | + fr 

    +
    + +

    Historiquement, il existe de nombreuses variantes dans la syntaxe + des expressions permettant d'exprimer une condition dans les + différents modules du serveur HTTP Apache. À ce titre, des travaux sont + en cours pour n'utiliser qu'une seule variante nommée + ap_expr, pour toutes les directives de configuration. Ce + document décrit l'interpréteur d'expressions ap_expr. +

    +

    Le type d'expression ap_expr est appelé à remplacer la + plupart des autres types d'expressions dans HTTPD. Par exemple, la + directive obsolète SSLRequire peut être remplacée par la + directive Require + expr. +

    +
    + +
    top
    +
    +

    Syntaxe en Forme de Backus-Naur

    + +

    La Forme de Backus-Naur + (souvent abrégée en BNF, de l'anglais Backus-Naur Form) est une notation permettant de décrire + les règles syntaxiques des langages de programmation. En + général, les expressions représentent des valeurs booléennes. Dans + ce cas, le point de départ de la BNF est expr. + Cependant, certaines directives comme LogMessage utilisent comme + paramètres des expressions qui représentent des chaînes de + caractères. Dans ce cas, le point de départ de la BNF est + string. +

    +
    +
    expr        ::= "true" | "false"
    +              | "!" expr
    +              | expr "&&" expr
    +              | expr "||" expr
    +              | "(" expr ")"
    +              | comp
    +
    +comp        ::= stringcomp
    +              | integercomp
    +              | unaryop word
    +              | word binaryop word
    +              | word "in" "{" wordlist "}"
    +              | word "in" listfunction
    +              | word "=~" regex
    +              | word "!~" regex
    +
    +
    +stringcomp  ::= word "==" word
    +              | word "!=" word
    +              | word "<"  word
    +              | word "<=" word
    +              | word ">"  word
    +              | word ">=" word
    +
    +integercomp ::= word "-eq" word | word "eq" word
    +              | word "-ne" word | word "ne" word
    +              | word "-lt" word | word "lt" word
    +              | word "-le" word | word "le" word
    +              | word "-gt" word | word "gt" word
    +              | word "-ge" word | word "ge" word
    +
    +wordlist    ::= word
    +              | wordlist "," word
    +
    +word        ::= word "." word
    +              | digit
    +              | "'" string "'"
    +              | """ string """
    +              | variable
    +	      | rebackref
    +              | function
    +
    +string      ::= stringpart
    +              | string stringpart
    +
    +stringpart  ::= cstring
    +              | variable
    +	      | rebackref
    +
    +cstring     ::= ...
    +digit       ::= [0-9]+
    +
    +variable    ::= "%{" varname "}"
    +              | "%{" funcname ":" funcargs "}"
    +
    +rebackref   ::= "$" [0-9]
    +
    +function     ::= funcname "(" word ")"
    +
    +listfunction ::= listfuncname "(" word ")"
    +
    + +
    top
    +
    +

    Variables

    + + +

    L'interpréteur d'expressions fournit plusieurs variables de la + forme %{HTTP_HOST}. Notez que la valeur d'une variable + peut dépendre de la phase du traitement de la requête au cours de + laquelle elle est évaluée. Par exemple, une expression utilisée dans + une directive <If > sera évaluée avant + la phase d'authentification. Par conséquent, la variable + %{REMOTE_USER} ne sera pas encore définie à ce stade.

    + +

    Les variables suivantes contiennent la valeur de l'en-tête de + requête HTTP correspondant. La fonction + req permet d'extraire les valeurs des autres + en-têtes. L'utilisation de ces variables peut provoquer + l'ajout du nom d'en-tête correspondant à l'en-tête Vary de la + réponse HTTP, sauf spécification contraire pour la directive + qui accepte l'expression comme paramètre. La function req_novary permet de + modifier ce comportement.

    + + + + + + + + + +
    Nom
    HTTP_ACCEPT
    HTTP_COOKIE
    HTTP_FORWARDED
    HTTP_HOST
    HTTP_PROXY_CONNECTION
    HTTP_REFERER
    HTTP_USER_AGENT
    + +

    Autres variables liées aux requêtes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NomDescription
    REQUEST_METHODLa méthode HTTP de la requête entrante (par exemple + GET)
    REQUEST_SCHEMELe protocole associé à l'URI de la requête
    REQUEST_URILa partie chemin de l'URI de la requête
    DOCUMENT_URIIdem REQUEST_URI
    REQUEST_FILENAMELe chemin complet dans le système de fichiers local du + fichier ou du script correspondant à la requête, si le serveur + l'a dèjà déterminé à l'instant où REQUEST_FILENAME + est référencée. Dans le cas contraire, comme dans un + contexte de serveur virtuel, même valeur que REQUEST_URI
    SCRIPT_FILENAMEIdentique à REQUEST_FILENAME
    LAST_MODIFIEDLa date et heure de dernière modification du fichier au + format 20101231235959, si elle est déjà connue du + serveur au moment où LAST_MODIFIED est référencé. +
    SCRIPT_USERLe nom d'utilisateur du propriétaire du script.
    SCRIPT_GROUPLe nom du groupe auquel appartient le script.
    PATH_INFOL'information relative au nom de chemin située en fin, voir + la directive AcceptPathInfo
    QUERY_STRINGLa chaîne de paramètres de la requête courante
    IS_SUBREQ"true" si la requête courante est une + sous-requête, "false" dans le cas contraire
    THE_REQUESTLa requête complète (par exemple "GET /index.html + HTTP/1.1")
    REMOTE_ADDRL'adresse IP de l'hôte distant
    REMOTE_PORTLe port de l'hôte distant (versions 2.4.26 et supérieures)
    REMOTE_HOSTLe nom d'hôte de l'hôte distant
    REMOTE_USERLe nom de l'utilisateur authentifié, s'il existe (non + disponible à l'intérieur d'un bloc <If>)
    REMOTE_IDENTLe nom de l'utilisateur défini par mod_ident
    SERVER_NAMELa valeur de la directive ServerName du serveur virtuel courant
    SERVER_PORTLe port associé au serveur virtuel courant ; voir la + directive ServerName
    SERVER_ADMINLa valeur de la directive ServerAdmin du serveur virtuel courant
    SERVER_PROTOCOLLe protocole utilisé par la requête
    DOCUMENT_ROOTLa valeur de la directive DocumentRoot du serveur virtuel + courant
    AUTH_TYPELa valeur de la directive AuthType (par exemple + "basic")
    CONTENT_TYPELe type de contenu de la réponse (non + disponible à l'intérieur d'un bloc <If>)
    HANDLERLe nom du gestionnaire qui a + généré la réponse
    HTTP2"on" si la requête utilise http/2, + "off" dans le cas contraire
    HTTPS"on" si la requête utilise https, + "off" dans le cas contraire
    IPV6"on" si la connexion utilise IPv6, + "off" dans le cas contraire
    REQUEST_STATUSLe code d'erreur HTTP de la requête (non + disponible à l'intérieur d'un bloc <If>)
    REQUEST_LOG_IDL'identifiant du message d'erreur associé à la requête (voir + la directive ErrorLogFormat)
    CONN_LOG_IDL'identifiant du message d'erreur associé à la connexion + (voir la directive ErrorLogFormat)
    CONN_REMOTE_ADDRL'adresse IP du correspondant pour la connexion (voir le module + mod_remoteip)
    CONTEXT_PREFIX
    CONTEXT_DOCUMENT_ROOT
    + +

    Variables diverses

    + + + + + + + + + + + + + + + + + + + + + + +
    NomDescription
    TIME_YEARL'année courante (par exemple 2010)
    TIME_MONLe mois courant (01, ..., 12)
    TIME_DAYLe jour courant dans le mois (01, ...)
    TIME_HOURLes heures de la date courante (00, ..., + 23)
    TIME_MINLes minutes de la date courante
    TIME_SECLes secondes de la date courante
    TIME_WDAYLe jour de la semaine (à partir de 0 pour + dimanche)
    TIMELa date et heure au format 20101231235959
    SERVER_SOFTWARELa chaîne contenant la version du serveur
    API_VERSIONLa date de la version de l'API (module magic number)
    + +

    Certains modules, comme mod_ssl, définissent des + variables supplémentaires.

    + +
    top
    +
    +

    Opérateurs binaires

    + + +

    À l'exception de quelques opérateurs de comparaison internes, les + opérateurs binaires sont de la forme + "-[a-zA-Z][a-zA-Z0-9_]+", autrement dit un signe moins + et au moins deux caractères. Le nom est insensible à la casse. Les + modules peuvent fournir des opérateurs binaires supplémentaires.

    + +

    Opérateurs de comparaison

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NomAlternative Description
    ===Egalité de chaînes
    != + Inégalité de chaînes
    < + Chaîne inférieure à
    <= + Chaîne inférieure ou égale à
    > + Chaîne supérieure à
    >= + Chaîne supérieure ou égale à
    =~ + La chaîne correspond à l'expression rationnelle
    !~ + La chaîne ne correspond pas à l'expression rationnelle
    -eqeqEgalité d'entiers
    -neneInégalité d'entiers
    -ltltEntier inférieur à
    -leleEntier inférieur ou égal à
    -gtgtEntier supérieur à
    -gegeEntier supérieur ou égal à
    + + +

    Autres opérateurs binaires

    + + + + + + + + + + + +
    NomDescription
    -ipmatchL'adresse IP correspond à adresse/masque
    -strmatchla chaîne de gauche correspond au modèle constitué par la + chaîne de droite (contenant des caractères génériques *, ?, [])
    -strcmatchidem -strmatch, mais insensible à la casse
    -fnmatchidem -strmatch, mais les slashes ne sont pas + pris en compte par les caractères génériques
    + + +
    top
    +
    +

    Opérateurs unaires

    + + +

    Les opérateurs unaires acceptent un seul argument et sont + de la forme "-[a-zA-Z]", + autrement dit le signe moins et un caractère. Le nom est + sensible à la casse. Les modules peuvent fournir des opérateurs + unaires supplémentaires.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NomDescriptionRemarques particulières
    -dL'argument est traité comme un nom de fichier. + Vrai si le fichier existe et correspond à un + répertoireoui
    -eL'argument est traité comme un nom de fichier. Vrai si le + fichier (ou dir ou special) existeoui
    -fL'argument est traité comme un nom de fichier. Vrai si le + fichier existe et correspond à un fichier + régulieroui
    -sL'argument est traité comme un nom de fichier. Vrai si le + fichier existe et n'est pas videoui
    -LL'argument est traité comme un nom de fichier. Vrai si le + fichier existe et correspond à un lien + symboliqueoui
    -hL'argument est traité comme un nom de fichier. Vrai si le + fichier existe et correspond à un lien symbolique + (identique à -L)oui
    -FVrai si la chaîne correspond a un fichier valide, accessible + avec tous les contrôles d'accès configurés pour ce chemin. A + cette fin, une sous-requête effectue la vérification, et vous + devez utiliser ce drapeau avec soin car il peut impacter les + performances de votre serveur !
    -UVrai si la chaîne correspond a une URL valide, accessible + avec tous les contrôles d'accès configurés pour ce chemin. A + cette fin, une sous-requête effectue la vérification, et vous + devez utiliser ce drapeau avec soin car il peut impacter les + performances de votre serveur !
    -AAlias pour -U
    -nVrai si la chaîne n'est pas vide
    -zVrai si la chaîne est vide
    -TFaux si la chaîne est vide, "0", + "off", "false", ou "no" + (insensibilité à la casse). Vrai dans le cas contraire.
    -RIdem "%{REMOTE_ADDR} -ipmatch ...", en plus + efficace +
    + +

    Les opérateurs marqués comme "restreints" ne sont pas disponibles + avec certains modules comme mod_include.

    + +
    top
    +
    +

    Fonctions

    + + +

    Normalement, les fonctions dont la valeur est une chaîne acceptent une chaîne + comme argument et renvoient une chaîne. Les noms de fonctions sont + insensibles à la casse. Les modules peuvent fournir des fonctions + supplémentaires.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NomDescriptionNotes particulières
    req, httpLit l'en-tête de requête HTTP ; les noms + d'en-tête correspondants peuvent être ajoutés + à l'en-tête Vary, + voir ci-dessous
    req_novaryIdentique à req, mais aucun nom d'en-tête n'est + ajouté à l'en-tête Vary
    respLit l'en-tête de réponse HTTP (La plupart des en-têtes de la réponse + ne seront pas encore définis pendant le traitement de la directive + <If>)
    reqenvRecherche une variable d'environnement de requête (on + peut aussi utiliser le raccourci v). + ordonnancement
    osenvRecherche une variable d'environnement du système + d'exploitation
    noteRecherche une note de requêteordonnancement
    envRenvoie le premier résultat positif de note, + reqenv, osenvordonnancement
    tolowerConvertit une chaîne en minuscules
    toupperConvertit une chaîne en majuscules
    escapeEchappe les caractères spéciaux en codage hexadécimal
    unescape"Déséchappe" les chaînes codées + en hexadécimal, en ne gardant encodés que les slashes; renvoie la chaîne vide + si la séquence %00 est rencontrée
    base64Encode la chaîne en base64
    unbase64Décode les chaînes codées en base64, renvoie une chaîne + tronquée si le caractère 0x00 est rencontré
    md5Génère un hash de la chaîne en utilisant MD5, puis code le + hash obtenu en hexadécimal
    sha1Génère un hash de la chaîne en utilisant SHA1, puis encode + le hash obtenu en hexadécimal
    fileLit le contenu d'un fichier(fins de lignes incluses, si + elles existent)limité
    filesizeRenvoie la taille d'un fichier (ou 0 si le fichier n'existe + pas ou ne correspond pas à un fichier régulier)limité
    ldapEchappe les caractères selon la RFC4514 (Echappement des + noms distinctifs LDAP - DN) et la RFC4515 (Echappement des + filtres LDAP).
    + Disponible à partir de la version 2.4.53 du serveur HTTP + Apache.
    + +

    Les fonctions marquées comme "limité" dans la dernière colonne ne sont + pas disponibles avec certains modules comme + mod_include.

    + +

    Les fonctions marquées comme "ordonnancement" dans la dernière colonne + nécessitent une attention particulière pour l'ordonnancement des différents + composants du serveur, spécialement lorsque la fonction est utilisée au sein + d'une directive <If> qui est + évaluée relativement tôt.

    +
    +

    Ordonnancement des variables d'environnement

    + Lorsque des variables d'environnement sont évaluées au sein d'une directive + <If>, il est important de tenir + compte du moment où cette évaluation intervient dans le traitement de la + requête. Par exemple, toute directive définie en dehors d'un contexte de + serveur virtuel (directory, location, htaccess) aura peu de chance d'être + déjà exécutée. Ainsi la directive SetEnvIf est une directive qui s'exécute + avant cette évaluation. +
    +
    + Lorsque reqenv est utilisé en dehors de la directive + <If>, l'évaluation survient en + général plus tard, mais le moment exact dépend de la directive dans laquelle + l'expression a été utilisée. +
    + +

    Lorsque les fonctions req ou http sont + utilisées, le nom d'en-tête sera automatiquement ajouté à l'en-tête + Vary de la réponse HTTP, sauf spécification contraire pour la + directive qui accepte l'expression comme paramètre. La + fonction req_novary permet d'empêcher l'ajout de noms + d'en-têtes à l'en-tête Vary.

    + +

    En plus des fonctions dont la valeur est une chaîne, il existe + aussi des fonctions dont la valeur est une liste, qui acceptent une + chaîne comme argument, et renvoient une liste de mots, autrement dit + une liste de chaînes. La liste de mot peut être utilisée avec + l'opérateur spécial -in. Les noms de fonctions sont + insensibles à la casse. Les modules peuvent fournir des fonctions + supplémentaires.

    + +

    Il n'existe pas de fonctions internes dont la valeur est une + liste. Le module mod_ssl fournit la fonction + PeerExtList. Voir la description de la directive + SSLRequire pour plus de + détails (notez que la fonction PeerExtList peut aussi + être utilisée en dehors de la directive SSLRequire).

    + +
    top
    +
    +

    Exemples d'expressions

    + + +

    Les exemples suivants montent comment utiliser les + expressions pour évaluer les requêtes :

    + +
    # Comparer le nom d'hôte avec example.com et rediriger vers
    +# www.example.com si le nom d'hôte correspond
    +<If "%{HTTP_HOST} == 'example.com'">
    +    Redirect permanent "/" "http://www.example.com/"
    +</If>
    +
    +# Forcer le type text/plain si un fichier fait l'objet d'une
    +# requête dont la chaîne de paramètres contient 'forcetext'
    +<If "%{QUERY_STRING} =~ /forcetext/">
    +    ForceType text/plain
    +</If>
    +
    +# N'autoriser l'accès à ce contenu que pendant les heures de
    +# travail
    +<Directory "/foo/bar/business">
    +     Require expr %{TIME_HOUR} -gt 9 && %{TIME_HOUR} -lt 17
    +</Directory>
    +
    +# Vérifie si un en-tête HTTP correspond à une des valeurs d'une liste
    +<If "%{HTTP:X-example-header} in { 'foo', 'bar', 'baz' }">
    +    La définition de l'en-tête correspond à une des valeurs recherchées
    +</If>
    +
    +# Recherche la valeur d'une expression rationnelle dans une variable
    +# d'environnement, et renvoie la négation du résultat.
    +<If "! reqenv('REDIRECT_FOO') =~ /bar/">
    +    La condition est vérifiée
    +</If>
    +
    +# Vérifie le résultat de la recherche d'une correspondance d'URI dans un
    +# contexte de répertoire avec l'option -f
    +<Directory "/var/www">
    +    AddEncoding x-gzip gz
    +<If "-f '%{REQUEST_FILENAME}.unzipme' && ! %{HTTP:Accept-Encoding} =~ /gzip/">
    +      SetOutputFilter INFLATE
    +</If>
    +</Directory>
    +
    +# Vérifie l'adresse IP du client
    +<If "-R '192.168.1.0/24'">
    +    Header set matched true
    +</If>
    +
    +# Exemple de fonction dans un contexte booléen
    +<If "md5('foo') == 'acbd18db4cc2f85cedef654fccc4a4d8'">
    +  Header set checksum-matched true
    +</If>
    +
    +# Function example in string context
    +Header set foo-checksum "expr=%{md5:foo}"
    +
    +# L'exemple suivant retarde l'évaluation de la clause de condition par rapport à
    +# <If>
    +Header always set CustomHeader my-value "expr=%{REQUEST_URI} =~ m#^/special_path\.php$#"
    +
    +# Journalisation conditionnelle
    +CustomLog logs/access-errors.log common "expr=%{REQUEST_STATUS} >= 400"
    +CustomLog logs/access-errors-specific.log common "expr=%{REQUEST_STATUS} -in {'405','410'}"
    + +
    top
    +
    +

    Autres

    + + + + + + + + + + + + + + +
    NomAlternative Description
    -ininchaîne contenue dans une liste de mots
    /regexp/m#regexp#Expression rationnelle (la seconde forme permet de spécifier + des délimiteurs autres que /)
    /regexp/im#regexp#iExpression rationnelle insensible à la casse
    $0 ... $9 + Références arrières dans les expressions rationnelles
    + +

    Références arrières dans les expressions rationnelles

    + +

    Les chaînes $0 ... $9 permettent de + référencer les groupes de capture en provenance d'expressions + rationnelles précédemment exécutées et mises en correspondance avec + succès. Elles ne peuvent normalement être utilisées que dans la + même expression que celle mise en correspondance, mais certains + modules permettent de les utiliser de manière spéciale.

    + + +
    top
    +
    +

    Comparaison avec SSLRequire

    + +

    La syntaxe ap_expr consiste principalement en une + surcouche de la syntaxe de la directive obsolète SSLRequire. Vous pouvez consulter la + liste de leur différences dans la documentation de la directive + SSLRequire.

    +
    top
    +
    +

    Historique de version

    + +

    La fonction req_novary est + disponible à partir de la version 2.4.4 du serveur HTTP Apache.

    +
    +
    +

    Langues Disponibles:  en  | + fr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/faq/index.html b/docs/manual/faq/index.html new file mode 100644 index 0000000..6099102 --- /dev/null +++ b/docs/manual/faq/index.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: index.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: index.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: index.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 + +URI: index.html.zh-cn.utf8 +Content-Language: zh-cn +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/faq/index.html.en b/docs/manual/faq/index.html.en new file mode 100644 index 0000000..87065ef --- /dev/null +++ b/docs/manual/faq/index.html.en @@ -0,0 +1,50 @@ + + + + + +Frequently Asked Questions - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Frequently Asked Questions

    +
    +

    Available Languages:  en  | + es  | + fr  | + tr  | + zh-cn 

    +
    + + +

    The FAQ has been moved to the HTTP Server Wiki.

    +
    +
    +
    +

    Available Languages:  en  | + es  | + fr  | + tr  | + zh-cn 

    +
    + \ No newline at end of file diff --git a/docs/manual/faq/index.html.es b/docs/manual/faq/index.html.es new file mode 100644 index 0000000..baa5894 --- /dev/null +++ b/docs/manual/faq/index.html.es @@ -0,0 +1,50 @@ + + + + + +Preguntas Frecuentes - Servidor HTTP Apache Versión 2.4 + + + + + + + +
    <-
    +

    Preguntas Frecuentes

    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + tr  | + zh-cn 

    +
    + + +

    Las preguntas frecuentes se han movido a la Wiki de HTTP Server (en Inglés).

    +
    +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + tr  | + zh-cn 

    +
    + \ No newline at end of file diff --git a/docs/manual/faq/index.html.fr.utf8 b/docs/manual/faq/index.html.fr.utf8 new file mode 100644 index 0000000..c682406 --- /dev/null +++ b/docs/manual/faq/index.html.fr.utf8 @@ -0,0 +1,50 @@ + + + + + +Foire aux questions - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Foire aux questions

    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + tr  | + zh-cn 

    +
    + + +

    La FAQ a été transférée vers le Wiki du serveur HTTP.

    +
    +
    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + tr  | + zh-cn 

    +
    + \ No newline at end of file diff --git a/docs/manual/faq/index.html.tr.utf8 b/docs/manual/faq/index.html.tr.utf8 new file mode 100644 index 0000000..fe87b5f --- /dev/null +++ b/docs/manual/faq/index.html.tr.utf8 @@ -0,0 +1,50 @@ + + + + + +Sıkça Sorulan Sorular - Apache HTTP Sunucusu Sürüm 2.4 + + + + + + + +
    <-
    +

    Sıkça Sorulan Sorular

    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + tr  | + zh-cn 

    +
    + +

    SSS belgesi HTTP Server + Wiki'ye taşındı.

    +
    +
    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + tr  | + zh-cn 

    +
    + \ No newline at end of file diff --git a/docs/manual/faq/index.html.zh-cn.utf8 b/docs/manual/faq/index.html.zh-cn.utf8 new file mode 100644 index 0000000..5151cda --- /dev/null +++ b/docs/manual/faq/index.html.zh-cn.utf8 @@ -0,0 +1,49 @@ + + + + + +常è§é—®é¢˜ - Apache HTTP æœåС噍 版本 2.4 + + + + + + + +
    <-
    +

    常è§é—®é¢˜

    +
    +

    å¯ç”¨è¯­è¨€:  en  | + es  | + fr  | + tr  | + zh-cn 

    +
    + +

    常è§é—®é¢˜å·²ç»ç§»åˆ° HTTP æœåŠ¡å™¨ç»´åŸºã€‚

    +
    +
    +
    +

    å¯ç”¨è¯­è¨€:  en  | + es  | + fr  | + tr  | + zh-cn 

    +
    + \ No newline at end of file diff --git a/docs/manual/filter.html b/docs/manual/filter.html new file mode 100644 index 0000000..1c3ff3e --- /dev/null +++ b/docs/manual/filter.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: filter.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: filter.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: filter.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: filter.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: filter.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: filter.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/filter.html.en b/docs/manual/filter.html.en new file mode 100644 index 0000000..b8038b3 --- /dev/null +++ b/docs/manual/filter.html.en @@ -0,0 +1,183 @@ + + + + + +Filters - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Filters

    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    This document describes the use of filters in Apache.

    +
    + +
    top
    +
    +

    Filtering in Apache 2

    + + + +

    The Filter Chain is available in Apache 2.0 and higher, +and enables applications to process incoming and outgoing data +in a highly flexible and configurable manner, regardless of +where the data comes from. We can pre-process incoming data, +and post-process outgoing data, at will. This is basically +independent of the traditional request processing phases.

    +

    +Filters can be chained, in a Data Axis orthogonal to request processing +

    +

    Some examples of filtering in the standard Apache distribution are:

    + +

    Apache also uses a number of filters internally to perform +functions like chunking and byte-range handling.

    + +

    A wider range of applications are implemented by third-party filter +modules. A few of these are:

    + +
      +
    • HTML and XML processing and rewriting
    • +
    • XSLT transforms and XIncludes
    • +
    • XML Namespace support
    • +
    • File Upload handling and decoding of HTML Forms
    • +
    • Image processing
    • +
    • Protection of vulnerable applications such as PHP scripts
    • +
    • Text search-and-replace editing
    • +
    +
    top
    +
    +

    Smart Filtering

    + +

    +Smart filtering applies different filter providers according to the state of request processing +

    +

    mod_filter, included in Apache 2.1 and later, +enables the filter chain to be configured dynamically at run time. +So for example you can set up a proxy to rewrite +HTML with an HTML filter and JPEG images with a completely +separate filter, despite the proxy having no prior information +about what the origin server will send. This works by using a +filter harness, that dispatches to different providers according +to the actual contents at runtime. Any filter may be either +inserted directly in the chain and run unconditionally, or +used as a provider and inserted dynamically. For example,

    +
      +
    • an HTML processing filter will only run if the content is +text/html or application/xhtml+xml
    • +
    • A compression filter will only run if the input is a +compressible type and not already compressed
    • +
    • A charset conversion filter will be inserted if a text +document is not already in the desired charset
    • +
    +
    top
    +
    +

    Exposing Filters as an HTTP Service

    + + +

    Filters can be used to process content originating from the client in +addition to processing content originating on the server using the +mod_reflector module.

    + +

    mod_reflector accepts POST requests from clients, and reflects +the content request body received within the POST request back in the response, +passing through the output filter stack on the way back to the client.

    + +

    This technique can be used as an alternative to a web service running within +an application server stack, where an output filter provides the transformation +required on the request body. For example, the mod_deflate +module might be used to provide a general compression service, or an image +transformation filter might be turned into an image transformation service.

    + +
    top
    +
    +

    Using Filters

    + +

    There are two ways to use filtering: Simple and Dynamic. +In general, you should use one or the other; mixing them can +have unexpected consequences (although simple Input filtering +can be mixed freely with either simple or dynamic Output filtering).

    +

    The Simple Way is the only way to configure input filters, and is +sufficient for output filters where you need a static filter chain. +Relevant directives are + SetInputFilter, + SetOutputFilter, + AddInputFilter, + AddOutputFilter, + RemoveInputFilter, and + RemoveOutputFilter.

    + +

    The Dynamic Way enables both static and flexible, dynamic configuration +of output filters, as discussed in the mod_filter page. +Relevant directives are + FilterChain, + FilterDeclare, and + FilterProvider.

    + +

    One further directive AddOutputFilterByType is still supported, +but deprecated. Use dynamic configuration instead.

    + +
    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/filter.html.es b/docs/manual/filter.html.es new file mode 100644 index 0000000..0483be6 --- /dev/null +++ b/docs/manual/filter.html.es @@ -0,0 +1,204 @@ + + + + + +Filtros - Servidor HTTP Apache Versión 2.4 + + + + + + + +
    <-
    +

    Filtros

    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    +
    Esta traducción podría estar + obsoleta. Consulte la versión en inglés de la + documentación para comprobar si se han producido cambios + recientemente.
    + +

    Este documento describe cómo usar filtros en Apache.

    +
    + +
    top
    +
    +

    Filtros en Apache 2

    + + + +

    La cadena de filtrado está disponible en Apache 2.0 y superiores. + Un filtro es un proceso que se aplica a los datos que + se reciben o se envían por el servidor. Los datos enviados + por los clientes al servidor son procesados por filtros de + entrada mientras que los datos enviados por el servidor se + procesan por los filtros de salida. A los datos se les + pueden aplicar varios filtros, y el orden en que se aplica cada + filtro puede especificarse explícitamente. + Todo este proceso es independiente de las tradicionales fase de + peticiones

    +

    + Filters can be chained, in a Data Axis orthogonal to request processing +

    +

    Algunos ejemplos de filtrado en la distribución estándar de Apache son:

    +
      +
    • mod_include, implementa server-side includes (SSI).
    • +
    • mod_ssl, implementa cifrado SSL (https).
    • +
    • mod_deflate, implementa compresión y descompresión en el acto.
    • +
    • mod_charset_lite, transcodificación entre diferentes juegos de caracteres.
    • +
    • mod_ext_filter, ejecuta un programa externo como filtro.
    • +
    +

    Los filtros se usan internamente por Apache para llevar a cabo + funciones tales como chunking y servir peticiones de + byte-range. Además, los módulos contienen filtros que se + pueden seleccionar usando directivas de configuración al + iniciar el servidor.

    + +

    Una mayor amplitud de aplicaciones son implementadas con módulos de + filtros de terceros que estan disponibles en modules.apache.org y en otros lados. + algunos de ellos son:

    + +
      +
    • Procesamiento y reescritura de HTML y XML.
    • +
    • Transformaciones de XSLT y XIncludes.
    • +
    • Soporte de espacios de nombres en XML.
    • +
    • Manipulación de carga de archivos y decodificación de los + formularios HTML.
    • +
    • Procesamiento de imágenes.
    • +
    • Protección de aplicaciones vulnerables, tales como scripts PHP
    • +
    • Edición de texto de búsqueda y remplazo.
    • +
    +
    top
    +
    +

    Filtrado Inteligente

    + +

    + Smart filtering applies different filter providers according to the state of request processing +

    +

    mod_filter, incluido en Apache 2.1 y posterior, + habilita la cadena de filtrado para ser configurada dinámicamente en + tiempo de ejecución. Así, por ejemplo, usted puede configurar un + proxy para que reescriba HTML con un filtro de HTML y imágenes JPEG + con filtros completos por separado, a pesar de que el proxy no tiene + información previa sobre lo que enviará al servidor de origen. + Esto funciona usando un engranaje filtros, que envía a diferentes + proveedores dependiendo del contenido en tiempo de ejecución. + Cualquier filtro puede ser, ya sea insertado directamente en la + cadena y ejecutado incondicionalmente, o usado como proveedor y + añadido dinámicamente + Por ejemplo:

    +
      +
    • Un filtro de procesamiento de HTML sólo se ejecuta si el + contenido es text/html o application/xhtml + xml.
    • +
    • Un filtro de compresión sólo se ejecuta si la entrada es un tipo + compresible y no está ya comprimida.
    • +
    • Se insertará un filtro de conversión de juego de caracteres, + si un documento de texto no está ya en el juego de caracteres + deseado.
    • +
    +
    top
    +
    +

    Filtros expuestos como un servicio HTTP

    + + +

    Los filtros pueden ser usados para procesar contenido originado + desde el cliente además de usarse para procesar el contenido originado + desde el propio servidor usando el módulo mod_reflector.

    + +

    mod_reflector acepta peticiones POST de los clientes, y + refleja el cuerpo de la petición POST recibida, dentro del contenido de la + respuesta de la petición, pasa a través de la pila del filtro de salida en + el camino de vuelta al cliente.

    + +

    Esta técnica se puede utilizar como una alternativa a un servicio web + que se ejecuta en una pila de de aplicaciones dentro del servidor, + en donde el filtro de salida proporciona la transformación requerida en el + cuerpo de la petición. Por ejemplo, el módulo mod_deflate + puede ser usado para proporcionar un servicio de compresión general, + o un filtro de transformación de imagen, puede ser convertido en un + servicio de conversión de imágenes. +

    + +
    top
    +
    +

    Usando los Filtros

    + +

    Hay dos formas de usar el filtrado: de forma Simple y Dinámica. + Generalmente, deberá usar una forma u otra; ya que mezclarlas puede + causar consecuencias inesperadas (a pesar de que reglas de Entrada de + tipo simple pueden ser combinadas libremente con reglas de filtrado + de Salidas de tipo simple o dinámico).

    +

    La forma más sencilla es la única manera de configurar filtros de + Entrada, y es suficiente para filtros de Salida donde se necesita una + cadena de filtros estática. + Las directivas más relevantes son: + SetInputFilter, + SetOutputFilter, + AddInputFilter, + AddOutputFilter, + RemoveInputFilter, and + RemoveOutputFilter.

    + +

    La forma Dinámica habilita ambas configuraciones estática, y dinámica, para los filtros de Salida, como se plantea en la página mod_filter. + Las directivas más relevantes son: + FilterChain, + FilterDeclare, and + FilterProvider.

    + +

    Una directiva más como es AddOutputFilterByType sigue siendo + soportada pero esta obsoleta. Usa en cambio la configuración dinámica.

    + +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comentarios

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/filter.html.fr.utf8 b/docs/manual/filter.html.fr.utf8 new file mode 100644 index 0000000..25406f7 --- /dev/null +++ b/docs/manual/filter.html.fr.utf8 @@ -0,0 +1,201 @@ + + + + + +Filtres - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Filtres

    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Ce document décrit l'utilisation des filtres avec Apache.

    +
    + +
    top
    +
    +

    Le filtrage avec Apache 2

    + + + +

    La chaîne de filtrage est disponible depuis la version 2.0 d'Apache, +et permet aux applications de traiter les données en entrée et en sortie +d'une manière hautement flexible et configurable, quelle que soit la +provenance de ces données. Il est possible de pré-traiter les données +en entrée, et post-traiter les données en sortie, selon +vos souhaits. +Ces traitements sont tout à fait indépendants des traditionnelles phases +de traitement des requêtes.

    +

    +les filtres peuvent s'enchaîner, perpendiculairement au traitement des requêtes +

    +

    Voici quelques exemples de filtrage avec la distribution standard d'Apache:

    +
      +
    • mod_include, implémente les inclusions côté serveur.
    • +
    • mod_ssl, implémente le cryptage SSL (https).
    • +
    • mod_deflate, implémente la compression/décompression +à la volée.
    • +
    • mod_charset_lite, transcodage entre différents +jeux de caractères.
    • +
    • mod_ext_filter, utilisation d'un programme externe +comme filtre.
    • +
    +

    Apache utilise aussi plusieurs filtres en interne pour accomplir des tâches +comme le découpage des grosses requêtes (chunking) et la gestion des +requêtes portant sur une partie d'un fichier (byte-range).

    + +

    Un grand choix d'applications sont implémentées par des modules de filtrage +tiers. En voici quelques exemples :

    + +
      +
    • Traitement et réécriture HTML et XML
    • +
    • Transformations XSLT et inclusions XML (XIncludes)
    • +
    • Support de l'espace de nommage XML
    • +
    • Gestion du chargement de fichier et décodage des formulaires HTML
    • +
    • Traitement d'image
    • +
    • Protection des applications vulnérables comme les scripts PHP
    • +
    • Edition de texte par Chercher/Remplacer
    • +
    +
    top
    +
    +

    Filtrage intelligent

    + +

    +Le filtrage intelligent applique différents fournisseurs de filtrage en fonction de l'état du traitement de la requête +

    +

    mod_filter, inclus dans les version 2.1 et supérieures +d'Apache, permet de configurer la chaîne de filtrage dynamiquement +à l'exécution. +Ainsi par exemple, vous pouvez définir un proxy pour réécrire du code HTML +avec un filtre HTML et traiter des images JPEG avec un filtre totalement +séparé, bien que le proxy ne possède aucune information préliminaire +sur ce que le serveur à l'origine des données à filtrer va envoyer. +Ceci fonctionne grâce à l'utilisation d'un gestionnaire de filtre, +qui distribue les tâches à différents fournisseurs de filtrage en fonction +du contenu réel à filtrer à l'exécution. Tout filtre peut se voir soit +inséré directement dans la chaîne et lancé inconditionnellement, soit +utilisé comme un fournisseur de filtrage et inséré dynamiquement. +Par exemple,

    +
      +
    • un filtre de traitement HTML sera lancé uniquement si le contenu est +de type text/html ou application/xhtml+xml
    • +
    • Un filtre de compression sera lancé uniquement si les données en entrée +sont de type compressible et non déjà compressées
    • +
    • Un filtre de conversion de jeux de caractères ne sera inséré que si +le document texte n'est pas déjà dans le jeu de caractères voulu
    • +
    +
    top
    +
    +

    Présentation des filtres en tant que service HTTP

    + + +

    Les filtres permettent de traiter les requêtes des clients avant +traitement par le serveur, ainsi que les contenus issus du serveur avant de les renvoyer +au client. Le module mod_reflector permet aussi +d'utiliser les filtres pour traiter les requêtes des clients avant de +les renvoyer directement à ces derniers.

    + +

    Le module mod_reflector reçoit les requêtes POST des +clients, et en répercute le corps dans la requête POST constituant la +réponse, lors de l'envoi de cette dernière au client en passant à travers la +pile de filtres en sortie.

    + +

    Cette technique peut être utilisée comme alternative à un service web +s'exécutant à l'intérieur de la pile d'un serveur d'applications, où un +filtre en sortie effectue la transformation requise sur le corps de la +requête. Par exemple, on peut utiliser le module +mod_deflate pour fournir un service général de +compression ; un filtre de transformation d'images peut aussi se voir +mué en service de transformation d'images.

    + +
    top
    +
    +

    Utilisation des filtres

    + +

    Il y a deux manières d'utiliser le filtrage : Simple et Dynamique. +En général, vous utiliserez l'une ou l'autre méthode; le mélange des deux +peut avoir des conséquences inattendues (bien que le filtrage simple en entrée +puisse être associé sans problème avec le filtrage simple ou dynamique +en sortie).

    +

    La méthode Simple est la seule permettant de configurer les filtres +en entrée, et suffit pour les filtres en sortie pour lesquels vous avez besoin +d'une chaîne de filtres statique. +Les directives correspondantes sont + SetInputFilter, + SetOutputFilter, + AddInputFilter, + AddOutputFilter, + RemoveInputFilter, et + RemoveOutputFilter.

    + +

    La méthode Dynamique permet une configuration dynamique des filtres en +sortie à la fois statique et flexible, comme discuté dans la page +mod_filter. +Les directives correspondantes sont + FilterChain, + FilterDeclare, et + FilterProvider.

    + +

    Une autre directive AddOutputFilterByType est encore supportée, +mais obsolète. Utilisez la +configuration dynamique à la place.

    + +
    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/filter.html.ja.utf8 b/docs/manual/filter.html.ja.utf8 new file mode 100644 index 0000000..d4fe88d --- /dev/null +++ b/docs/manual/filter.html.ja.utf8 @@ -0,0 +1,112 @@ + + + + + +フィルタ - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    フィルタ

    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + +

    Apache ã§ã®ãƒ•ィルタã®ä½¿ã„æ–¹ã«ã¤ã„ã¦è¨˜è¿°ã—ã¦ã„ã¾ã™ã€‚

    +
    +
    top
    +
    +

    フィルタ

    + + + +

    フィルタ ã¨ã¯ã€ã‚µãƒ¼ãƒãŒé€å—ä¿¡ã—ãŸãƒ‡ãƒ¼ã‚¿ã« + é©ç”¨ã•れる処ç†ãƒ—ロセスã®ã“ã¨ã‚’ã„ã„ã¾ã™ã€‚クライアントã‹ã‚‰ã‚µãƒ¼ãƒã« + é€ã‚‰ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã¯ 入力フィルタ ã«ã‚ˆã£ã¦ã€ã‚µãƒ¼ãƒã‹ã‚‰ + クライアントã«é€ã‚‰ã‚Œã‚‹ãƒ‡ãƒ¼ã‚¿ã¯å‡ºåŠ›ãƒ•ã‚£ãƒ«ã‚¿ã«ã‚ˆã£ã¦ + 処ç†ã•れã¾ã™ã€‚複数ã®ãƒ•ィルタをé©ç”¨ã™ã‚‹ã“ã¨ãŒã§ã〠+ ãã®é †ç•ªã‚’åŽ³å¯†ã«æŒ‡å®šã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚

    + +

    Apache 内部ã§ã¯ã€ãƒãƒ£ãƒ³ã‚¯ (データã®ã¶ã¤åˆ‡ã‚Š) を行ã£ãŸã‚Šã€ + ãƒã‚¤ãƒˆç¯„å›²ã®æŒ‡å®šã•れãŸãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’扱ã£ãŸã‚Šã¨ã„ã£ãŸæ©Ÿèƒ½ã‚’ + 行ã†éš›ã«ã€ãƒ•ィルタãŒä½¿ã‚れã¦ã„ã¾ã™ã€‚ãれã«åŠ ãˆã¦ã€ + 実行時ã®è¨­å®šãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã§é¸æŠžãŒå¯èƒ½ãªãƒ•ィルタを + ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãŒæä¾›ã§ãã¾ã™ã€‚ + データã«é©å¿œã•れるフィルタã®ã‚»ãƒƒãƒˆã¯ã€ + SetInputFilter, + SetOutputFilter, + AddInputFilter, + AddOutputFilter, + RemoveInputFilter, + RemoveOutputFilter + ディレクティブã§åˆ¶å¾¡ã§ãã¾ã™ã€‚

    + +

    ç¾è¡Œã® Apache HTTP サーãƒã®é…布ã§ã¯ã€ + 次ã®ãƒ¦ãƒ¼ã‚¶é¸æŠžå¯èƒ½ãªãƒ•ã‚£ãƒ«ã‚¿ãŒæä¾›ã•れã¦ã„ã¾ã™ã€‚

    + +
    +
    INCLUDES
    +
    mod_include ã§ Server-Side Include ã‚’ã—ã¾ã™ã€‚
    +
    DEFLATE
    +
    mod_deflate + を使ã£ã¦ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«é€ä¿¡ã™ã‚‹å‰ã«å‡ºåŠ›ã‚’åœ§ç¸®ã—ã¾ã™ã€‚
    +
    + +

    ã¾ãŸã€mod_ext_filter モジュール㧠+ 外部プログラムをフィルタã¨ã—ã¦æŒ‡å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    +
    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/filter.html.ko.euc-kr b/docs/manual/filter.html.ko.euc-kr new file mode 100644 index 0000000..9ac6a3d --- /dev/null +++ b/docs/manual/filter.html.ko.euc-kr @@ -0,0 +1,108 @@ + + + + + +ÇÊÅÍ - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    ÇÊÅÍ

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + +

    ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡¿¡¼­ ÇÊÅ͸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.

    +
    +
    top
    +
    +

    ÇÊÅÍ

    + + + +

    ÇÊÅÍ(filter)´Â ¼­¹ö°¡ º¸³»°Å³ª ¹Þ´Â ÀÚ·á¿¡ + Àû¿ëµÇ´Â ÀÛ¾÷ÀÌ´Ù. Ŭ¶óÀÌ¾ðÆ®°¡ ¼­¹ö¿¡°Ô º¸³»´Â ÀÚ·á´Â + ÀÔ·ÂÇÊÅÍ(input filter)°¡ ó¸®Çϰí, ¼­¹ö°¡ + Ŭ¶óÀÌ¾ðÆ®¿¡°Ô º¸³»´Â ÀÚ·á´Â Ãâ·ÂÇÊÅÍ(output filter)°¡ + ó¸®ÇÑ´Ù. ÀÚ·á¿¡ ¿©·¯ ÇÊÅ͸¦ »ç¿ëÇÒ ¼ö ÀÖ°í, Á÷Á¢ ÇÊÅÍÀÇ + ¼ø¼­¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.

    + +

    ¾ÆÆÄÄ¡´Â À̾î¹Þ±â(byte-range) ¿äû µîÀ» ó¸®ÇϱâÀ§ÇØ + ³»ºÎÀûÀ¸·Î ÇÊÅ͸¦ »ç¿ëÇÑ´Ù. ¶Ç, ¼³Á¤ Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© ¼±Åð¡´ÉÇÑ ÇÊÅ͸¦ Á¦°øÇÏ´Â ¸ðµâµµ ÀÖ´Ù. + SetInputFilter, + SetOutputFilter, + AddInputFilter, + AddOutputFilter, + RemoveInputFilter, + RemoveOutputFilter + Áö½Ã¾î·Î ÀڷḦ ó¸®ÇÏ´Â ÇÊÅ͸¦ Á¶ÀýÇÑ´Ù.

    + +

    ÇöÀç ¾ÆÆÄÄ¡ À¥¼­¹ö ¹èÆ÷º»Àº »ç¿ëÀÚ°¡ ¼±ÅÃÇÒ ¼ö ÀÖ´Â ´ÙÀ½°ú + °°Àº ÇÊÅ͸¦ Á¦°øÇÑ´Ù.

    + +
    +
    INCLUDES
    +
    mod_include°¡ ó¸®ÇÏ´Â Server-Side Includes
    +
    DEFLATE
    +
    mod_deflate¸¦ »ç¿ëÇÏ¿© Ãâ·ÂÀ» + Ŭ¶óÀÌ¾ðÆ®·Î º¸³»±â Àü¿¡ ¾ÐÃà +
    +
    + +

    ¶Ç, mod_ext_filter ¸ðµâÀ» »ç¿ëÇÏ¿© + ¿ÜºÎ ÇÁ·Î±×·¥À» ÇÊÅÍ·Î »ç¿ëÇÒ ¼öµµ ÀÖ´Ù.

    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/filter.html.tr.utf8 b/docs/manual/filter.html.tr.utf8 new file mode 100644 index 0000000..1b1a482 --- /dev/null +++ b/docs/manual/filter.html.tr.utf8 @@ -0,0 +1,194 @@ + + + + + +Süzgeçler - Apache HTTP Sunucusu Sürüm 2.4 + + + + + + + +
    <-
    +

    Süzgeçler

    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Bu belge, Apache’de süzgeç kullanımı hakkındadır.

    +
    + +
    top
    +
    +

    Apache 2’de Süzme İşlemi

    + + +

    Apache 2.0 ve sonrasında mevcut olan Süzgeç Zinciri, uygulamaların + nereden geldiğine bakmaksızın gelen ve giden verileri oldukça esnek ve + yapılandırılabilir tarzda işlemesini mümkün kılar. Böylece, gelen veriyi + bir takım ön işlemlerden geçirebilir, giden veriyi de son bir defa bazı + işlemlere sokabiliriz. Bu işlem temel olarak geleneksel istek işleme + aşamalarından bağımsızdır.

    + +

    + Süzgeçler, İstek işleme eksenine dik bir veri eksenine peş peşe  yerleştirilebilir. +

    + +

    Standard Apache dağıtımıyla gelen süzgeç uygulamalarından bazıları:

    + +
      +
    • mod_include, sunucu taraflı içerik yerleÅŸtirmeyi + gerçekler.
    • +
    • mod_ssl, SSL ÅŸifrelemesini gerçekler (https).
    • +
    • mod_deflate, veri sıkıştırma/açma iÅŸlemlerini + çalışma anında gerçekleÅŸtirir.
    • +
    • mod_charset_lite, karakter kümeleri arasında + dönüşümü gerçekleÅŸtirir.
    • +
    • mod_ext_filter, harici bir yazılımı bir süzgeç + olarak çalıştırır.
    • +
    + +

    Apache, bunlardan başka, bayt dizilerinin elde edilmesi ve içeriğin + bölünmesi gibi işlemleri gerçekleştirmek için bir takım dahili süzgeçler + de kullanabilir.

    + +

    Üçüncü parti süzgeç modülleri tarafından gerçeklenmiş + modüllerden bazılarının uygulama alanları:

    + +
      +
    • HTML ve XML belgelerin iÅŸlenmesi ve yazılması
    • +
    • XSLT dönüşümleri ve XInclude’lar
    • +
    • XML İsim-alanı desteÄŸi
    • +
    • HTML Formlarının çözümlenmesi ve sunucuya dosya yükleme
    • +
    • Resim iÅŸleme
    • +
    • PHP betikleri gibi zararlı olabilecek uygulamalardan korunma
    • +
    • Metin düzenleme ve arama iÅŸlemleri
    • +
    +
    top
    +
    +

    Akıllı Süzme

    +

    + Farklı süzgeç üreticilerinin uygulamaları istek işlemenin durumuna  bağlı olarak akıllıca uygulanabilir. +

    + +

    mod_filter, Apache 2.1 ve sonrasında mevcut olup, + süzgeç zincirinin çalışma anında devingen olarak yapılandırılabilmesini + mümkün kılar. Böylece, örneğin, bir vekili, özgün sunucunun ne + göndereceğini bilmeden HTML’yi bir HTML süzgeciyle yazmaya ve JPEG + resimleri tamamen farklı bir süzgeçten geçirmeye ayarlayabilirsiniz. Bu, + asıl içeriğe bağlı olarak çalışma anında içeriği farklı içerik + sağlayıcılara dağıtan bir süzgeç düzeneği kullanılarak çalışır. Bir + süzgeç, doğrudan zincire yerleştirilip koşulsuz olarak + çalıştırılabileceği gibi bir içerik sağlayıcı gibi kullanılarak zincire + devingen olarak yerleştirilebilir. Örneğin:

    + +
      +
    • Bir HTML iÅŸleme süzgeci sadece içerik text/html veya + application/xhtml+xml olduÄŸu takdirde çalışır.
    • +
    • Bir sıkıştırma süzgeci sadece girdi sıkıştırılabilir nitelikteyse ve + sıkıştırılmamışsa çalışır.
    • +
    • Bir karakter kümesi dönüşüm süzgeci, bir metin belgesi istenen + karakter kümesine sahip deÄŸilse zincire yerleÅŸtirilir.
    • +
    +
    top
    +
    +

    Süzgeçleri bir HTTP Hizmeti gibi göstermek

    + +

    Süzgeçler, istemciden kaynaklanan içeriği işlemekte kullanılabileceği + gibi mod_reflector modülü kullanılarak sunucudan + kaynaklanan içeriği işlemekte de kullanılabilir.

    + +

    mod_reflector istemcilerden gelen POST isteklerini + kabul eder ve çıktı süzgeç yığıtı yoluyla istemciye aktararak, POST + isteği içinde alınan içerik istek gövdesini yanıt içinde geri + gönderir.

    + +

    Bu teknik, bir çıktı süzgeciyle istek gövdesinde gerekli dönüşümün + sağlandığı durumda, bir uygulama sunucusu yığıtı içinde çalışan bir http + hizmetinin yerine de kullanılabilir. Örneğin, + mod_deflate modülü genel bir sıkıştırma hizmeti + sağlamakta kullanılabilir veya bir resim dönüştürme süzgeci bir resim + dönüşüm hizmeti haline getirilebilir.

    + +
    top
    +
    +

    Süzgeçlerin Kullanımı

    +

    Süzgeçler iki şekilde kullanılır: Basit ve Devingen. + Genelde ikisinden biri kullanılır; karışık kullanılırsa istenmeyen + sonuçlara yol açabilir (ise de, basit girdi süzme ile çıktı süzme işlemi + basit olsun olmasın karışık kullanılabilir).

    + +

    Basit yol, girdi süzgeçlerini yapılandırmanın tek yoludur ve bir + durağan süzgeç zincirinin gerektiği yerlerde çıktı süzgeçleri için + yeterlidir. İlgili yönergeler: + SetInputFilter, + SetOutputFilter, + AddInputFilter, + AddOutputFilter, + RemoveInputFilter ve + RemoveOutputFilter.

    + +

    Devingen yol, mod_filter belgesinde açıklandığı gibi, + çıktı süzgeçlerinin hem durağan hem de esnek ve devingen olarak + yapılandırılabilmesini mümkün kılar. İlgili yönergeler: + FilterChain, + FilterDeclare ve + FilterProvider.

    + +

    AddOutputFilterByType yönergesi + hala desteklenmekteyse de kullanımı artık + önerilmemektedir. Onun yerine devingen yapılandırma kullanınız.

    + +
    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Yorumlar

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/getting-started.html b/docs/manual/getting-started.html new file mode 100644 index 0000000..5c47e99 --- /dev/null +++ b/docs/manual/getting-started.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: getting-started.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: getting-started.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: getting-started.html.ru.utf8 +Content-Language: ru +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/getting-started.html.en b/docs/manual/getting-started.html.en new file mode 100644 index 0000000..08f0aa0 --- /dev/null +++ b/docs/manual/getting-started.html.en @@ -0,0 +1,254 @@ + + + + + +Getting Started - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Getting Started

    +
    +

    Available Languages:  en  | + fr  | + ru 

    +
    + +

    If you're completely new to the Apache HTTP Server, or even to running +a website at all, you might not know where to start, or what questions to +ask. This document walks you through the basics.

    +
    + +
    top
    +
    +

    Clients, Servers, and URLs

    + + +

    +Addresses on the Web are expressed with URLs - Uniform Resource Locators +- which specify a protocol (e.g. http), a servername (e.g. +www.apache.org), a URL-path (e.g. +/docs/current/getting-started.html), and possibly a query +string (e.g. ?arg=value) used to pass additional +arguments to the server. +

    + +

    A client (e.g., a web browser) connects to a server (e.g., your Apache HTTP Server), +with the specified protocol, and makes a request for a resource using the +URL-path.

    + +

    The URL-path may represent any number of things on the server. It may +be a file (like getting-started.html) a handler (like server-status) or some kind of program +file (like index.php). We'll discuss this more below in +the Web Site Content section.

    + +

    +The server will send a response consisting of a status +code and, optionally, a response body. +The status code indicates whether the request was successful, and, if not, what +kind of error condition there was. This tells the client what it should +do with the response. You can read about the possible response codes in +HTTP Server +wiki.

    + +

    Details of the transaction, and any error conditions, are written to +log files. This is discussed in greater detail below in the Logs Files and Troubleshooting section.

    + +
    top
    +
    +

    Hostnames and DNS

    + + +

    In order to connect to a server, the client will first have to resolve +the servername to an IP address - the location on the Internet where the +server resides. Thus, in order for your web server to be reachable, it +is necessary that the servername be in DNS.

    + +

    If you don't know how to do this, you'll need to contact your network +administrator, or Internet service provider, to perform this step for +you.

    + +

    More than one hostname may point to the same IP address, and more +than one IP address can be attached to the same physical server. Thus, you +can run more than one web site on the same physical server, using a +feature called virtual hosts.

    + +

    If you are testing a server that is not Internet-accessible, you +can put host names in your hosts file in order to do local resolution. +For example, you might want to put a record in your hosts file to map a +request for www.example.com to your local system, for +testing purposes. This entry would look like:

    + +

    +127.0.0.1 www.example.com +

    + +

    A hosts file will probably be located at /etc/hosts or +C:\Windows\system32\drivers\etc\hosts.

    + +

    You can read more about the hosts file at Wikipedia.org/wiki/Hosts_(file), and +more about DNS at Wikipedia.org/wiki/Domain_Name_System.

    +
    top
    +
    +

    Configuration Files and Directives

    + + +

    The Apache HTTP Server is configured via simple text files. +These files may be located any of a variety of places, depending on how +exactly you installed the server. Common locations for these files may +be found in +the httpd wiki. If you installed httpd from source, the default +location of the configuration files is +/usr/local/apache2/conf. The default configuration file is +usually called httpd.conf. This, too, can vary in +third-party distributions of the server.

    + +

    The configuration is frequently broken into multiple smaller files, +for ease of management. These files are loaded via the Include directive. The names or locations of +these sub-files are not magical, and may vary greatly from one +installation to another. Arrange and subdivide these files as +makes the most sense to you. If the file arrangement +you have by default doesn't make sense to you, feel free to rearrange it.

    + +

    The server is configured by placing configuration directives in these +configuration files. A directive is a keyword followed by one or more +arguments that set its value.

    + +

    The question of "Where should I put that +directive?" is generally answered by considering where you want a +directive to be effective. If it is a global setting, it should appear +in the configuration file, outside of any <Directory>, <Location>, <VirtualHost>, or other section. If it is to +apply only to a particular directory, then it should go inside a +<Directory> section referring to +that directory, and so on. See the Configuration +Sections document for further discussion of these sections.

    + +

    In addition to the main configuration files, certain directives may go in +.htaccess files located in the content directories. +.htaccess files are primarily for people who do not have +access to the main server configuration file(s). You can read more about +.htaccess files in the .htaccess howto.

    + +
    top
    +
    +

    Web Site Content

    + + +

    Web site content can take many different forms, but may be broadly +divided into static and dynamic content.

    + +

    Static content is things like HTML files, image files, CSS files, +and other files that reside in the filesystem. The DocumentRoot directive specifies where in your +filesystem you should place these files. This directive is either set +globally, or per virtual host. Look in your configuration file(s) to +determine how this is set for your server.

    + +

    Typically, a document called index.html will be served +when a directory is requested without a file name being specified. For +example, if DocumentRoot is set to +/var/www/html and a request is made for +http://www.example.com/work/, the file +/var/www/html/work/index.html will be served to the +client.

    + +

    Dynamic content is anything that is generated at request +time, and may change from one request to another. There are numerous +ways that dynamic content may be generated. Various handlers are available to generate content. CGI programs may be written to generate +content for your site.

    + +

    Third-party modules like mod_php may be used to write code that does a +variety of things. Many third-party applications, written using a +variety of languages and tools, are available for download and +installation on your Apache HTTP Server. Support of these third-party +things is beyond the scope of this documentation, and you should find +their documentation or other support forums to answer your questions +about them.

    +
    top
    +
    +

    Log Files and Troubleshooting

    + +

    As an Apache HTTP Server administrator, your most valuable assets are +the log files, and, in particular, the error log. Troubleshooting any +problem without the error log is like driving with your eyes closed.

    + +

    The location of the error log is defined by the ErrorLog directive, which may be set globally, +or per virtual host. Entries in the error log tell you what went wrong, +and when. They often also tell you how to fix it. Each error log message +contains an error code, which you can search for online for even more +detailed descriptions of how to address the problem. You can also +configure your error log to contain a log ID which you can then +correlate to an access log entry, so that you can determine what request +caused the error condition.

    + +

    You can read more about logging in the logs +documentation.

    +
    top
    +
    +

    What's next?

    + + +

    Once you have the prerequisites under your belt, it's time to move +on.

    + +

    This document covers only the bare basics. We hope that this gets you +started, but there are many other things that you might need to +know.

    + + + +
    +
    +

    Available Languages:  en  | + fr  | + ru 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/getting-started.html.fr.utf8 b/docs/manual/getting-started.html.fr.utf8 new file mode 100644 index 0000000..efae661 --- /dev/null +++ b/docs/manual/getting-started.html.fr.utf8 @@ -0,0 +1,277 @@ + + + + + +Pour démarrer - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Pour démarrer

    +
    +

    Langues Disponibles:  en  | + fr  | + ru 

    +
    + +

    Si vous ne connaissez rien au serveur HTTP Apache, ou même au +fonctionnement d'un site web, vous vous demandez probablement par où +commencer et quelles questions poser. Ce document vous permettra de +parcourir les bases du sujet.

    +
    + +
    top
    +
    +

    Clients, serveurs et URLs

    + + +

    +Les adresses des pages web sur la Toile se présentent sous forme d'URLs +- Uniform Resource Locators - qui comportent un protocole (par + exemple http), un nom de serveur (par exemple + www.apache.org), un chemin (par exemple + /docs/current/getting-started.html), et le cas échéant + une chaîne de paramètres (query string) (par exemple ?arg=value) + permettant de transmettre des informations supplémentaires au serveur. +

    + +

    Un client (par exemple un navigateur web) se connecte à un serveur +(par exemple votre serveur HTTP Apache) avec un protocole spécifique, et +effectue une requête pour une ressource en spécifiant +son chemin.

    + +

    Un chemin peut représenter plusieurs types de ressources sur le +serveur. Il peut s'agir d'un fichier (comme +getting-started.html), d'un gestionnaire (comme server-status) ou d'une sorte quelconque de +programme (comme index.php). Nous décrirons tout cela plus +en détails ci-dessous dans la section Contenu d'un +site web.

    + +

    +Le serveur envoie alors une réponse comportant un code +d'état, et éventuellement un corps de réponse. Le code d'état indique si +la requête a été traitée avec succès, ou dans la négative, quel type +d'erreur a été rencontré. Le client est alors censé savoir quoi faire de +la réponse. Vous pouvez vous familiariser avec les différents codes +d'état en consultant le Wiki du +serveur HTTP Apache.

    + +

    Les détails de la transaction, ainsi que les erreurs rencontrées, +sont enregistrés dans des fichiers journaux. Tout cela est décrit en +détails ci-dessous dans la section Débogage et fichiers +journaux.

    + +
    top
    +
    +

    Noms d'hôte et DNS

    + + +

    Pour se connecter à un serveur, le client doit tout d'abord traduire +le nom du serveur en adresse IP, cette dernière permettant de localiser +le serveur sur Internet. Ainsi, pour que votre serveur web soit +accessible, son nom doit être enregistré dans le DNS.

    + +

    Si vous ne savez pas comment effectuer cet enregistrement, vous +devez contacter votre administrateur réseau ou votre fournisseur +d'accès à Internet afin qu'il effectue cette opération pour vous.

    + +

    Plusieurs noms d'hôte peuvent pointer vers la même adresse IP, et +plusieurs adresses IP peuvent être attachées au même serveur physique. +Vous pouvez ainsi héberger plusieurs serveurs web sur le même serveur +physique grâce au mécanisme des serveurs virtuels.

    + +

    Pour tester un serveur non encore accessible sur Internet, vous +pouvez renseigner son nom d'hôte dans votre fichier hosts afin +d'effectuer une résolution de nom locale. Par exemple, pour tester le +serveur web www.example.com depuis le serveur physique qui +l'héberge, vous pouvez ajouter la ligne suivante au fichier hosts de ce +dernier :

    + +

    +127.0.0.1 www.example.com +

    + +

    En général, le fichier hosts se trouve dans le répertoire +/etc sur les systèmes de style Unix, ou +C:\Windows\system32\drivers\etc sous Windows.

    + +

    Vous trouverez plus de détails à propos du fichier hosts à Wikipedia.org/wiki/Hosts_(file), +et à propos du DNS à Wikipedia.org/wiki/Domain_Name_System.

    +
    top
    +
    +

    Fichiers de configuration et directives

    + + +

    La configuration du serveur HTTP Apache s'effectue via de simples +fichiers texte. Ces fichiers peuvent se trouver dans de nombreux +endroits différents en fonction du mode d'installation du serveur. Vous +trouverez les positions courantes de ces fichiers dans le wiki httpd. +Si vous installez httpd depuis le code source, le répertoire par défaut +des fichiers de configuration est /usr/local/apache2/conf. +Le nom du fichier de configuration par défaut est en général +httpd.conf, mais peut aussi varier en fonction des +distributions tierces du serveur.

    + +

    L'ensemble de la configuration est en général divisé en plusieurs +fichiers afin d'en faciliter la gestion. Ces fichiers sont inclus dans +le fichier de configuration principal via la directive Include. Les noms ou positions de ces fichiers +ne sont pas figés et peuvent varier considérablement d'une distribution +à l'autre. N'hésitez pas à les arranger et subdiviser selon +vos goûts et besoins, quitte à en modifier +l'organisation par défaut.

    + +

    La configuration du serveur s'effectue via des directives de configuration que l'on +insère dans les fichiers de configuration. Une directive se compose d'un +mot-clé suivi d'un ou plusieurs arguments qui définissent sa valeur.

    + +

    La réponse à la question "Où dois-je placer cette directive ?" +dépend en général du niveau auquel cette directive doit être prise en compte. +S'il s'agit du niveau global, elle doit être placée dans le fichier de +configuration principal, et en dehors de toute section <Directory>, <Location>, <VirtualHost> ou de toute autre section. Sinon, si par +exemple elle ne doit s'appliquer qu'à un répertoire particulier, elle doit être +placée dans la section <Directory> qui fait référence à ce répertoire. Voir la +documentation sur les Sections de configuration pour +plus de détails.

    + +

    En complément des fichiers de configuration principaux, certaines directives +peuvent être insérées dans des fichiers .htaccess que l'on place +directement dans le répertoire concerné. Les fichiers .htaccess +sont essentiellement destinés aux personnes qui n'ont pas accès aux fichiers de +configuration du serveur. Vous trouverez plus de détails à propos des fichiers +.htaccess dans ce .htaccesshowto.

    + +
    top
    +
    +

    Contenu du site web

    + + +

    Si le contenu du site web peut se présenter sous de nombreuses +formes, il en existe deux principales : les +contenus statiques et les contenus dynamiques.

    + +

    Les contenus statiques sont par exemple les fichiers HTML, les +images, les fichiers CSS et tout autre fichier résidant dans le système +de fichiers. La directive DocumentRoot permet de définir la position +dans l'arborescence du site où vous devez placer ces fichiers. Cette +directive peut être définie au niveau global, ou au niveau de chaque +serveur virtuel. Vous pouvez consulter vos fichiers de configuration +pour vérifier la manière dont cette directive est définie pour votre +serveur.

    + +

    En général, et si aucun nom de fichier n'est spécifié dans la +requête, c'est une page de nom index.html qui sera +renvoyée. Par exemple, si la directive DocumentRoot est +définie à /var/www/html, et si une requête est effectuée +pour l'adresse http://www.example.com/work/, c'est le +fichier /var/www/html/work/index.html qui sera envoyé au +client par le serveur.

    + +

    Un contenu dynamique est un contenu qui est généré au moment du +traitement de la requête, et qui peut différer d'une requête à l'autre. +Ces contenus dynamiques peuvent être générés de nombreuses manières par +l'intermédiaire de gestionnaires de contenu +ou "handlers". Il est aussi possible de créer des programmes CGI pour générer le contenu de +votre site.

    + +

    Enfin, on peut utiliser des modules tiers comme mod_php pour écrire +du code permettant d'effectuer de nombreuses choses. De nombreuses +applications tierces écrites à partir de divers langages ou outils sont +disponibles en téléchargement et peuvent être installées sur votre +serveur HTTP Apache. Le support de ces applications est en dehors du sujet de +ce document, et nous vous invitons à consulter le site de leur éditeur +pour accéder à leur documentation.

    +
    top
    +
    +

    Fichiers journaux et résolution des problèmes

    + +

    En tant qu'administrateur d'un serveur HTTP Apache, vos sources +d'informations principales sont les fichiers journaux, et en particulier +le journal des erreurs. Toute tentative de résolution d'un problème sans +consulter le journal des erreurs revient à essayer de conduire les yeux +fermés.

    + +

    La position dans le système de fichiers du journal des erreurs est +spécifiée par la directive ErrorLog +qui peut être définie au niveau global, ou au niveau de chaque serveur +virtuel. Chaque entrée du journal des erreurs vous informe sur la nature +des problèmes et le moment de leur survenue. En outre, elle vous indique +souvent comment résoudre le problème. Chaque message d'erreur contient +un code d'erreur que vous pouvez utiliser pour effectuer une recherche +en ligne afin d'obtenir une description plus détaillée de la manière de +résoudre le problème. Vous pouvez aussi configurer votre journal des +erreurs de manière à ce qu'il enregistre un identifiant d'erreur que +vous pourrez ensuite utiliser pour effectuer une corrélation avec le +journal des accès afin de déterminer quelle requête est à l'origine de +l'erreur.

    + +

    Vous trouverez plus de détails à ce sujet dans la Documentation sur la journalisation.

    +
    top
    +
    +

    Et maintenant, comment faire pour aller plus loin ?

    + + +

    La question des prérequis étant réglée, il est temps de passer aux +choses sérieuses.

    + +

    Ce document ne couvre que les notions de base. Nous espérons qu'il +vous permettra de mettre le pied à l'étrier, mais il y a encore de +nombreuses choses que vous devez savoir.

    + + + +
    +
    +

    Langues Disponibles:  en  | + fr  | + ru 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/getting-started.html.ru.utf8 b/docs/manual/getting-started.html.ru.utf8 new file mode 100644 index 0000000..3c29892 --- /dev/null +++ b/docs/manual/getting-started.html.ru.utf8 @@ -0,0 +1,271 @@ + + + + + +Ðачало работы - HTTP Ñервер Apache ВерÑÐ¸Ñ 2.4 + + + + + + + +
    <-
    +

    Ðачало работы

    +
    +

    Available Languages:  en  | + fr  | + ru 

    +
    + +

    ЕÑли вы абÑолютный новичок в работе Ñ HTTP-Ñервером Apache или +в запуÑке веб-Ñайтов вообще, вы можете не знать Ñ Ñ‡ÐµÐ³Ð¾ начать или какие +вопроÑÑ‹ задавать. Этот документ познакомит Ð²Ð°Ñ Ñ Ð¾Ñновами.

    +
    + +
    top
    +
    +

    Клиенты, Ñерверы и URL-адреÑа

    + + +

    ÐдреÑа в Интернете запиÑываютÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ URL — Uniform Resource +Locator (унифицированный указатель реÑурÑа), который указывает на +иÑпользуемый протокол (например, http), Ð¸Ð¼Ñ Ñервера +(например, www.apache.org), URL-путь (например, +/docs/current/getting-started.html) и, возможно, +Ñтроку запроÑа (например, ?arg=value), иÑпользуемую Ð´Ð»Ñ +передачи Ñерверу дополнительных аргументов.

    + +

    Клиент (например, веб-браузер) подключаетÑÑ Ðº Ñерверу +(например, вашему HTTP-Ñерверу Apache), иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ð¹ протокол, +и отправлÑет Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° реÑурÑ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ URL-путь.

    + +

    URL-путь может обозначать множеÑтво вещей на Ñервере. Это может быть +файл (как getting-started.html), обработчик +(как server-status) или файл какой-то +программы (как index.php). Мы раÑÑмотрим Ñто подробней ниже, +в разделе Контент веб-Ñайта.

    + +

    Сервер отправлÑет ответ, Ñодержащий код ÑоÑтоÑÐ½Ð¸Ñ Ð¸, +опционально, тело ответа. Код ÑоÑтоÑÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚, был ли Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑƒÑпешно +обработан, а еÑли нет, то ÐºÐ°ÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° произошла. +Это говорит клиенту, что он должен делать Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð¾Ð¼. +Ð’Ñ‹ можете прочитать о возможных кодах ответа на + +Вики HTTP-Ñервера Apache.

    + +

    Детали транзакции и уÑÐ»Ð¾Ð²Ð¸Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¸ запиÑываютÑÑ +в файлы журналов. Это опиÑываетÑÑ Ð±Ð¾Ð»ÐµÐµ подробно ниже, в разделе +Файлы журналов и уÑтранение неполадок.

    + +
    top
    +
    +

    Имена хоÑтов и DNS

    + + +

    Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы ÑоединитьÑÑ Ñ Ñервером, клиент Ñначала должен преобразовать +Ð¸Ð¼Ñ Ñервера в IP-Ð°Ð´Ñ€ÐµÑ â€” меÑто в Интернете, где находитÑÑ Ñервер. +Таким образом, чтобы ваш веб-Ñервер был доÑтупен, необходимо, +чтобы Ð¸Ð¼Ñ Ñервера было в DNS.

    + +

    ЕÑли вы не знаете как Ñто Ñделать, вам нужно обратитьÑÑ Ðº Ñетевому +админиÑтратору или поÑтавщику уÑлуг Интернета (провайдеру). +Они могут Ñделать Ñто Ð´Ð»Ñ Ð²Ð°Ñ.

    + +

    ÐеÑколько хоÑтов могут указывать на один и тот же IP-адреÑ, +а один физичеÑкий Ñервер может иметь больше одного IP-адреÑа. +Таким образом на одном физичеÑком Ñервере вы можете запуÑтить больше одного +Ñайта Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ оÑобенноÑти: виртуальные хоÑты.

    + +

    ЕÑли вы теÑтируете Ñервер, не имеющий выхода в Интернет, можете помеÑтить +имена хоÑтов в файл hosts Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ что бы Ð¸Ð¼Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐ°Ð»Ð¾ÑÑŒ локально. +Ðапример, вы можете добавить запиÑÑŒ Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ запроÑов к +www.example.com на локальный компьютер, Ð´Ð»Ñ Ñ‚ÐµÑтированиÑ. +Эта запиÑÑŒ будет выглÑдеть так:

    + +

    +127.0.0.1 www.example.com +

    + +

    Файл hosts, Ñкорее вÑего, раÑположен в /etc/hosts или +C:\Windows\system32\drivers\etc\hosts.

    + +

    Вы можете узнать больше о файле +hosts и больше о +DNS.

    +
    top
    +
    +

    Файлы конфигурации и директивы

    + + +

    HTTP-Ñервер Apache наÑтроен Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ проÑтых текÑтовых файлов. +Эти файлы могут раÑполагатьÑÑ Ð² разных меÑтах, в завиÑимоÑти от того как вы +уÑтановили Ñервер. Общие меÑта раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² можно найти в +Вики +HTTP-Ñервера Apache. ЕÑли вы уÑтановили httpd из иÑходного кода, +то раÑположение файлов конфигурации по умолчанию Ñледующее: +/usr/local/apache2/conf. +По умолчанию файл конфигурации называетÑÑ httpd.conf. +Это тоже может варьироватьÑÑ Ð² Ñторонних диÑтрибутивах Ñервера.

    + +

    ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‡Ð°Ñто разбиваетÑÑ Ð½Ð° неÑколько небольших файлов, Ð´Ð»Ñ +удобÑтва управлениÑ. Эти файлы загружаютÑÑ Ñ‡ÐµÑ€ÐµÐ· директиву +Include. +Имена или раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñтих файлов конфигурации +могут Ñильно отличатьÑÑ Ð¾Ñ‚ одной уÑтановки к другой. +РаÑположите и разделите Ñти файлы наиболее подходÑщим Ð´Ð»Ñ +Ð²Ð°Ñ Ð¾Ð±Ñ€Ð°Ð·Ð¾Ð¼. ЕÑли раÑположение файлов по умолчанию, +не имеет ÑмыÑла Ð´Ð»Ñ Ð²Ð°Ñ, не ÑтеÑнÑйтеÑÑŒ изменить его.

    + +

    Сервер наÑтраиваетÑÑ Ð¿ÑƒÑ‚Ñ‘Ð¼ Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ +директив конфигурации в Ñтих файлах конфигурации. +Директива — Ñто ключевое Ñлово Ñ Ð¾Ð´Ð½Ð¸Ð¼ или неÑколькими аргументами, +уÑтанавливающими её значение.

    + +

    Ðа вопроÑ: «Где Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ пропиÑать Ñту директиву?» – обычно +отвечают, там где ты хочешь иÑпользовать её. ЕÑли Ñто Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð°Ñ Ð½Ð°Ñтройка, +она должна раÑполагатьÑÑ Ð² конфигурационном файле вне разделов +<Directory>, +<Location>, +<VirtualHost> или других +разделов. ЕÑли наÑтройка отноÑитÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к конкретному каталогу, +значит она должна быть внутри Ñекции +<Directory>, +ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ð¿Ð¸Ñывает Ñтот каталог, и так далее. +Смотри документ Разделы конфигурации +Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ñ‹Ð¼ опиÑанием вышеуказанных разделов.

    + +

    Ð’ дополнение к оÑновному файлу конфигурации, некоторые директивы могут +раÑполагатьÑÑ Ð² файлах .htaccess, раÑположенных в папках Ñ +контентом. Файлы .htaccess в первую очередь предназначены Ð´Ð»Ñ +людей у которых нет доÑтупа к главному конфигурационному файлу Ñервера. +Ð’Ñ‹ можете узнать больше о файлах .htaccess в инÑтрукции +.htaccess.

    + +
    top
    +
    +

    Контент веб-Ñайта

    + + +

    Содержимое Ñайта может принимать различные формы, но в широком ÑмыÑле +разделÑетÑÑ Ð½Ð° ÑтатичеÑкий и динамичеÑкий контент.

    + +

    СтатичеÑкий контент — Ñто, например, HTML-файлы, файлы изображений, +CSS-файлы и другие файлы, которые проÑто лежат на диÑке. +Директива DocumentRoot указывает +где в вашей файловой ÑиÑтеме, вы должны размеÑтить Ñти файлы. +Эта директива уÑтанавливаетÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¾ или отдельно Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ +виртуального хоÑта. ПоÑмотрите в Ñвоём файле(ах) конфигурации, +чтобы узнать, как именно Ñта директива иÑпользуетÑÑ Ð½Ð° вашем Ñервере.

    + +

    Обычно, когда запрашиваетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³, без ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ файла, то будет +отдан документ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ index.html. Ðапример, еÑли Ð´Ð»Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ñ‹ +DocumentRoot уÑтановлено значение /var/www/html +и приходит Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° Ð°Ð´Ñ€ÐµÑ +http://www.example.com/work/, +то файл раÑположенный по пути +/var/www/html/work/index.html +будет отдан клиенту.

    + +

    ДинамичеÑкий контент — Ñто вÑÑ‘ что генерируетÑÑ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа и может +изменÑтьÑÑ Ð¾Ñ‚ запроÑа к запроÑу. СущеÑтвует множеÑтво ÑпоÑобов ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ +динамичеÑкого контента. Различные обработчики +доÑтупны Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ Ñодержимого. Могут быть напиÑаны Ñпециальные +CGI программы Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ контента на Ñайте.

    + +

    Ð”Ð»Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð° Ñ Ñ€Ð°Ð·Ð½Ð¾Ð¾Ð±Ñ€Ð°Ð·Ð½Ñ‹Ð¼ функционалом +могут иÑпользоватьÑÑ Ñторонние модули, такие как mod_php. +МножеÑтво Ñторонних приложений, напиÑанных на различных Ñзыках +программированиÑ, и утилит доÑтупны Ð´Ð»Ñ ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸ уÑтановки +на ваш HTTP-Ñервер Apache. +Поддержка Ñторонних продуктов выходит за рамки Ñтой документации. +При необходимоÑти вы должны ÑамоÑтоÑтельно найти их документацию +или форумы поддержки, где вы Ñможете получить ответы на Ñвои вопроÑÑ‹.

    +
    top
    +
    +

    Файлы журналов и уÑтранение неполадок

    + +

    Ð”Ð»Ñ Ð²Ð°Ñ, как админиÑтратора HTTP-Ñервера Apache, +Ñамые ценные активы — Ñто файлы журналов (лог-файлы), +в чаÑтноÑти, журнал ошибок. ИÑправление любой проблемы без журнала ошибок +можно Ñравнить Ñ Ð²Ð¾Ð¶Ð´ÐµÐ½Ð¸ÐµÐ¼ Ð°Ð²Ñ‚Ð¾Ð¼Ð¾Ð±Ð¸Ð»Ñ Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼Ð¸ глазами.

    + +

    РаÑположение журнала ошибок задаётÑÑ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ð¾Ð¹ +ErrorLog, +ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть уÑтановлена глобально или Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ виртуального хоÑта. +ЗапиÑи в журнале ошибок раÑÑкажут вам, что и когда пошло не так. +ЗачаÑтую они также Ñмогут подÑказать, как что-то иÑправить. +ÐšÐ°Ð¶Ð´Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ в журнале ошибок Ñодержит код ошибки, +по которому вы можете поиÑкать в Интернете более подробное +опиÑание того, как решить проблему. +Ð’Ñ‹ также можете наÑтроить журнал ошибок так, чтобы в него запиÑывалÑÑ +идентификатор журнала, который можно ÑопоÑтавить Ñ Ð·Ð°Ð¿Ð¸ÑÑми в журнале +доÑтупа — Ñто поможет определить, какой Ð·Ð°Ð¿Ñ€Ð¾Ñ ÐºÐ°ÐºÑƒÑŽ ошибку вызвал.

    + +

    Больше о логирование вы можете узнать в +документации о журналах.

    +
    top
    +
    +

    Что дальше?

    + + +

    Теперь, когда вы знакомы Ñ Ð¾Ñновами, пора двигатьÑÑ Ð´Ð°Ð»ÑŒÑˆÐµ.

    + +

    Этот документ Ñодержит только базовую информацию. +Мы надеемÑÑ, что она поможет вам начать работу, +но еÑть множеÑтво других вещей, о которых вам, возможно, нужно узнать.

    + + + +
    +
    +

    Available Languages:  en  | + fr  | + ru 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/glossary.html b/docs/manual/glossary.html new file mode 100644 index 0000000..9c493ca --- /dev/null +++ b/docs/manual/glossary.html @@ -0,0 +1,29 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: glossary.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: glossary.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: glossary.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: glossary.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: glossary.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: glossary.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: glossary.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/glossary.html.de b/docs/manual/glossary.html.de new file mode 100644 index 0000000..aafa389 --- /dev/null +++ b/docs/manual/glossary.html.de @@ -0,0 +1,583 @@ + + + + + +Glossar - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Glossar

    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    +
    Diese Übersetzung ist möglicherweise + nicht mehr aktuell. Bitte prüfen Sie die englische Version auf + die neuesten Änderungen.
    + +

    Dieses Glossar erläutert einige gebräuchliche Fachbegriffe im + Zusammenhang mit dem Apache im Speziellen und Web-Diensten im + Allgemeinen. Weitere Informationen zum jeweiligen Begriff erreichen Sie + über die Links.

    +
    +
    top
    +
    +

    Definitionen

    + +
    +
    Algorithmus
    +
    Eine eindeutige Formel oder ein Satz von Regeln zur Lösung eines + Problems in einer endlichen Anzahl von Schritten. Algorithmen zur + Verschlüsselung werden üblicherweise Chiffre genannt. +
    + +
    APache + eXtension Tool (apxs)
    +
    Ein Perl-Skript zur Kompilierung von Modul-Quelltexten zu Dynamic-Shared-Objects + (DSOs) und zur Installation dieser zum + Apache-Webserver.
    + Siehe: apxs-Dokumentation +
    + +
    Apache Portable Runtime (APR)
    +
    Eine Menge von Bibliotheken, die viele grundlegende Schnittstellen + zwischen dem Server und dem Betriebssystem anbietet. Die APR + wird parallel zum Apache HTTP Server in einem eigenständigen Projekt + entwickelt.
    + Siehe auch: Apache Portable Runtime + Project +
    + +
    Authentifizierung
    +
    Die positive Identifizierung einer Netzwerkeinheit, wie z.B. + eines Servers, eines Clients oder eines Benutzers.
    + Siehe: Authentisierung, Autorisierung und + Zugriffskontrolle +
    + +
    Certification Authority + [səˈtifiˈkeiʃən + ɔːθɔriti] + (CA)
    +
    (Anm.d.Ü.: die Zertifizierungsstelle) Eine + vertrauenswürdige dritte Partei, deren Zweck es ist, + Zertifikate für Netzwerkeinheiten zu signieren. Andere + Netzwerkeinheiten können die Signatur prüfen, um + sicherzustellen, dass eine CA den Inhaber eines Zertifikats + authentifiziert hat.
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    Certificate Signing Request + [səˈtifikit sainiŋ + riˈkwest] (CSR)
    +
    (Anm.d.Ü.: Zertifikats-Signierungsanfrage) Ein unsigniertes + Zertifikat zur Einreichung bei + einer Zertifizierungsstelle, welche + es mit dem privaten Schlüssel + ihres CA-Zertifikats signiert. Durch die Signatur wird ein CSR + zum echten Zertifikat.
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    Chiffre
    +
    Die Chiffre ist ein Algorithmus oder System zur + Datenverschlüsselung. Beispiele sind DES, IDEA, RC4 usw. Im + Englischen spricht man von + Cipher [ˈsaifə]
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    Chiffretext
    +
    Das Ergebnis, nachdem ein Klartext + eine Chiffre durchlaufen hat.
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    Common + Gateway Interface [ˈkɔmən geitwei + ˈintəːfeis] + (CGI)
    +
    Eine einheitliche Definition einer Schnittstelle zwischen einem + Webserver und einem externen Programm, welcher dem externen Programm die + Behandlung von Anfragen ermöglicht. Die Schnittstelle ist + ursprünglich von der NCSA + definiert worden. Es exisitert jedoch auch ein RFC-Projekt.
    + Siehe: Dynamische Inhalte mit CGI +
    + +
    CONNECT + [kənekt]
    +
    Eine HTTP-Methode zur Weiterleitung + von Rohdaten über HTTP. Sie kann dazu verwendet werden, andere + Protokolle wie zum Beispiel das SSL-Protokoll zu kapseln. +
    + +
    Digitale + Signatur
    +
    Ein chiffrierter Textblock, der die Gültigkeit eines Zertifikats + oder einer anderen Datei bestätigt. Eine Zertifizierungsstelle erstellt + eine digitale Signatur durch Generierung eines Hashs aus dem in einem Zertifikat + enthaltenen öffentlichen Schlüssel und + anschließender Codierung des Hashs mit dem privaten + Schlüssel des Zertifikats. Nur der öffentliche + Schlüssel der CA kann die Signatur decodieren. So wird + sichergestellt, dass die CA die Netwerkeinheit, welche das + Zertifikat besitzt, authentifiziert hat.
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    Direktive
    +
    Eine Konfigurationsanweisung, die das Verhalten des Apache in einem + oder mehreren Punkten steuert. Direktiven werden in den Konfigurationsdateien gesetzt.
    + Siehe: Verzeichnis der Direktiven +
    + +
    Dynamic + Shared Object + [daiˈnæmik ʃɛəd + ˈɔbdʒikt] (DSO)
    +
    Separat von der Apache-Binärdatei httpd + kompilierte Module, die bei Bedarf + geladen werden können.
    + Siehe: Unterstützung für + Dynamic-Shared-Objects +
    + +
    exportbeschränkt
    +
    Verminderte kryptografische Stärke (und Sicherheit), um den + Exportbesimmungen der Vereinigten Staaten (Anm.d.Ü.: konkret: United + States' Export Administration Regulations (EAR)) zu + entsprechen. Exportbeschränkte Verschlüsselungssoftware ist + auf eine kurze Schlüssellänge begrenzt, was zu + Chiffretexten führt, die gewöhnlich mittels + Brute-Force dekodiert werden können.
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    Filter
    +
    Ein Verfahren, dass auf vom Server empfangene oder zu sendende Daten + angewendet wird. Eingabefilter verarbeiten vom Client an den Server + gesendetet Daten, während Ausgabefilter vom Server an den Client zu + sendende Daten verarbeiten. Der Ausgabefilter INCLUDES + beispielsweise untersucht Dokumente nach Server-Side-Includes und führt sie aus.
    + Siehe: Filter +
    + +
    Handler + [ˈhændlə]
    +
    Eine Apache-interne Darstellung der Aktion, die beim Aufruf einer + Datei auszuführen ist. Im Allgemeinen besitzen Dateien implizite, + auf dem Dateityp basierende Handler. Gewöhnlich werden alle Dateien + vom Server bedient, einige Dateitypen werden jedoch separat "behandelt" + (Anm.d.Ü.: besitzen einen separaten Handler). Der + cgi-script-Handler beispielsweise kennzeichnet Dateien, die + als CGI-Programme ausgeführt werden + sollen.
    + Siehe: Verwendung von Apache-Handlern +
    + +
    Hash + [hæʃ]
    +
    Ein mathematischer, unumkehrbarer Einweg-Algorithmus zur Generierung + einer Zeichenfolge fester Länge aus einer anderen Zeichenfolge + beliebiger Länge. Unterschiedliche Zeichenfolgen bei der Eingabe + ergeben üblischerweise unterschiedliche Hashes (abhängig von + der Hash-Funktion). +
    + +
    Header + [hedə]
    +
    Der Teil der HTTP-Anfrage und -Antwort, + der vor den eigentlichen Daten übermittelt wird und den Inhalt + beschreibende Meta-Informationen enthält. +
    + +
    .htaccess
    +
    Eine Konfigurationsdatei, + die innerhalb des Web-Verzeichnisbaums abgelegt wird und zu dem + Verzeichnis, in dem sie abgelegt ist, sowie allen Unterverzeichnissen + Konfigurationsdirektiven + enthält. Trotz ihres Namens kann diese Datei nahezu alle Arten von + Direktiven enthalten, nicht nur Direktiven zur Zugriffskontrolle.
    + Siehe: Konfigurationsdateien +
    + +
    httpd.conf
    +
    Die Haupt-Konfigurationsdatei ist + /usr/local/apache2/conf/httpd.conf. Dies kann aber zur + Laufzeit oder zur Kompilierungszeit anders konfiguriert werden.
    + Siehe: Konfigurationsdateien +
    + +
    HTTPS
    +
    Das HyperText-Transfer-Protokoll (Secure), der + Standard-Verschlüsselungsmechanismus im World Wide Web. + Tatsächlich handelt es sich hierbei um HTTP über SSL.
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    HyperText-Transfer-Protokoll + (HTTP)
    +
    Das Standard-Übertragungsprotokoll im World Wide Web. Der Apache + implementiert die Protokollversion 1.1, bezeichnet als HTTP/1.1 und + definiert in RFC 2616. +
    + +
    Klartext
    +
    Der unverschlüsselte Text.
    + +
    Konfigurationsanweisung
    +
    Siehe: Direktive
    + +
    Konfigurationsdatei
    +
    Eine Textdatei mit Direktiven, + welche die Konfiguration des Apache steuern.
    + Siehe: Konfigurationsdateien +
    + +
    Kontext
    +
    Ein Bereich in den Konfigurationsdateien, in dem + verschiedene Typen von Direktiven + erlaubt sind.
    + Siehe: Erklärung der + Fachbegriffe zu Apache-Direktiven +
    + +
    Message-Digest + [ˈmesidʒ]
    +
    Ein Hash einer Nachricht, mit dem sich sicherstellen läßt, + dass der Inhalt der Nachricht während der Übertragung nicht + verändert wurde. (Anm.d.Ü.: ein so genannter Extrakt der + Nachricht)
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    Methode
    +
    Im HTTP-Kontext eine in der + Anfrage(zeile) des Clients angegeben Aktion, die auf eine Ressource + angewendet wird. GET, POST und PUT + sind einige der verfügbaren HTTP-Methoden. +
    + +
    MIME-Typ + [maim tyːp]
    +
    Eine Art und Weise, den Typ des übermittelten Dokuments zu + beschreiben. Sein Name leitet sich davon ab, dass sein Format den + Multipurpose Internet Mail Extensions entlehnt wurde. Er besteht aus + einem Haupttyp und einem Untertyp, getrennt durch einen + Schrägstrich. Einige Beispiele sind text/html, + image/gif und application/octet-stream. + Bei HTTP wird der MIME-Typ mit dem Header Content-Type + übermittelt.
    + Siehe: mod_mime +
    + +
    Modul
    +
    Ein selbstständiger Teil eines Programms. Ein Großteil der + Funktionalität des Apache ist in Modulen enthalten, die Sie einbinden + oder entfernen können. In die Apache-Binärdatei httpd einkompilierte Module werden statische Module + genannt, während Module, die separat gespeichert sind und optional + zur Laufzeit geladen werden können, dynamische Module oder + DSOs genannt werden. + Standardmäßig eingebundene Module werden Basismodule + genannt. Für den Apache sind viele Module verfügbar, die nicht + als Bestandteil des Apache-HTTP-Server-Tarballs ausgeliefert + werden. Diese werden als Drittmodule bezeichnet.
    + Siehe: Modulverzeichnis +
    + +
    Module-Magic-Number + [ˈmɔjuːl mædʒik + ˈnʌmbə] + (MMN)
    +
    Die Module-Magic-Number ist eine Konstante, die im Apache-Quelltext + definiert ist und im Zusammenhang mit der Binärkompatibilität + von Modulen steht. Sie wird geändert, wenn sich interne + Apache-Strukturen, -Funktionen oder andere signifikante Teile der API + derart ändern, dass eine Binärkompatibilität nicht mehr + gewährleistet werden kann. Bei einer MMN-Änderung müssen + alle Module von Drittanbietern zumindest neu kompiliert und zuweilen auch + geringfügig angepaßt werden, um mit der neuen Apache-Version zu + funktionieren. +
    + +
    Öffentlicher + Schlüssel
    +
    Der öffentlich verfügbare Schlüssel in einem Public-Key-Kryptographie-System, + mit dem für seinen Eigentümer bestimmte Nachrichten + verschlüsselt und Signaturen von seinem Eigentümer + entschlüsselt werden.
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    OpenSSL + [ˈəupənɛsɛsˈɛl] +
    +
    Das Open-Source-Toolkit für SSL/TLS
    + Siehe: http://www.openssl.org/ +
    + +
    Passphrase + [paːfreiz]
    +
    Das Wort oder die Phrase, welches private Schlüssel-Dateien + schützt. Sie verhindert die Entschlüsselung durch nicht + authorisierte Benutzer. Normalerweise ist dies einfach der geheimen + (De-)Codierungsschlüssel, der für Chiffren verwendet wird.
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    Privater Schlüssel
    +
    Der geheime Schlüssel in einem Public-Key-Kryptographie-System, + mit dem hereinkommende Nachrichten decodiert und ausgehende signiert + werden.
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    Proxy
    +
    Ein zwischen dem Client und dem ursprünglichen Server + (Anm.d.Ü.: der Server, den der Client tatsächlich erreichen + möchte) liegender Server. Er nimmt Anfragen von + Clients entgegen, übermittelt diese Anfragen dem + ursprünglichen Server und liefert die Antwort des + ursprünglichen Servers an den Client zurück. Wenn mehrere + Clients den gleichen Inhalt abfragen, dann kann der Proxy diesen Inhalt + aus seinem Zwischenspeicher ausliefern, anstatt ihn jedesmal vom + ursprünglichen Server anzufordern, und dadurch die Antwortzeit + verringern.
    + Siehe: mod_proxy +
    + +
    Public-Key-Kryptographie + [ˈpʌblik kiː + ˈkyptograˈfiː]
    +
    Theorie und Anwendung asymmetrischer Verschlüsselungssysteme, + die einen Schlüssel zur Verschlüsselung und einen anderen zur + Entschlüsselung verwenden. Zwei derart zusammengehörende + Schlüssel bilden Schüsselpaar. Man spricht auch von + "Asymetrischer Kryptographie".
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    Regulärer + Ausdruck (Regex)
    +
    Eine Form, ein Muster im Text zu beschreiben - zum Beispiel: "alle + Wörter, die mit dem Buchstaben A beginnen" oder "Jeder Satz mit + zwei Kommata und ohne großes Q". Beim Apache sind reguläre + Ausdrücke hilfreich, da sie auf sehr flexible Art und Weise die + Anwendung bestimmter Eigenschaften auf eine Auswahl von Dateien oder + Ressourcen ermöglichen. - Zum Beispiel können alle .gif- und + .jpg-Dateien eines Verzeichnis "images" mit + "/images/.*(jpg|gif)$" beschrieben werden. Der Apache + verwendet Perl-kompatible reguläre Ausdrücke, wie sie die + PCRE-Bibliothek bereitstellt. +
    + +
    Reverse Proxy + [riːvəːs + ˈprɔksi]
    +
    Ein Proxy-Server, der dem Client + gegenüber als ursprünglicher Server erscheint. Dies + ist nützlich, um den tatsächlichen Server aus + Sicherheitsgründen oder zur Lastverteilung vor dem Client zu + verstecken. +
    + +
    Secure Sockets + Layer [siˈkjuə ˈsɔkits + ˈleiə] (SSL)
    +
    Ein von der Firma Netscape Communications Corporation entwickeltes + Protokoll zur allgemeinen Authentisierung und Verschlüsselung der + Kommunikation über TCP/IP-Netzwerke. Die meistverbreitete Nutzung + ist HTTPS, d.h. HyperText Transfer Protocol (HTTP) über + SSL.
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    Server Side + Includes [səːə said + inˈkluːds] (SSI)
    +
    Eine Technik zum Einbetten von weiterverarbeitenden Anweisungen in + HMTL-Dateien.
    + Siehe: Einführung in Server Side + Includes +
    + +
    Session + [ˈseʃən]
    +
    Allgemein der Kontext einer Kommunikation.
    + +
    SSLeay
    +
    Die Bibliothek der Original-SSL/TLS-Implementation von Eric A. + Young
    + +
    Symmetrische Kryptographie
    +
    Die Theorie und Anwendung von Chiffren, die einen einzigen + geheimen Schlüssel sowohl zur Verschlüsswelung als auch zur + Entschlüsselung benutzen.
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    Tarball + [taːbɔːl]
    +
    Ein Paket von Dateien, die mit dem Hilfsprogramm tar + zusammengefasst wurden. Apache-Distributionen werden in komprimierten + tar-Archiven oder unter Verwendung von pkzip gespeichert. +
    + +
    Transport + Layer Security [trænsˈpɔːt + ˈeiə siˈkjuəriti] + (TLS)
    +
    Das SSL-Nachfolgeprotokoll, das von der Internet Engineering Task + Force (IETF) zur allgemeinen Authentisierung und Verschlüsselung + einer Kommunikation über TCP/IP-Netzwerke entwickelt worden ist. + TLS Version 1 ist nahezu identisch mit SSL Version 3.
    + Siehe: SSL/TLS-Verschlüsseliung +
    + +
    Umgebungsvariable (env-Variable)
    +
    Benannte, von der Betriebssystem-Shell verwaltete Variablen zur + Speicherung von Informationen und zur Kommunikation zwischen Programmen. + Der Apache beinhaltet auch interne Variablen, die ebenfalls + Umgebungsvariablen genannt werden, die aber statt in der + Shell-Umgebung in internen Apache-Strukturen gespeichert sind.
    + Siehe: Umgebungsvariablen im Apache +
    + +
    Uniform + Resource Locator [ˈjuːnifɔːm + riˈsɔːs ləuˈkeitə] + (URL)
    +
    Der Name bzw. die Adresse einer Ressource im Internet. Dies ist der + allgemein gebräuchliche Audruck für die formale Bezeichnung + Uniform Resource + Identifier. URLs bestehen üblicherweise aus einem + Schema wie http oder https, einem Hostnamen + und einem Pfad. Die URL für diese Seite ist + http://httpd.apache.org/docs/2.4/glossary.html. +
    + +
    Uniform Resource Identifier + [ˈjuːnifɔːm + riˈsɔːs aiˈdentifaiə] + (URI)
    +
    Eine kompakte Zeichenfolge zur Identifizierung einer abstrakten oder + physischen Ressource. Er wird in dem RFC 2396 formell + definiert. Im World Wide Web verwendete URIs werden üblicherweise + als URLs bezeichnet. +
    + +
    Virtual-Hosting + [vəˈtjuəl + həustiŋ]
    +
    Die Bedienung mehrere Websites mit einer einzigen Apache-Instanz. + IP-basierte virtuelle Hosts unterscheiden zwischen + verschiedenen Websites aufgrund ihrer IP-Adressen, während + namensbasierte virtuelle Hosts nur den Namen des Hosts + verwenden und daher mehrere Angebote unter der gleichen IP-Adresse + hosten können.
    + Siehe: Apache-Dokumentation zu virtuellen + Hosts +
    + +
    Voll-qualifizierter Domainname + (FQDN)
    +
    Der eindeutige Name einer Netzwerkeinheit, bestehend aus einem + Hostnamen und dem Domainnamen, welcher zu einer IP-Adresse + aufgelöst werden kann. Zum Beispiel ist www ein + Hostname, example.com ein Domainname und + www.example.com ein voll-qualifizierter Domainname. +
    + + +
    Website + [websait]
    +
    Im Gegensatz zur Webseite, die einer konkreten URL entspricht, ist mit + Website ein komplettes Angebot unter einem bestimmten Hostnamen (und Port) + gemeint. Dieses kann aus vielen verschiedenen Webseiten bestehen. +
    + +
    X.509
    +
    Ein von der International Telecommunication Union (ITU-T) empfohlenes + Schema für Authentifizierungszertifikate. Es wird für + SSL/TLS-Authentifizierungen verwendet.
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    Zertifikat
    +
    Ein Datensatz zur Authentisierung einer + Nertzwerkeinheit wie Server oder Client. Ein Zertifikat + enthält X.509-Informationen + über seinen Eigentümer (das sogenannte Betreff + (Anm.d.Ü.: engl.: subject)) und die + signierende Certification + Authority (der sogenannte Aussteller (Anm.d.Ü.: engl.: + issuer)) sowie den öffentlichen Schlüssel des + Eigentümers und die Signatur der CA. Netzwerkeinheiten + überprüfen diese Signatur mit Hilfe von CA-Zertifikaten.
    + Siehe: SSL/TLS-Verschlüsselung +
    + +
    Zugriffskontrolle
    +
    Die Beschränkung des Zugriffs auf Netzwerkbereiche. Im + Apache-Kontext in der Regel die Zugriffsbeschränkung auf bestimmte + URLs.
    + Siehe: Authentisierung, Autorisierung und + Zugriffskontrolle +
    +
    +
    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Kommentare

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/glossary.html.en b/docs/manual/glossary.html.en new file mode 100644 index 0000000..17d7799 --- /dev/null +++ b/docs/manual/glossary.html.en @@ -0,0 +1,515 @@ + + + + + +Glossary - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Glossary

    +
    +

    Available Languages:  de  | + en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    This glossary defines some of the common terminology related to Apache in + particular, and web serving in general. More information on each concept + is provided in the links.

    +
    +
    top
    +
    +

    Definitions

    + +
    +
    Access Control
    +
    The restriction of access to network realms. In an Apache context + usually the restriction of access to certain URLs.
    See: Authentication, Authorization, and Access + Control +
    + +
    Algorithm
    +
    An unambiguous formula or set of rules for solving a problem in a finite + number of steps. Algorithms for encryption are usually called + Ciphers. +
    + +
    APache + eXtension Tool (apxs)
    +
    A perl script that aids in compiling module sources into Dynamic Shared Objects + (DSOs) and helps install them in the + Apache Web server.
    + See: Manual Page: apxs +
    + +
    Apache Portable Runtime (APR)
    +
    A set of libraries providing many of the basic interfaces + between the server and the operating system. APR is developed + parallel to the Apache HTTP Server as an independent project.
    + See: Apache Portable Runtime + Project +
    + +
    Authentication
    +
    The positive identification of a network entity such as a server, a + client, or a user.
    + See: Authentication, Authorization, and Access + Control +
    + +
    Certificate
    +
    A data record used for authenticating network entities such + as a server or a client. A certificate contains X.509 information pieces + about its owner (called the subject) and the signing Certification Authority (called + the issuer), plus the owner's public + key and the + signature made by the CA. Network entities verify these signatures + using CA certificates.
    + See: SSL/TLS Encryption +
    + +
    Certificate Signing Request + (CSR)
    +
    An unsigned certificate for + submission to a Certification + Authority, which signs it with the Private Key of their CA + Certificate. Once the CSR is signed, it becomes a real + certificate.
    + See: SSL/TLS Encryption +
    + +
    Certification Authority + (CA)
    +
    A trusted third party whose purpose is to sign certificates for network + entities it has authenticated using secure means. Other network entities + can check the signature to verify that a CA has authenticated the bearer + of a certificate.
    + See: SSL/TLS Encryption +
    + +
    Cipher
    +
    An algorithm or system for data encryption. Examples are DES, IDEA, RC4, + etc.
    + See: SSL/TLS Encryption +
    + +
    Ciphertext
    +
    The result after Plaintext is + passed through a Cipher.
    See: SSL/TLS Encryption +
    + +
    Common + Gateway Interface (CGI)
    +
    A standard definition for an interface between a web server and an + external program that allows the external program to service requests. + There is an Informational + RFC which covers the specifics.
    + See: Dynamic Content with CGI +
    + +
    Configuration Directive
    +
    See: Directive
    + +
    Configuration + File
    +
    A text file containing Directives + that control the configuration of Apache.
    + See: Configuration Files +
    + +
    CONNECT
    +
    An HTTP method for proxying raw data + channels over HTTP. It can be used to encapsulate other protocols, such as + the SSL protocol. +
    + +
    Context
    +
    An area in the configuration + files where certain types of directives are allowed.
    + See: Terms Used to Describe + Apache Directives +
    + +
    Digital + Signature
    +
    An encrypted text block that validates a certificate or other file. A + Certification Authority + creates a signature by generating a hash of the Public Key + embedded in a Certificate, then encrypting the hash with its own + Private Key. Only the CA's public key can decrypt the signature, + verifying that the CA has authenticated the network entity that owns the + Certificate.
    + See: SSL/TLS Encryption +
    + +
    Directive
    +
    A configuration command that controls one or more aspects of Apache's + behavior. Directives are placed in the Configuration File
    + See: Directive Index +
    + +
    Dynamic + Shared Object (DSO)
    +
    Modules compiled separately from the + Apache httpd binary that can be loaded on-demand.
    + See: Dynamic Shared Object Support +
    + +
    Environment + Variable (env-variable)
    +
    Named variables managed by the operating system shell and used to store + information and communicate between programs. Apache also contains + internal variables that are referred to as environment variables, but are + stored in internal Apache structures, rather than in the shell + environment.
    + See: Environment Variables in Apache +
    + +
    Export-Crippled
    +
    Diminished in cryptographic strength (and security) in order to comply + with the United States' Export Administration Regulations (EAR). + Export-crippled cryptographic software is limited to a small key size, + resulting in Ciphertext which usually can be decrypted by brute + force.
    + See: SSL/TLS Encryption +
    + +
    Filter
    +
    A process that is applied to data that is sent or received by the + server. Input filters process data sent by the client to the server, + while output filters process documents on the server before they are sent + to the client. For example, the INCLUDES output filter + processes documents for Server Side + Includes.
    + See: Filters +
    + +
    Fully-Qualified Domain-Name + (FQDN)
    +
    The unique name of a network entity, consisting of a hostname and a + domain name that can resolve to an IP address. For example, + www is a hostname, example.com is a domain name, + and www.example.com is a fully-qualified domain name. +
    + +
    Handler
    +
    An internal Apache representation of the action to be performed when a + file is called. Generally, files have implicit handlers, based on the file + type. Normally, all files are simply served by the server, but certain + file types are "handled" separately. For example, the + cgi-script handler designates files to be processed as + CGIs.
    + See: Apache's Handler Use +
    + +
    Hash
    +
    A mathematical one-way, irreversible algorithm generating a string with + fixed-length from another string of any length. Different input strings + will usually produce different hashes (depending on the hash function). +
    + +
    Header
    +
    The part of the HTTP request and + response that is sent before the actual content, and that contains + meta-information describing the content. +
    + +
    .htaccess
    +
    A configuration file that + is placed inside the web tree and applies configuration directives to the directory where it is + placed and all sub-directories. Despite its name, this file can hold + almost any type of directive, not just access-control directives.
    + See: Configuration Files +
    + +
    httpd.conf
    +
    The main Apache configuration + file. The default location is + /usr/local/apache2/conf/httpd.conf, but it may be moved using + run-time or compile-time configuration.
    + See: Configuration Files +
    + +
    HyperText Transfer Protocol + (HTTP)
    +
    The standard transmission protocol used on the World Wide Web. Apache + implements version 1.1 of the protocol, referred to as HTTP/1.1 and + defined by RFC 2616. +
    + +
    HTTPS
    +
    The HyperText Transfer Protocol (Secure), the standard encrypted + communication mechanism on the World Wide Web. This is actually just HTTP + over SSL.
    + See: SSL/TLS Encryption +
    + +
    Method
    +
    In the context of HTTP, an action to + perform on a resource, specified on the request line by the client. Some + of the methods available in HTTP are GET, POST, + and PUT. +
    + +
    Message Digest
    +
    A hash of a message, which can be used to verify that the contents of + the message have not been altered in transit.
    + See: SSL/TLS Encryption +
    + +
    MIME-type
    +
    A way to describe the kind of document being transmitted. Its name + comes from that fact that its format is borrowed from the Multipurpose + Internet Mail Extensions. It consists of a major type and a minor type, + separated by a slash. Some examples are text/html, + image/gif, and application/octet-stream. In + HTTP, the MIME-type is transmitted in the Content-Type + header.
    + See: mod_mime +
    + +
    Module
    +
    An independent part of a program. Much of Apache's functionality is + contained in modules that you can choose to include or exclude. Modules + that are compiled into the Apache httpd binary are + called static modules, while modules that are stored + separately and can be optionally loaded at run-time are called + dynamic modules or DSOs. + Modules that are included by default + are called base modules. Many modules are available for Apache + that are not distributed as part of the Apache HTTP Server tarball. These are referred to as + third-party modules.
    + See: Module Index +
    + +
    Module Magic + Number (MMN)
    +
    Module Magic Number is a constant defined in the Apache source code that + is associated with binary compatibility of modules. It is changed when + internal Apache structures, function calls and other significant parts of + API change in such a way that binary compatibility cannot be guaranteed + any more. On MMN change, all third party modules have to be at least + recompiled, sometimes even slightly changed in order to work with the new + version of Apache. +
    + +
    OpenSSL
    +
    The Open Source toolkit for SSL/TLS
    + See http://www.openssl.org/# +
    + +
    Pass Phrase
    +
    The word or phrase that protects private key files. It prevents + unauthorized users from encrypting them. Usually it's just the secret + encryption/decryption key used for Ciphers.
    + See: SSL/TLS Encryption +
    + +
    Plaintext
    +
    The unencrypted text.
    + +
    Private Key
    +
    The secret key in a Public Key + Cryptography system, used to decrypt incoming messages and + sign outgoing ones.
    + See: SSL/TLS Encryption +
    + +
    Proxy
    +
    An intermediate server that sits between the client and the origin + server. It accepts requests from clients, transmits those requests + on to the origin server, and then returns the response from the origin + server to the client. If several clients request the same content, the + proxy can deliver that content from its cache, rather than requesting it + from the origin server each time, thereby reducing response time.
    + See: mod_proxy +
    + +
    Public Key
    +
    The publicly available key in a Public Key Cryptography system, + used to encrypt messages bound for its owner and to decrypt signatures + made by its owner.
    + See: SSL/TLS Encryption +
    + +
    Public Key Cryptography
    +
    The study and application of asymmetric encryption systems, which use + one key for encryption and another for decryption. A corresponding pair of + such keys constitutes a key pair. Also called Asymmetric Cryptography. +
    + See: SSL/TLS Encryption +
    + +
    Regular Expression + (Regex)
    +
    A way of describing a pattern in text - for example, "all the words that + begin with the letter A" or "every 10-digit phone number" or even "Every + sentence with two commas in it, and no capital letter Q". Regular + expressions are useful in Apache because they let you apply certain + attributes against collections of files or resources in very flexible ways + - for example, all .gif and .jpg files under any "images" directory could + be written as "/images/.*(jpg|gif)$". In places where + regular expressions are used to replace strings, the special variables + $1 ... $9 contain backreferences to the grouped parts (in parentheses) of + the matched expression. The special variable $0 contains a backreference + to the whole matched expression. To write a literal dollar sign in a + replacement string, it can be escaped with a backslash. Historically, the + variable & could be used as alias for $0 in some places. This is no + longer possible since version 2.3.6. Apache uses Perl Compatible Regular + Expressions provided by the PCRE + library. You can find more documentation about PCRE's regular expression + syntax at that site, or at + Wikipedia. +
    + +
    Reverse Proxy
    +
    A proxy server that appears to the client + as if it is an origin server. This is useful to hide the real + origin server from the client for security reasons, or to load balance. +
    + +
    Secure Sockets + Layer (SSL)
    +
    A protocol created by Netscape Communications Corporation for general + communication authentication and encryption over TCP/IP networks. The most + popular usage is HTTPS, i.e. the HyperText Transfer Protocol (HTTP) + over SSL.
    + See: SSL/TLS Encryption +
    + +
    Server Name + Indication (SNI)
    +
    An SSL function that allows passing the desired server + hostname in the initial SSL handshake message, so that the web + server can select the correct virtual host configuration to use + in processing the SSL handshake. It was added to SSL starting + with the TLS extensions, RFC 3546.
    + See: the SSL FAQ + and RFC 3546 +
    + +
    Server Side + Includes (SSI)
    +
    A technique for embedding processing directives inside HTML files.
    + See: Introduction to Server Side Includes +
    + +
    Session
    +
    The context information of a communication in general.
    + +
    SSLeay
    +
    The original SSL/TLS implementation library developed by Eric A. + Young +
    + +
    Subrequest
    +
    Apache provides a subrequest API to modules that allows other + filesystem or URL paths to be partially or fully evaluated by + the server. Example consumers of this API are + DirectoryIndex, + mod_autoindex, and mod_include. +
    + +
    Symmetric + Cryptography
    +
    The study and application of Ciphers that use a single secret key + for both encryption and decryption operations.
    + See: SSL/TLS Encryption +
    + +
    Tarball
    +
    A package of files gathered together using the tar utility. + Apache distributions are stored in compressed tar archives or using + pkzip. +
    + +
    Transport + Layer Security (TLS)
    +
    The successor protocol to SSL, created by the Internet Engineering Task + Force (IETF) for general communication authentication and encryption over + TCP/IP networks. TLS version 1 is nearly identical with SSL version 3.
    + See: SSL/TLS Encryption +
    + +
    Uniform + Resource Locator (URL)
    +
    The name/address of a resource on the Internet. This is the common + informal term for what is formally called a Uniform Resource Identifier. + URLs are usually made up of a scheme, like http or + https, a hostname, and a path. A URL for this page might + be http://httpd.apache.org/docs/2.4/glossary.html. +
    + +
    Uniform Resource Identifier + (URI)
    +
    A compact string of characters for identifying an abstract or physical + resource. It is formally defined by RFC 2396. URIs used on the + world-wide web are commonly referred to as URLs. +
    + +
    Virtual Hosting
    +
    Serving multiple websites using a single instance of Apache. IP + virtual hosting differentiates between websites based on their IP + address, while name-based virtual hosting uses only the name of the + host and can therefore host many sites on the same IP address.
    + See: Apache Virtual Host documentation +
    + +
    X.509
    +
    An authentication certificate scheme recommended by the International + Telecommunication Union (ITU-T) which is used for SSL/TLS authentication.
    See: SSL/TLS Encryption +
    +
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/glossary.html.es b/docs/manual/glossary.html.es new file mode 100644 index 0000000..b51ac59 --- /dev/null +++ b/docs/manual/glossary.html.es @@ -0,0 +1,556 @@ + + + + + +Glosario - Servidor HTTP Apache Versión 2.4 + + + + + + + +
    <-
    +

    Glosario

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Éste glosario define las terminologías más comunes + relacionada con Apache en particular, y con los servidores web en + general. En los enlaces que hay asociados a cada término se puede + encontrar información más detallada de cada uno.

    +
    +
    top
    +
    +

    Definiciones

    +
    +
    Algoritmo
    +
    Un proceso definido sin ambigüedades o un conjunto de reglas + para solucionar un problema en un número finito de pasos. + Los algoritmos para encriptar se llaman + normalmente algoritmos de cifrado. +
    + + +
    Algoritmo de cifrado, (Cipher).
    +
    Es un algoritmo o sistema de encriptado de información. + Ejemplos de estos algoritmos son DES, IDEA, RC4, etc.
    + Consulte: Encriptado SSL/TLS
    + +
    Autenticación.
    +
    La identificación positiva de una entidad de red tal como un + servidor, un cliente, o un usuario.
    + Consulte: Autentificación, Autorización, + y Control de Acceso
    + + +
    Autoridad Certificadora. (CA)
    Es una entidad externa de confianza cuyo fin + es firmar certificados para las entidades de red que ha autentificado + usando medios seguros. Otras entidades de red pueden verificar la + firma para comprobar que una Autoridad Certificadora ha autentificado + al poseedor del certificado.
    Consulte: Encriptado + SSL/TLS
    + + +
    Cabecera.
    Es la parte de la + petición y la respuesta HTTP que se + envía antes del contenido propiamente dicho, y que contiene + meta-información describiendo el contenido.
    + +
    Certificado.
    +
    Una información que se almacena para autenticar entidades + de red tales como un servidor o un cliente. Un certificado + contiene piezas de información X.509 sobre su poseedor + (llamado sujeto) y sobre la Autoridad Certificadora + (llamada el emisor) que lo firma, más la clave pública del propietario y la firma de + la AC(Autoridad Certificadora). Las entidades de red verifican las firmas usando + certificados de las AC.
    + Consulte: Encriptado SSL/TLS +
    + + + +
    Clave Pública.
    +
    La clave disponible + públicamente en un sistema + criptográfico de Clave Pública, usado para encriptar + mensajes destinados a su propietario y para desencriptar firmas hechas + por su propietario.
    Consulte: Encriptado + SSL/TLS
    + + + +
    Clave Privada.
    +
    La clave secreta + de un Sistema criptográfico de + Clave Pública, usada para desencriptar los mensajes entrantes + y firmar los salientes.
    Consulte: Encriptado + SSL/TLS
    + + +
    CONNECT
    Un método de HTTP para hacer proxy a canales de + datos sin usar HTTP. Puede usarse para encapsular otros protocolos, + tales como el protocolo SSL.
    + + + +
    Contexto
    Un área en los + ficheros de configuración + donde están permitidos ciertos tipos de directivas.
    + Consulte: Términos + usados para describir las directivas de Apache
    + + +
    Control de Acceso.
    +
    La + restricción en el acceso al entorno de una red. En el contexto de + Apache significa normalmente la restricción en el acceso a + ciertas URLs.
    + Consulte: Autentificación, Autorización, y + Control de Acceso
    + + +
    Criptografía + Simétrica
    El estudio y aplicación de + Algoritmos de Cifrado que usan una sola clave secreta tanto + para cifrar como para descifrar.
    Consulte: Encriptado SSL/TLS
    + + +
    Directiva
    +
    Un comando de + configuración que controla uno o más aspectos del + comportamiento de Apache. Las directivas se ponen en el Fichero de Configuración
    + Consulte: Índice de + Directivas
    + +
    Directivas de + configuración.
    Consulte: Directivas
    + +
    Entorno Portable de tiempo de ejecución de Apache, (APR, Apache Portable Runtime)
    +
    Es un conjunto de librerías que proveen las interfaces básicas + entre el servidor y el sistema operativo. El desarrollo de APR es + paralelo al del Servidor HTTP Apache, como un proyecto independiente. + Puedes visitar el proyecto en:
    + Apache Portable Runtime + Project +
    + +
    Export-Crippled
    +
    Disminución de la fortaleza criptográfica (y seguridad) + para cumplir con las Regulaciones sobre Exportación de la + Administración de los Estados Unidos (EAR). El software + criptográfico Export-crippled está limitado a una clave de + pequeño tamaño, de tal manera que el texto cifrado + que se consigue con él, puede descifrarse por medio de fuerza bruta.
    Consulte: Encriptado SSL/TLS
    + + +
    Expresiones Regulares + (Regex)
    Una forma de describir un patrón en un + texto - por ejemplo, "todas las palabras que empiezan con la letra "A" + o "todos los números de teléfono que contienen 10 + dígitos" o incluso "Todas las frases entre comas, y que no + contengan ninguna letra Q". Las Expresiones Regulares son útiles en + Apache porque permiten aplicar ciertos atributos a colecciones de + ficheros o recursos de una forma flexible - por ejemplo, todos los + archivos .gif y .jpg que estén en el directorio "imágenes" + podrían ser escritos como "/images/.*(jpg|gif)$". + En los lugares donde expresiones regulares se utilizan para reemplazar + cadenas, las variables especiales $ 1 ... $ 9 contienen + referencias inversa las partes agrupadas (entre paréntesis) + de la expresión coincidente. La variable especial $ 0 contiene + una referencia inversa a todo el ejemplar de la expresión. + Para escribir un símbolo de dolar literal en una sustitución de + una cadena, se puede escapar usando "\". Históricamente, la variable & + se podía usar como un alias a $0 en algunos sitios. + Esto ya no esta soportado desde la versión 2.3.6. + Apache usa Expresiones Regulares compatibles con Perl gracias a la + librería PCRE. + Puedes encontrar más documentación sobre las expresiones regulares + de PCRE y su sintaxis en esa página o en la + Wikipedia.
    + + + +
    Fichero de Configuración.
    +
    Un fichero de texto que contiene Directivas que controlan la configuración + de Apache.
    Consulte: Ficheros de + Configuración
    + + +
    .htaccess
    +
    Un fichero de configuración que se + pone dentro de la estructura de directorios del sitio web y aplica directivas de configuración al directorio + en el que está y a sus subdirectorios. A pesar de su nombre, este + fichero puede contener cualquier tipo de directivas, no solo + directivas de control de acceso.
    Consulte: Ficheros de Configuración para más información.
    + +
    httpd.conf
    +
    Es el fichero de configuración principal + de Apache. Su ubicación por defecto es + /usr/local/apache2/conf/httpd.conf, pero puede moverse + usando opciones de configuración al compilar o al iniciar + Apache.
    Consulte: Ficheros de + Configuración
    + +
    Filtro
    +
    Un proceso que se aplica a la + información que es enviada o recibida por el servidor. Los + ficheros de entrada procesan la información enviada por un + cliente al servidor, mientras que los filtros de salida procesan la + información en el servidor antes de enviársela al + cliente. Por ejemplo, el filtro de salida INCLUDES + procesa documentos para Server Side Includes.
    + Consulte: Filtros
    + + + +
    Firma Digital
    +
    Un bloque de + texto encriptado que verifica la validez de un certificado o de otro + fichero. Una Autoridad + Certificadora crea una firma generando un hash a partir de la + Clave Pública que lleva incorporada en un + Certificado, después encriptando el hash con su propia + Clave Privada. Solo las claves públicas de las CAs + pueden desencriptar la firma, verificando que la CA ha autentificado a + la entidad de red propietaria del Certificado.
    + Consulte: Encriptado SSL/TLS
    + +
    Handler
    +
    Es una representación + interna de Apache de una acción a ser ejecutada cuando se llama a + un fichero. Generalmente, los ficheros tienen un handler (manejador) + implícito, basado en el tipo de fichero. Normalmente, todos los + ficheros son simplemente servidos por el servidor, pero sobre algunos + tipos de ficheros se ejecutan acciones complementarias. Por ejemplo, + el handler cgi-script designa los ficheros a ser + procesados como CGIs.
    Consulte: Uso de Handlers en Apache
    + +
    Herramienta de extensión de + Apache. (apxs)
    +
    Es un script escrito en Perl que ayuda a compilar el código + fuente de algunos módulos para + convertirlos en Objetos Dinámicos Compartidos (DSOs) + y ayuda a instalarlos en el Servidor Web de Apache.
    + Consulte: Manual de: apxs
    + + + +
    Hash
    +
    Algoritmo matemático de un solo sentido e irreversible, que genera + una cadena de una determinada longitud de otra cadena de + cualquier tamaño. Diferentes entradas darán diferentes hashes + (dependiendo de la función hash.) +
    + + + + + +
    Hosting Virtual
    Se trata de + servir diferentes sitios web con una sola entidad de Apache. El + hosting virtual de IPs diferencia los sitios web basándose en sus + direcciones IP, mientras que el hosting virtual basado en + nombres usa solo el nombre del host y de esta manera puede alojar + muchos sitios web con la misma dirección IP.
    Consulte: Documentación sobre Hosting Virtual en + Apache
    + + +
    Identificador de Recursos + Uniforme (URI)
    Una cadena de caracteres + compacta para identificar un recurso físico o abstracto. Se + define formalmente en la RFC 2396. Los URIs que + se usan en world-wide web se refieren normalmente como URLs.
    + + + + +
    Indicador del Nombre del servidor + Server Name Indication (SNI)
    +
    Una función SSL que permite pasar el nombre de host del servidor deseado + en el mensaje inicial del protocolo de enlace SSL, para que el servidor web + pueda seleccionar la configuración correcta del host virtual para usar en el + procesamiento del protocolo de enlace SSL. Se añadió a SSL + con las extensiones TLS en el RFC 3546.
    + See: the SSL FAQ + and RFC 3546 +
    + + + + +
    Interfaz de Pasarela Común. Common Gateway Interface (CGI)
    +
    Una definición estándar para + un interfaz entre un servidor web y un programa externo que permite + hacer peticiones de servicio a los programas externos. Este interfaz + esta definido en el RFC-3875.
    + Consulte: Contenido Dinámico con CGI +
    + +
    Localizador de Recursos + Uniforme (URL)
    +
    El nombre de un recurso + en Internet. Es la manera informal de decir lo que formalmente se + llama un Identificador de + Recursos Uniforme. Las URLs están compuestas normalmente por + un esquema, tal como http o https, un nombre + de host, y una ruta. Una URL para esta página es + http://httpd.apache.org/docs/2.4/glossary.html.
    + + +
    Módulo
    +
    Una parte independiente + de un programa. La mayor parte de la funcionalidad de Apache + está contenida en módulos que pueden incluirse o excluirse. + Los módulos que se compilan con el binario httpdde Apache se + llaman módulos estáticos, mientras que los que se + almacenan de forma separada y pueden ser cargados de forma opcional, + se llaman módulos dinámicos o DSOs. + Los módulos que están incluidos por defecto de llaman + módulos base. Hay muchos módulos disponibles para + Apache que no se distribuyen con la tarball del + Servidor HTTP Apache. Estos módulos son llamados + módulos de terceros.
    Consulte: Índice de Módulos
    + + +
    Método
    +
    En el contexto de HTTP, es una acción a ejecutar sobre un recurso, + especificado en la líneas de petición por el cliente. + Algunos de los métodos disponibles en HTTP son GET, + POST, y PUT.
    + +
    Mensaje Resumen (Message Digest)
    +
    Un hash de un + mensaje, el cual pude ser usado para verificar que el contenido del + mensaje no ha sido alterado durante la transmisión.
    + Consulte: Encriptado SSL/TLS
    + +
    MIME-type
    +
    Una manera de describir + el tipo de documento a ser transmitido. Su nombre viene del hecho de + que su formato se toma de las Extensiones del "Multipurpose Internet + Mail". Consiste en dos componentes, uno principal y otro secundario, + separados por una barra. Algunos ejemplos son text/html, + image/gif, y application/octet-stream. En + HTTP, el tipo MIME se transmite en la cabecera + del Tipo Contenido.
    Consulte: mod_mime
    + +
    Módulo del Número Mágico + (MMN Module Magic + Number)
    El módulo del número + mágico es una constante definida en el código + fuente de Apache que está asociado con la compatibilidad binaria + de los módulos. Ese número cambia cuando cambian las + estructuras internas de Apache, las llamadas a funciones y otras + partes significativas de la interfaz de programación de manera + que la compatibilidad binaria no puede garantizarse sin cambiarlo. Si + cambia el número mágico de módulo, todos los + módulos de terceros tienen que ser al menos recompilados, y + algunas veces, incluso hay que introducir ligeras modificaciones para + que funcionen con la nueva versión de Apache
    + + +
    Nombre de dominio + completamente qualificado (FQDN)
    +
    El + nombre único de una entidad de red, que consiste en un nombre de + host y un nombre de dominio que puede traducirse a una dirección + IP. Por ejemplo, www es un nombre de host, + example.com es un nombre de dominio, y + www.example.com es un nombre de dominio completamente + qualificado.
    + +
    Objetos Dinámicos + Compartidos (DSO, dinamic shared objects)
    +
    Los Módulos compilados de forma separada al + binario httpd de Apache se pueden cargar según se necesiten.
    Consulte: Soporte de Objetos Dinámicos + Compartidos
    + + +
    OpenSSL
    +
    El toolkit Open Source para SSL/TLS
    + Ver: http://www.openssl.org/
    + + +
    Pass Phrase o frase de contraseña
    +
    La palabra o frase + que protege los archivos de clave privada. Evita que usuarios no + autorizados los encripten. Normalmente es solo la clave de + encriptado/desencriptado usada por los Algoritmos de + Cifrado.
    Consulte: Encriptado + SSL/TLS
    + +
    Petición de firma de + Certificado. (CSR)
    +
    Es la petición a + una Autoridad Certificadora para + que firme un certificado aún sin + firmar. La Autoridad Certificadora firma el Certificado con + la Clave Privada de su + certificado. Una vez que el CSR está firmado, se + convierte en un auténtico certificado.
    + Consulte: Encriptado SSL/TLS
    + + + +
    Protocolo de Transferencia de + Hipertexto (HTTP)
    +
    Es el protocolo de + transmisión estádar usado en la World Wide Web. Apache + implementa la versión 1.1 de este protocolo, al que se hace + referencia como HTTP/1.1 y definido por el RFC 2616.
    + +
    HTTPS
    +
    Protocolo de transferencia de + Hipertexto (Seguro), es el mecanismo de comunicación encriptado + estándar en World Wide Web. En realidad es HTTP sobre SSL.
    Consulte: Encriptado + SSL/TLS
    + +
    Proxy
    Un servidor intermedio que se + pone entre el cliente y el servidor de origen. Acepta las + peticiones de los clientes, las transmite al servidor de origen, y + después devuelve la respuesta del servidor de origen al + cliente. Si varios clientes piden el mismo contenido, el proxy sirve + el contenido desde su caché, en lugar de pedirlo cada vez que lo + necesita al servidor de origen, reduciendo con esto el tiempo de + respuesta.
    Consulte: mod_proxy
    + + +
    Proxy Inverso
    +
    Es un servidor + proxy que se presenta al cliente como si fuera un + servidor de origen. Es útil para esconder el + auténtico servidor de origen a los clientes por cuestiones de + seguridad, o para equilibrar la carga.
    + + +
    SSL, Capa de Conexión Segura Secure Sockets Layer(SSL)
    Es un protocolo creado por Netscape + Communications Corporation para la autenticación en + comunicaciones en general y encriptado sobre redes TCP/IP. Su + aplicación más popular es en HTTPS, ejemplo.: el Protocolo de + Transferencia de Hipertexto (HTTP) sobre SSL.
    Consulte: Encriptado SSL/TLS
    + + +
    SSLeay
    La implementación + original de la librería SSL/TLS desarrollada por Eric + A. Young
    + + + +
    Server Side Includes (SSI)
    Una técnica para incluir directivas de + proceso en archivos HTML.
    Consulte: Introducción a Server Side + Includes
    + + + +
    Sesión
    Información del + contexto de una comunicación en general.
    + + +
    Sistema Criptográfico de Clave + Pública
    El estudio y aplicación de sistemas de + encriptado asimétricos, que usa una clave para encriptar y otra + para desencriptar. Una clave de cada uno de estos tipos constituye un + par de claves. También se llama Criptografía Asimétrica.
    + Consulte: Encriptado SSL/TLS
    + + +
    Subconsulta
    +
    Apache proporciona una API de subconsultasd a los módulos, + que permiten a otros sistemas de ficheros o paths de URL ser parcial o totalmente evaluados + por el servidor. Un ejemplo de los que usan esta API sería + DirectoryIndex, + mod_autoindex, y mod_include. +
    + +
    Tarball
    Un grupo de ficheros + puestos en un solo paquete usando la utilidad tar. Las + distribuciones Apache se almacenan en ficheros comprimidos con tar o + con pkzip.
    + +
    Texto cifrado.
    +
    El resultado de + haber aplicado a un texto plano un algoritmo de cifrado.
    Consultar: Encriptado SSL/TLS
    + + + +
    Texto plano
    +
    Un texto no encriptado.
    + + +
    Transport + Layer Security (TLS)
    Es el sucesor del protocolo SSL, creado + por el "Internet Engineering Task Force" (IETF) para la + autentificación en comunicaciones en general y encriptado sobre + redes TCP/IP. La versión 1 de TLS es casi idéntica a la + versión 3 de SSL.
    Consulte: Encriptado + SSL/TLS
    + + +
    Variable de Entorno (env-variable)
    +
    Variables que + gestionan el shell del sistema operativo y que se usan para guardar + información y para la comunicación entre programas. Apache + también contiene variables internas que son referidas como + variables de entorno, pero que son almacenadas en las estructuras + internas de Apache, en lugar de en el entorno del shell.
    + Consulte: Variables de entorno de Apache
    + + +
    X.509
    Un esquema de certificado de + autentificación recomendado por la International + Telecommunication Union (ITU-T) que se usa en la autentificación + SSL/TLS.
    Consulte: Encriptado SSL/TLS
    + +
    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comentarios

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/glossary.html.fr.utf8 b/docs/manual/glossary.html.fr.utf8 new file mode 100644 index 0000000..95a56fd --- /dev/null +++ b/docs/manual/glossary.html.fr.utf8 @@ -0,0 +1,619 @@ + + + + + +Glossaire - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Glossaire

    +
    +

    Langues Disponibles:  de  | + en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Ce glossaire définit la terminologie courante relative à Apache en + particulier, et aux serveurs web en général. Vous trouverez plus + d'informations sur chaque concept dans les liens fournis.

    +
    +
    top
    +
    +

    Définitions

    +
    +
    Algorithme
    + +
    Une formule sans ambiguité ou un jeu de règles destinées à + résoudre un problème en un nombre fini d'étapes. Les algorithmes de + chiffrement sont en général appelés + Ciphers. +
    + +
    Algorithme de chiffrement + (Cipher)
    +
    Un algorithme ou un système de chiffrement des données. + Quelques exemples : DES, IDEA, RC4, etc.
    + Voir : chiffrement SSL/TLS +
    + +
    APR
    +
    Voir "Bibliothèques pour la portabilité d'Apache" +
    + +
    Archive Tar (Tarball)
    +
    Un paquetage de fichiers rassemblés dans une archive + à l'aide de l'utilitaire tar. + Les distributions d'Apache sont stockées dans des Archives Tar compressées + ou en utilisant pkzip. +
    + +
    Authentification
    +
    L'identification formelle d'une entité du réseau comme un serveur, un + client, ou un utilisateur.
    + Voir : Authentification, Autorisation, et + contrôle d'accès +
    + +
    Autorité de Certification + (Certification Authority) + (CA)
    +
    Un tiers de confiance habilité à signer des certificats pour des entités + du réseau qu'il a authentifiées selon des critères basés sur la sécurité. + Les autres entités du réseau peuvent alors utiliser la signature pour + vérifier qu'une CA a authentifié le porteur du certificat.
    + Voir : chiffrement SSL/TLS +
    + +
    Bibliothèques pour la portabilité d'Apache + (Apache Portable Runtime) (APR)
    +
    Un jeu de bibliothèques qui fournit la plupart des interfaces de base + entre le serveur et le système d'exploitation. APR est développé + parallèlement au serveur HTTP Apache comme projet indépendant.
    + Voir : Apache Portable Runtime + Project +
    + + +
    Certificat (Certificate)
    +
    Un ensemble de données servant à authentifier des entités du + réseau comme un serveur ou un client. Un certificat contient des ensembles + d'informations X509 à propos de son propriétaire (appelé sujet/subject) + et de l'Autorité de Certification + (Certification Authority) ou CA signataire (appelée + le fournisseur/issuer), ainsi que la + clé publique (public + key) du propriétaire et la + signature de la CA. Les entités du réseau vérifient ces signatures + en utilisant les certificats des Autorités de Certification.
    + Voir : chiffrement SSL/TLS +
    + +
    Chiffrement à Clé Publique + (Public Key Cryptography)
    +
    L'étude et l'application des systèmes de chiffrement asymétriques, + qui utilisent une clé pour le chiffrement et une autre pour le + déchiffrement. Les deux clés correspondantes constituent une paire de clés. + Appelé aussi chiffrement asymétrique. +
    + Voir : chiffrement SSL/TLS +
    + +
    Clé Privée (Private Key)
    +
    La clé secrète dans un système de + chiffrement à clé publique, + utilisée pour déchiffrer les messages entrants et signer + les messages sortants.
    + Voir : chiffrement SSL/TLS +
    + +
    Clé Publique (Public Key)
    +
    La clé accessible au public dans un système de Chiffrement à clé publique, + utilisée pour chiffrer les messages destinés uniquement à son + propriétaire et déchiffrer les signatures + faites par son propriétaire.
    + Voir : chiffrement SSL/TLS +
    + +
    CONNECT
    +
    Une méthode HTTP pour encapsuler + des données brutes dans HTTP. Elle peut aussi être utilisée pour encapsuler + d'autres protocoles, comme le protocole SSL. +
    + +
    Contexte (Context)
    +
    Une portion des + fichiers de configuration dans laquelle certains types de + directives sont autorisés.
    + Voir : Termes utilisés + pour décrire les directives d'Apache +
    + +
    Contrôle d'accès + (Access Control)
    +
    La restriction d'accès à des zones du réseau. Habituellement + dans un contexte Apache, + la restriction d'accès à certaines URLs.
    + Voir : Authentification, Autorisation et + Contrôle d'accès +
    + +
    + Couche des Points de connexion Sécurisés + (Secure Sockets Layer) + (SSL)
    +
    Un protocole créé par Netscape Communications Corporation pour + l'authentification et le chiffrement généraux des communications dans les + réseaux TCP/IP. L'utilisation la plus connue est HTTPS, autrement dit + le Protocole de Transfert Hypertexte (HTTP) au dessus de SSL.
    + Voir : chiffrement SSL/TLS +
    + +
    Sous-requête
    +
    Apache possède une API des sous-requêtes pour les modules qui + permettent l'évaluation complète ou partielle par le serveur de + chemins d'autres systèmes de fichiers ou d'URL. Par exemple, la + directive DirectoryIndex, + les modules mod_autoindex et + mod_include utilisent cette API. +
    + +
    + Cryptographie Symétrique (Symmetric Cryptography)
    +
    L'étude et l'application des Algorithmes de chiffrement qui + utilisent une clé secrète unique pour les opérations de chiffrement et de + déchiffrement.
    + Voir : chiffrement SSL/TLS +
    + + +
    + Dégradé pour l'exportation + (Export-Crippled)
    +
    Diminué en terme de puissance cryptographique (et de sécurité) + afin de respecter les Règles de l'Administration des Exportations + des Etats-Unis (Export Administration Regulations ou EAR). + Les logiciels de cryptographie dégradés pour l'exportation sont limités + à une clé de petite taille, et produisent un + Texte crypté qui peut en général être décrypté + par force brute.
    + Voir : chiffrement SSL/TLS +
    + + +
    Demande de signature de certificat + (Certificate Signing Request) + (CSR)
    +
    La soumission d'un certificat + non signé à une Autorité de + certification, qui le signe avec la Clé privée de leur + Certificat de CA. Une fois le CSR signé, il devient un vrai + certificat.
    + Voir : chiffrement SSL/TLS +
    + +
    Directive
    +
    Une commande de configuration qui contrôle un ou plusieurs aspects du + comportement d'Apache. Les directives sont placées dans le Fichier de configuration
    + Voir : Index des directives +
    + +
    Directive de configuration + (Configuration Directive)
    +
    Voir : Directive
    + +
    En-tête (Header)
    +
    La partie de la requête et de la réponse + HTTP qui est envoyée avant le contenu + proprement dit, et contient des méta-informations décrivant le contenu. +
    + +
    Expression Rationnelle + (Regular Expression) + (Regex)
    +
    Une méthode pour décrire un modèle sous forme de texte - par exemple, + "tous les mots qui commencent par la lettre A" ou "tous les numéros de + téléphone à 10 chiffres" ou encore "Toutes les phrases contenant 2 virgules, + et aucun Q majuscule". Les expressions rationnelles sont très utiles dans + Apache car elles vous permettent d'appliquer certains attributs à des + ensembles de fichiers ou ressources avec une grande flexibilité + - par exemple, tous les fichiers .gif et .jpg situés dans tout répertoire + nommé "images", pourraient être enregistrés comme + "/images/.*(jpg|gif)$". Lorsque l'on utilise des + expressions rationnelles pour la substitution de chaînes, les + variables spéciales $1 ... $9 contiennent des références arrières + vers les parties regroupées (entre parenthèses) de l'expression + qui correspond. La variable spéciale $0 contient une référence + arrière vers l'ensemble de l'expression qui correspond. Pour + insérer un caractère littéral "dollar" dans la chaîne de + remplacement, il faut l'échapper avec un anti-slash. Pour des + raisons historiques, la variable & peut être utilisée en tant + qu'alias de $0 dans certains cas, mais ceci n'est plus possible + depuis la version 2.3.6. Apache utilise les Expressions + Rationnelles Compatibles avec Perl fournies par la librairie PCRE. Vous trouverez plus + d'information à propos de la syntaxe des expressions rationnelles + PCRE sur ce site, ou dans le Wikipedia de la PCRE. +
    + +
    + Fichier de configuration + (Configuration File)
    +
    Un fichier texte contenant des + Directives + qui contrôlent la configuration d'Apache.
    + Voir : Fichiers de configuration +
    + +
    Filtre (Filter)
    +
    Un traitement appliqué aux données envoyées ou reçues par le serveur. + Les filtres en entrée traitent les données envoyées au serveur par le + client, alors que les filtres en sortie traitent les documents sur le + serveur avant qu'ils soient envoyés au client. + Par exemple, le filtre en sortie + INCLUDES + traite les documents pour les + Server Side Includes (Inclusions côté Serveur) + .
    + Voir : Filtres +
    + +
    Gestionnaire (Handler)
    +
    Une représentation interne à Apache de l'action à entreprendre + quand un fichier est appelé. En général, les fichiers ont des gestionnaires + implicites, basés sur le type de fichier. Normalement, tous les + fichiers sont directement servis par le serveur, mais certains + types de fichiers sont "gérés" séparément. Par exemple, le gestionnaire + cgi-script désigne les fichiers qui doivent être traités + comme CGIs.
    + Voir : Utilisation des gestionnaires d'Apache +
    + +
    Hachage (Hash)
    +
    Un algorithme mathématique à sens unique, irréversible, générant une + chaîne de longueur fixe à partir d'une autre chaîne de longueur quelconque. + Des chaînes différentes en entrée vont normalement produire des chaînes + différentes en sortie (selon la fonction de hachage). +
    + +
    Hébergement Virtuel + (Virtual Hosting)
    +
    Servir des sites web multiples en utilisant une seule instance d'Apache. + Les Hôtes virtuels basés sur IP différencient les sites web en se + basant sur leur adresse IP, alors que les + Hôtes virtuels basés sur le nom utilisent uniquement le nom d'hôte + et peuvent en conséquence héberger de nombreux sites avec la même + adresse IP.
    + Voir la Documentation des Hôtes Virtuels d'Apache +
    + + +
    .htaccess
    +
    Un fichier de configuration + placé à un certain niveau de l'arborescence du site web, et appliquant des + directives de configuration au + répertoire dans lequel il est placé, ainsi qu'à tous ses sous-répertoires. + En dépit de son nom, ce fichier peut contenir pratiquement tout type de + directive, et pas seulement des directives de contrôle d'accès.
    + Voir : Fichiers de configuration +
    + +
    httpd.conf
    +
    Le fichier de configuration + principal d'Apache. Sa localisation par défaut est + /usr/local/apache2/conf/httpd.conf, mais ceci peut être + changé en utilisant des options de compilation ou d'exécution.
    + Voir : Fichiers de configuration +
    + +
    HTTPS
    +
    Le Protocole de Transfert Hypertexte (Sécurisé), le mécanisme de + communication cryptée standard sur le World Wide Web. + Il s'agit en fait de HTTP au dessus de + SSL.
    + Voir : chiffrement SSL/TLS +
    + +
    Identificateur de Ressource Uniformisé + (Uniform Resource Identifier) + (URI)
    +
    Une chaîne de caractères compacte servant à identifier une ressource + abstraite ou physique. Elle est formellement définie par la RFC 2396. Les URIs + utilisées sur le world-wide web sont souvent appelées URLs. +
    + +
    + Inclusions Côté Serveur + (Server Side Includes) (SSI) +
    +
    Une technique permettant d'englober des directives de traitement dans + des fichiers HTML.
    + Voir : Introduction aux Inclusions Côté Serveur +
    + +
    Indication du nom du serveur (SNI)
    +
    Une fonctionnalité SSL permettant de spécifier le + nom du serveur désiré dans le message initial de la + négociation SSL, de façon à ce que le serveur web + puisse choisir la bonne configuration de serveur virtuel à + utiliser pendant le déroulement de la négociation SSL. + Cette fonctionnalité a été ajoutée + à SSL lorsque sont apparues les extensions TLS, RFC 3546.
    + Voir la FAQ SSL + et la RFC 3546 +
    + + + +
    +Interface commune avec les programmes externes +(Common Gateway Interface) + (CGI)
    +
    La définition standard d'une interface entre un serveur web et un + programme externe pour permettre à ce dernier de traiter des requêtes. + Il existe une RFC + informationnelle qui en couvre les spécificités.
    + Voir : Contenu dynamique avec CGI +
    + + + +
    +Localisation de Ressource Uniformisée +(Uniform Resource Locator) + (URL)
    +
    Le nom/adresse d'une ressource sur l'Internet. Il s'agit du terme + informel commun pour ce qui est formellement défini comme + Identificateur de Ressource Uniformisé. + Les URLs sont généralement construites selon un schéma, comme + http ou + https, un nom d'hôte, et un chemin. Une URL pour cette page + pourrait être + http://httpd.apache.org/docs/2.4/glossary.html. +
    + + +
    Mandataire (Proxy)
    +
    Un serveur intermédiaire qui se situe entre le client et le + serveur d'origine. + Il prend en compte les requêtes des clients, les transmet au serveur + d'origine, puis renvoie la réponse du serveur d'origine au client. + Si plusieurs clients demandent le même contenu, le mandataire peut l'extraire + de son cache, plutôt que le demander au serveur d'origine + à chaque fois, ce qui réduit le temps de réponse.
    + Voir : mod_proxy +
    + +
    Mandataire inverse + (Reverse Proxy)
    +
    Un serveur mandataire qui est vu du client + comme un serveur d'origine. Ceci peut s'avérer utile pour + dissimuler le serveur d'origine réel au client pour des raisons de sécurité, + ou pour répartir la charge. +
    + +
    Méthode (Method)
    +
    Dans le contexte HTTP, une action à + effectuer sur une ressource spécifiée dans la ligne de requête + par le client. Parmi les méthodes disponibles dans HTTP, on trouve + GET, POST, + et PUT. +
    + +
    Module
    +
    Une partie indépendante d'un programme. De nombreuses fonctionnalités + d'Apache sont fournies par des modules que vous pouvez choisir d'inclure + ou d'exclure. Les modules qui sont compilés dans le binaire + httpd sont appelés modules statiques, alors + que les modules qui existent séparément et peuvent être chargés + optionnellement à l'exécution sont appelés + modules dynamiques ou DSOs. + Les modules qui sont inclus par défaut sont appelés + modules de base. De nombreux modules disponibles pour Apache + ne se trouvent pas dans l'archive + du Serveur HTTP Apache . Il sont appelés + modules tiers.
    + Voir : Index des modules +
    + +
    Mot de Passe (Pass Phrase)
    +
    Le mot ou la phrase qui protège les fichiers de clés privées. + Il empêche les utilisateurs non autorisés de les déchiffrer. En général, + il s'agit simplement de la clé secrète de chiffrement/déchiffrement + utilisée pour les Algorithmes de chiffrement.
    + Voir : chiffrement SSL/TLS +
    + +
    Nom de domaine entièrement qualifié + (Fully-Qualified Domain-Name) + (FQDN)
    +
    Le nom unique d'une entité du réseau, comprenant un nom d'hôte et un + nom de domaine qui peuvent être résolus en une adresse IP. Par exemple, + www est un nom d'hôte, example.com est un nom + de domaine, et www.example.com est un nom de domaine + entièrement qualifié. +
    + +
    + Nombre Magique des Modules + (Module Magic Number) + (MMN)
    +
    Le Nombre Magique des Modules est une constante définie dans le code + source d'Apache et associée à la compatibilité binaire des modules. + Sa valeur est modifiée quand des structures internes d'Apache, des appels + de fonctions et d'autres parties significatives de l'API sont modifiées + de telle façon que la compatibilité binaire ne peut plus être garantie. + En cas de changement de MMN, tous les modules tiers doivent être au + moins recompilés, et parfois même légèrement modifiés afin de pouvoir + fonctionner avec la nouvelle version d'Apache. +
    + +
    + Objet Dynamique Partagé (Dynamic Shared Object) + (DSO)
    +
    Modules compilés en dehors du binaire + Apache httpd et qui peuvent être + chargés à la demande.
    + Voir : Support des objets dynamiques partagés +
    + +
    OpenSSL
    +
    L'ensemble d'outils Open Source pour SSL/TLS
    + Voir http://www.openssl.org/# +
    + +
    + Outil de gestion des extensions Apache + (APache eXtension Tool) + (apxs)
    +
    Un script Perl qui aide à la compilation des sources de module sous forme d'Objets Dynamiques Partagés + (Dynamic Shared Objects ou + DSOs) et facilite leur installation + dans le serveur Web Apache.
    + Voir : Page de manuel : apxs +
    + +
    Plein Texte (Plaintext)
    +
    Le texte non chiffré.
    + + + +
    Protocole de Transfert Hypertexte + (HyperText Transfer Protocol) + (HTTP)
    +
    Le protocole de transmission standard utilisé sur le World Wide Web. + Apache implémente la version 1.1 du protocole, référencée comme HTTP/1.1 et + définie par la + RFC 2616. +
    + +
    Résumé de message + (Message Digest)
    +
    Un hachage du message, qui peut être utilisé pour vérifier + que son contenu n'a pas été altéré durant le transfert.
    + Voir : chiffrement SSL/TLS +
    + +
    + Sécurité de la couche Transport + (Transport Layer Security) + (TLS)
    +
    Le protocole successeur de SSL, créé par l'Internet Engineering Task + Force (IETF) pour l'authentification et le chiffrement généraux des + communications dans les réseaux TCP/IP. TLS version 1 est pratiquement + identique à SSL version 3.
    + Voir : chiffrement SSL/TLS +
    + +
    Session
    +
    Les informations sur le contexte d'une communication en général.
    + +
    Signature numérique + (Digital Signature)
    +
    Un bloc de texte crypté qui valide un certificat ou un autre fichier. + Une Autorité de certification + crée une signature en générant une empreinte de la Clé publique + fournie avec le Certificat; la CA chiffre ensuite l'empreinte + avec sa propre Clé privée. Seule la clé publique de la CA + peut décrypter la signature, ce qui permet de vérifier que la CA a bien + authentifié l'entité du réseau qui possède le + Certificat.
    + Voir : chiffrement SSL/TLS +
    + +
    SSLeay
    +
    La bibliothèque originelle d'implémentation de SSL/TLS développée par + Eric A. Young +
    + +
    Texte crypté +(Ciphertext)
    +
    Le résultat du passage d'un document + Plaintext (Plein texte) par un + Cipher.
    + Voir : chiffrement SSL/TLS +
    + +
    Type MIME (MIME-type)
    +
    Une méthode pour décrire le type de document transmis. Son nom + vient du fait que son format est issu des Multipurpose + Internet Mail Extensions (Extensions Multi-usages de la + Messagerie par Internet) . Il comprend un type majeur et un type + mineur, séparés par un slash (barre oblique). On trouve + entre autres types text/html, + image/gif, et application/octet-stream. Dans + HTTP, le type MIME est transmis dans l' + en-tête Content-Type.
    + Voir : mod_mime +
    + + +
    + Variable d'environnement + (Environment Variable) (env-variable)
    +
    Ce sont des variables nommées gérées par le shell du système + d'exploitation, et servant au stockage d'informations et à la + communication entre les programmes. Apache possède aussi des variables + internes considérées comme variables d'environnement, mais stockées dans + des structures internes à Apache, et non dans l'environnement + du shell.
    + Voir : Les variables d'environnement dans Apache +
    + +
    X.509
    +
    Une norme de certificat d'authentification recommandée par l'International + Telecommunication Union (ITU-T) et utilisée pour + l'authentification SSL/TLS.
    Voir : chiffrement SSL/TLS +
    +
    +
    +
    +

    Langues Disponibles:  de  | + en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/glossary.html.ja.utf8 b/docs/manual/glossary.html.ja.utf8 new file mode 100644 index 0000000..4e8ba1e --- /dev/null +++ b/docs/manual/glossary.html.ja.utf8 @@ -0,0 +1,482 @@ + + + + + +用語 - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    用語

    +
    +

    翻訳済ã¿è¨€èªž:  de  | + en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + +

    ã“ã®ç”¨èªžé›†ã§ã¯ Apacheã«ç‰¹åŒ–ã—ãŸç”¨èªžã¨ã€ + ウェブサーãƒå…¨èˆ¬ã§ä¸€èˆ¬çš„ãªç”¨èªžã‚’ã„ãã¤ã‹å®šç¾©ã—ã¦ã„ã¾ã™ã€‚ + ãれãžã‚Œã®æ¦‚念ã®ã€ã‚ˆã‚Šè©³ç´°ãªæƒ…å ±ã¯ãƒªãƒ³ã‚¯å…ˆã«ã‚りã¾ã™ã€‚

    +
    +
    top
    +
    +

    定義

    + +
    +
    アクセス制御
    +
    ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯èªå¯é ˜åŸŸã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’制é™ã—ã¾ã™ã€‚Apache ã«ãŠã„ã¦ã¯ã€ + 普通ã¯ã‚¢ã‚¯ã‚»ã‚¹ã®åˆ¶é™ã¯ URL ã«å¯¾ã™ã‚‹ã‚‚ã®ã¨ãªã‚Šã¾ã™ã€‚
    + å‚ç…§: èªè¨¼ã€æ‰¿èªã€ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ +
    + +
    アルゴリズム
    +
    有é™å›žã®ã‚¹ãƒ†ãƒƒãƒ—ã§å•題を解ããŸã‚ã®ã‚ã„ã¾ã„ã§ãªã„å¼ã‚‚ã—ãã¯è¦å‰‡ã® + 集åˆã€‚æš—å·ã®ãŸã‚ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã¯é€šå¸¸ Cipher ã¨å‘¼ã°ã‚Œã¾ã™ã€‚ +
    + +
    APache + eXtension Tool (apxs)
    +
    モジュール ソースを + 動的共有オブジェクト (DSO) ã«ã‚³ãƒ³ãƒ‘イルã—〠+ Apache Web サーãƒã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹æ‰‹åŠ©ã‘ã‚’ã™ã‚‹ perl スクリプト。
    + å‚ç…§: マニュアルページ: apxs +
    + +
    Apache Portable Runtime (APR)
    +
    サーãƒ(訳注: Apache HTTP Server)㨠OS ã® + é–“ã®åŸºæœ¬çš„ãªã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェースã®å¤šãã‚’æä¾›ã™ã‚‹(訳注: + OS ã®å·®ã‚’å¸åŽã™ã‚‹)ライブラリã®ã‚»ãƒƒãƒˆã€‚ APR 㯠独立ã—㟠+ プロジェクトã¨ã—㦠Apache HTTP Server ã¨å¹³è¡Œã—ã¦é–‹ç™ºãŒè¡Œã‚れã¦ã„ã¾ã™ã€‚
    + å‚ç…§: Apache Portable Runtime + プロジェクト +
    + +
    èªè¨¼
    +
    サーãƒã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã€ãƒ¦ãƒ¼ã‚¶ã¨ã„ã£ãŸãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã® + 身元ã®ç‰¹å®šã€‚
    + å‚ç…§: èªè¨¼ã€æ‰¿èªã€ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ +
    + +
    証明書
    +
    サーãƒã‚„クライアントã¨ã„ã£ãŸãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã‚’èªè¨¼ã™ã‚‹ã®ã« + 使用ã•れるデータレコード。証明書ã«ã¯ (subject ã¨å‘¼ã°ã‚Œã‚‹) 所有者ã¨ã€ + (issuer ã¨å‘¼ã°ã‚Œã‚‹) èªè¨¼å±€ ã®ç½²åã€æ‰€æœ‰è€…ã® + å…¬é–‹éµ ã¨ã€CA ã«ã‚ˆã‚‹ç½²åã¨ã„ㆠ+ X.509 ã®æƒ…å ±ãŒå«ã¾ã‚Œã¾ã™ã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã¯ãれらã®ç½²åã‚’ + CA 証明書を使ã£ã¦æ¤œè¨¼ã—ã¾ã™ã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    証明書署åリクエスト + (訳注: Certificate Signing Request) + (CSR)
    +
    èªè¨¼å±€ ã«æå‡º + ã™ã‚‹æœªç½²å㮠証明書。 + èªè¨¼å±€ã¯ CA 証明書 ã® ç§˜å¯†éµ ã§ç½²åã—ã¾ã™ã€‚ + 一旦 CSR ã«ç½²åãŒãªã•れるã¨ã€ãã‚Œã¯æœ¬ç‰©ã®è¨¼æ˜Žæ›¸ã«ãªã‚Šã¾ã™ã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    証明局 + (訳注: Certification Authority) + (CA)
    +
    å®‰å…¨ãªæ–¹æ³•ã§èªè¨¼ã‚’行ãªã£ãŸãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã®è¨¼æ˜Žæ›¸ã‚’ + ç½²åã™ã‚‹ãŸã‚ã®ä¿¡é ¼ã§ãる第三者機関。他ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã¯ + 証明書ã®ä¿æŒè€…㌠CA ã«èªè¨¼ã•れãŸã‹ã‚’ç½²åを検証ã™ã‚‹ã“ã¨ã§èª¿ã¹ã‚‹ã“ã¨ãŒ + ã§ãã¾ã™ã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    Cipher
    +
    データ暗å·åŒ–ã®ãŸã‚ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã€‚例ãˆã° DES, IDEA, RC4 ãªã©ã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    æš—å·æ–‡
    +
    平文 ㌠+ Cipher ã‚’ã‹ã‘られãŸçµæžœã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    Common + Gateway Interface (CGI)
    +
    外部プログラムãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’扱ã†ã“ã¨ãŒã§ãるよã†ã«ã™ã‚‹ãŸã‚ã® + ウェブサーãƒã¨å¤–部プログラム間ã®ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ã®æ¨™æº–仕様。 + インタフェースã¯å…ƒã€… NCSA ã«ã‚ˆã‚Šå®šç¾© + ã•れã¦ã„ã¾ã—ãŸãŒ + RFC プロジェクト も存在ã—ã¾ã™ã€‚
    + å‚ç…§: CGI ã«ã‚ˆã‚‹å‹•的コンテンツ +
    + +
    設定ディレクティブ
    +
    å‚ç…§: ディレクティブ
    + +
    設定ファイル
    +
    Apache ã®è¨­å®šã‚’制御ã™ã‚‹ ディレクティブ + ã®æ›¸ã‹ã‚ŒãŸãƒ†ã‚­ã‚¹ãƒˆãƒ•ァイル。
    + å‚ç…§: 設定ファイル +
    + +
    CONNECT
    +
    データãƒãƒ£ãƒãƒ«ã‚’ãã®ã¾ã¾ HTTP 上ã§ãƒ—ロキシã™ã‚‹ãŸã‚ã® HTTP + メソッド。SSL ã®ã‚ˆã†ãªä»–ã® + プロトコルをãã‚‹ã‚€ãŸã‚ã«ä½¿ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ +
    + +
    コンテキスト
    +
    設定ファイル 中ã§ã€ + 特定ã®ç¨®é¡žã® ディレクティブ ãŒè¨±å¯ã•れã¦ã„る場所。
    + å‚ç…§: Apache ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã® + 説明ã«ä½¿ã‚れã¦ã„る用語 +
    + +
    デジタル署å
    +
    証明書や他ã®ãƒ•ァイルを検証ã™ã‚‹ãŸã‚ã®æš—å·åŒ–ã•れãŸãƒ†ã‚­ã‚¹ãƒˆãƒ–ロック。 + èªè¨¼å±€ 㯠+ 証明書 ã«åŸ‹ã‚è¾¼ã¾ã‚ŒãŸ å…¬é–‹éµ ã®ãƒãƒƒã‚·ãƒ¥ã‚’作æˆã—〠+ ãã‚Œã‚’è‡ªèº«ã® ç§˜å¯†éµ ã§æš—å·åŒ–ã™ã‚‹ã“ã¨ã§ç½²åを作æˆã—ã¾ã™ã€‚ + CA ã®å…¬é–‹éµã§ã®ã¿ãã®ç½²åを復å·ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã®ã§ã€ãれã«ã‚ˆã‚Š + 証明書 ã‚’ä¿æœ‰ã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã‚’ CA ãŒèªè¨¼ã—㟠+ ã“ã¨ã‚’検証ã§ãã¾ã™ã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    ディレクティブ
    +
    Apache ã®ã„ã‚ã„ã‚ãªæŒ¯ã‚‹èˆžã„を制御ã™ã‚‹è¨­å®šã‚³ãƒžãƒ³ãƒ‰ã€‚ディレクティブ㯠+ 設定ファイル ã« + 書ã‹ã‚Œã¾ã™ã€‚
    + å‚ç…§: ディレクティブ索引 +
    + +
    動的 + 共有オブジェクト (訳注: Dynamic + Shared Object) (DSO)
    +
    å¿…è¦ã«å¿œã˜ã¦èª­ã¿è¾¼ã‚€ã“ã¨ãŒå¯èƒ½ãªã€Apache httpd ã¨ã¯ + 別ã«ã‚³ãƒ³ãƒ‘イルã•れ㟠モジュール
    + å‚ç…§: 動的共有オブジェクトサãƒãƒ¼ãƒˆ +
    + +
    環境変数 + (env-variable)
    +
    情報をä¿ç®¡ã—ãŸã‚Šã€ãƒ—ログラム間ã®é€šä¿¡ã‚’ã™ã‚‹ãŸã‚ã«ä½¿ã‚れる〠+ オペレーティングシステムã®ã‚·ã‚§ãƒ«ã«ã‚ˆã‚Šç®¡ç†ã•れã¦ã„ã‚‹åå‰ä»˜ãã®å¤‰æ•°ã€‚ + Apache も環境変数ã¨å‘¼ã°ã‚Œã‚‹å†…部変数をæŒã£ã¦ã„ã¾ã™ãŒã€ã“ã¡ã‚‰ã¯ + シェル環境ã§ã¯ãªãã€Apache ã®å†…部構造体ã«ä¿æŒã•れã¦ã„ã¾ã™ã€‚
    + å‚ç…§: Apache ã®ç’°å¢ƒå¤‰æ•° +
    + +
    輸出強度削減 + (訳注: Export-Crippled)
    +
    アメリカ㮠Export Administration Regulations (EAR) + (訳注: 輸出管ç†è¦å‰‡) ã«å¾“ã†ãŸã‚ã«æš—å·ã®å¼·åº¦ (ã¨ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£) + を削減ã™ã‚‹ã“ã¨ã€‚輸出強度削減ã•ã‚ŒãŸæš—å·ã‚½ãƒ•トウェアã¯å°ã•ã„キー㫠+ 制é™ã•れã€é€šå¸¸ç·å½“ãŸã‚Šæ”»æ’ƒã§å¾©å·ã§ãã¦ã—ã¾ã† æš—å·æ–‡ を生æˆã™ã‚‹ + ã“ã¨ã«ãªã‚Šã¾ã™ã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    フィルタ
    +
    サーãƒã‹ã‚‰é€ã‚‰ã‚Œã‚‹ãƒ‡ãƒ¼ã‚¿ã¨ã‚µãƒ¼ãƒãŒå—ã‘å–るデータã«é©ç”¨ã•れる処ç†ã€‚ + 入力フィルタã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰ã‚µãƒ¼ãƒã«é€ã‚‰ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã‚’処ç†ã—〠+ 出力フィルタã¯ã‚µãƒ¼ãƒã«ã‚る文書をクライアントã«é€ã‚‹å‰ã«å‡¦ç†ã—ã¾ã™ã€‚ + 例ãˆã°ã€INCLUDES 出力フィルタ㯠+ Server Side Includes ã®æ–‡æ›¸ã‚’ + 処ç†ã—ã¾ã™ã€‚
    + å‚ç…§: フィルタ +
    + +
    完全修飾ドメインå + (訳注: Fully-Qualified Domain-Name) + (FQDN)
    +
    IP アドレスã«è§£æ±ºã§ãるホストåã¨ã€ãƒ‰ãƒ¡ã‚¤ãƒ³åã‹ã‚‰ãªã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ + エンティティã®ä¸€æ„ãªåå‰ã€‚例ãˆã°ã€www ã¯ãƒ›ã‚¹ãƒˆåã§ã€ + example.com ã¯ãƒ‰ãƒ¡ã‚¤ãƒ³åãªã®ã§ã€ + www.example.com ã¯å®Œå…¨ä¿®é£¾ãƒ‰ãƒ¡ã‚¤ãƒ³åã«ãªã‚Šã¾ã™ã€‚
    + +
    ãƒãƒ³ãƒ‰ãƒ©
    +
    ファイルãŒå‘¼ã°ã‚ŒãŸã¨ãã«è¡Œãªã‚れる動作㮠Apache ã®å†…部ã§ã®è¡¨ç¾ã€‚ + 一般ã«ãƒ•ァイルã«ã¯ãƒ•ァイルã®ç¨®é¡žã«å¿œã˜ã¦æš—é»™ã®ãƒãƒ³ãƒ‰ãƒ©ãŒè¨­å®šã•れ㦠+ ã„ã¾ã™ã€‚普通ã¯ã™ã¹ã¦ã®ãƒ•ァイルãŒã‚µãƒ¼ãƒã«ã‚ˆã‚Šé€ã‚‰ã‚Œã¾ã™ãŒã€åˆ¥ã« + 扱ã‚れる (訳注: handle) ファイルã®ç¨®é¡žã‚‚存在ã—ã¾ã™ã€‚ + 例ãˆã° cgi-script ã¯ãƒ•ァイル㌠+ CGI ã¨ã—ã¦å‡¦ç†ã•れるよã†ã«æŒ‡å®šã—ã¾ã™ã€‚
    + å‚ç…§: Apache ã®ãƒãƒ³ãƒ‰ãƒ©ã®ä½¿ç”¨ +
    + +
    ãƒãƒƒã‚·ãƒ¥
    +
    ä»»æ„ã®æ–‡å­—列ã‹ã‚‰å›ºå®šé•·ã®æ–‡å­—列を生æˆã™ã‚‹ã€æ•°å­¦çš„ãªä¸€æ–¹å‘ã§ä¸å¯é€†ãª + アルゴリズム。異ãªã£ãŸå…¥åŠ›æ–‡å­—åˆ—ã‹ã‚‰ã¯æ™®é€šã¯é•ã†ãƒãƒƒã‚·ãƒ¥ãŒç”Ÿæˆã•れã¾ã™ + (ãƒãƒƒã‚·ãƒ¥é–¢æ•°ã«ä¾å­˜ã—ã¾ã™)。
    + +
    ヘッダ
    +
    実際ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®å‰ã«é€ã‚‰ã‚Œã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を説明ã™ã‚‹ãƒ¡ã‚¿æƒ…報㮠+ å…¥ã£ãŸ HTTP リクエストã¨å¿œç­”ã®ä¸€éƒ¨åˆ†ã€‚
    + +
    .htaccess
    +
    ウェブツリーã«ç½®ã‹ã‚Œã¦ã€ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ã‚µãƒ–ディレクトリ㫠+ ディレクティブ ã‚’é©ç”¨ã™ã‚‹ + 設定ファイル。 + åå‰ã¨ã¯è£è…¹ã«ã€ã“ã®ãƒ•ァイルã«ã¯ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã ã‘ã§ãªã〠+ ã»ã¨ã‚“ã©ã©ã‚“ãªç¨®é¡žã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã§ã‚‚書ãã“ã¨ãŒã§ãã¾ã™ã€‚
    + å‚ç…§: 設定ファイル +
    + +
    httpd.conf
    +
    メイン㮠Apache 設定 + ファイル。デフォルトã®å ´æ‰€ã¯ + /usr/local/apache2/conf/httpd.conf + ã§ã™ãŒã€å®Ÿè¡Œæ™‚やコンパイル時ã®è¨­å®šã«ã‚ˆã‚Šé•ã†å ´æ‰€ã«ç§»å‹•ã•れ㦠+ ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
    + å‚ç…§: 設定ファイル +
    + +
    HyperText Transfer Protocol + (HTTP)
    +
    World Wide Web ã§ä½¿ã‚れる標準ã®è»¢é€ãƒ—ロトコル。Apache + 㯠HTTP/1.1 ã¨å‘¼ã°ã‚Œã€RFC 2616 + ã§å®šç¾©ã•れã¦ã„るプロトコルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 1.1 を実装ã—ã¦ã„ã¾ã™ã€‚
    + +
    HTTPS
    +
    The HyperText Transfer Protocol (Secure), + World Wide Web ã§ã®æš—å·åŒ–ã•ã‚ŒãŸæ¨™æº–ã®é€šä¿¡æ©Ÿæ§‹ã€‚ã“れã¯å®Ÿéš›ã¯ + å˜ã« SSL 上ã§ã® HTTP ã§ã™ã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    メソッド
    +
    HTTP ã®æ–‡è„ˆã§ã¯ã€ + クライアントã‹ã‚‰æŒ‡å®šã•れãŸãƒªã‚¯ã‚¨ã‚¹ãƒˆè¡Œã«å¯¾å¿œã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹ + ã«å¯¾ã—ã¦è¡Œãªã†å‹•作。HTTP ã§ã¯ GET, POST, + PUT ã¨ã„ã£ãŸã‚ˆã†ãªãƒ¡ã‚½ãƒƒãƒ‰ãŒã‚りã¾ã™ã€‚
    + +
    メッセージダイジェスト
    +
    メッセージã®ãƒãƒƒã‚·ãƒ¥ã§ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å†…容ãŒè»¢é€æ™‚ã«å¤‰æ›´ã•れã¦ã„ãªã„ã“ã¨ã®æ¤œè¨¼ã« + 使ãˆã‚‹ã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    MIME タイプ
    +
    é€ä¿¡ã•れã¦ã„るドキュメントã®ç¨®é¡žã‚’表ã™ãŸã‚ã®æ–¹æ³•。 + ã“ã®åå‰ã¯ãƒ•ォーマット㌠Multipurpose Internet Mail Extensions ã‹ã‚‰ + 借りã¦ã“られãŸã“ã¨ã«ã‚ˆã‚Šã¾ã™ã€‚ã“れã¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã§åˆ†é›¢ã•れãŸã€ + 主タイプã¨å‰¯ã‚¿ã‚¤ãƒ—ã‹ã‚‰ãªã‚Šã¾ã™ã€‚例ãˆã°ã€text/html, + image/gif, application/octet-stream ãªã© + ãŒã‚りã¾ã™ã€‚HTTP ã§ã¯ã€MIME タイプ㯠Content-Type + ヘッダ ã§é€ä¿¡ã•れã¾ã™ã€‚
    + å‚ç…§: mod_mime +
    + +
    モジュール
    +
    プログラムã®ç‹¬ç«‹ã—ãŸä¸€éƒ¨åˆ†ã€‚Apache ã®æ©Ÿèƒ½ã®å¤šãã¯ä½¿ç”¨ã™ã‚‹ã‹ã—ãªã„ã‹ã‚’ + é¸æŠžã§ãるモジュールã®ä¸­ã«ã‚りã¾ã™ã€‚Apache httpd + ã«çµ„ã¿è¾¼ã¾ã‚Œã¦ã„るモジュールã¯é™çš„モジュールã¨å‘¼ã°ã‚Œã€ + 別ã«ä¿å­˜ã•れã€å®Ÿè¡Œæ™‚ã«èª­ã¿è¾¼ã‚€ã“ã¨ã®ã§ãるモジュール㯠+ 動的モジュール ã‚‚ã—ã㯠DSO 㨠+ 呼ã°ã‚Œã¾ã™ã€‚デフォルトã§å«ã¾ã‚Œã¦ã„るモジュールã¯base モジュール + ã¨å‘¼ã°ã‚Œã¾ã™ã€‚Apache HTTP サーãƒã® tarball + ã®ä¸€éƒ¨ã¨ã—ã¦ã¯é…られã¦ã„ãªã„ Apache 用ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãŒã‚りã¾ã™ã€‚ + ãれら㯠サードパーティモジュール ã¨å‘¼ã°ã‚Œã¾ã™ã€‚
    + å‚ç…§: モジュール索引 +
    + +
    Module Magic + Number (MMN)
    +
    Apache ソースコードã§å®šç¾©ã•れã¦ã„ã‚‹ã€ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®ãƒã‚¤ãƒŠãƒªäº’æ›æ€§ã« + é–¢ã™ã‚‹å®šæ•°ã€‚ãƒã‚¤ãƒŠãƒªäº’æ›æ€§ãŒä¿ã¦ãªããªã‚‹ã‚ˆã†ãª Apache å†…éƒ¨ã®æ§‹é€ ä½“や〠+ 関数呼ã³å‡ºã—ã€ãã®ä»–ã® API ã®é‡è¦ãªéƒ¨åˆ†ã®å¤‰æ›´ãŒã‚ã£ãŸã¨ãã«å¤‰æ›´ã•れã¾ã™ã€‚ + MMN ãŒå¤‰ã‚ã‚‹ã¨ã€ã™ã¹ã¦ã®ã‚µãƒ¼ãƒ‰ãƒ‘ーティモジュールã¯å°‘ãªãã¨ã‚‚å†ã‚³ãƒ³ãƒ‘イルを + ã™ã‚‹å¿…è¦ãŒã‚りã€å ´åˆã«ã‚ˆã£ã¦ã¯æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® Apache ã§å‹•作ã™ã‚‹ãŸã‚ã« + å°‘ã—変更ã™ã‚‹å¿…è¦ã•ãˆã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
    + +
    OpenSSL
    +
    SSL/TLS 用ã®ã‚ªãƒ¼ãƒ—ンソースツールキット
    + å‚ç…§ http://www.openssl.org/# +
    + +
    パスフレーズ
    +
    秘密éµã®ãƒ•ァイルをä¿è­·ã™ã‚‹ãŸã‚ã®èªžå¥ã€‚権é™ã®ç„¡ã„ユーザ㌠+ æš—å·åŒ–ã™ã‚‹ã®ã‚’防ãŽã¾ã™ã€‚通常ã¯å˜ã« Cipher ã®ç§˜å¯†ã®æš—å·ç”¨ã¨å¾©å·ç”¨ã®ã‚­ãƒ¼ã§ã™ã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    平文
    +
    æš—å·åŒ–ã•れã¦ã„ãªã„テキスト。
    + +
    秘密éµ
    +
    å—ã‘å–るメッセージã®å¾©å·ã¨é€å‡ºã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ç½²åã«ä½¿ã‚れる〠+ 公開鵿š—å· ã® + 秘密éµã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    プロキシ
    +
    クライアント㨠オリジンã®ã‚µãƒ¼ãƒ ã®é–“ã«å­˜åœ¨ã™ã‚‹ä¸­é–“サーãƒã€‚ + クライアントã‹ã‚‰ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’å—ã‘å–りã€ã‚ªãƒªã‚¸ãƒ³ã®ã‚µãƒ¼ãƒã«é€ä¿¡ã—ã¦ã€ã‚ªãƒªã‚¸ãƒ³ã® + サーãƒã‹ã‚‰ã®å¿œç­”をクライアントã«è¿”ã—ã¾ã™ã€‚複数ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒåŒã˜ + ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’è¦æ±‚ã™ã‚‹å ´åˆã¯ã€æ¯Žå›žå…ƒã®ã‚µãƒ¼ãƒã«ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ã‚‹ä»£ã‚り + プロキシã¯ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‹ã‚‰ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’é€ã‚Šã€å¿œç­”時間を短縮ã™ã‚‹ã“ã¨ãŒ + ã§ãã¾ã™ã€‚
    + å‚ç…§: mod_proxy +
    + +
    公開éµ
    +
    所有者ã«å‘ã‘られãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æš—å·åŒ–ã¨æ‰€æœ‰è€…ã«ã‚ˆã‚‹ç½²åã®å¾©å·ã«ä½¿ã‚れる〠+ 公開鵿š—å·ã‚·ã‚¹ãƒ†ãƒ ã« + ãŠã‘ã‚‹å…¬ã‘ã«ã•れã¦ã„ã‚‹éµã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    公開鵿š—å·
    +
    ã‚ã‚‹éµã‚’æš—å·ã«ä½¿ã„ã€åˆ¥ã®éµã‚’復å·ã«ä½¿ã†éžå¯¾ç§°æš—å·ã‚·ã‚¹ãƒ†ãƒ ã«ã¤ã„ã¦ã®ç ”ç©¶ã‚„ + ãã®å¿œç”¨ã‚’指ã™ã€‚対応ã™ã‚‹éµã¯ã‚­ãƒ¼ãƒšã‚¢ã¨å‘¼ã°ã‚Œã¾ã™ã€‚éžå¯¾ç§°æš—å·ã¨ã‚‚呼ã°ã‚Œã¾ã™ã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    æ­£è¦è¡¨ç¾ + (Regex)
    +
    テキストã®ãƒ‘ターンを表ç¾ã™ã‚‹æ–¹å¼ã®ä¸€ã¤ã€‚例ãˆã°ã€ + 「A ã§å§‹ã¾ã‚‹ã™ã¹ã¦ã®å˜èªžã€ã‚„「ã™ã¹ã¦ã® 10 æ¡ã®é›»è©±ç•ªå·ã€ã‚„〠+ 「コンマãŒäºŒã¤ã‚りã€å¤§æ–‡å­—ã® Q ãŒãªã„ã™ã¹ã¦ã®æ–‡ã€ã¨ã„ã†ã®ã§ã•ãˆè¡¨ç¾ + ã§ãã¾ã™ã€‚ + æ­£è¦è¡¨ç¾ã¯ Apache ã«ãŠã„ã¦ã‚‚便利ãªã‚‚ã®ã§ã€ãƒ•ァイルやリソースã®é›†ã¾ã‚Šã«å¯¾ã—㦠+ 何らã‹ã®å±žæ€§ã‚’é©ç”¨ã™ã‚‹ã“ã¨ãŒã¨ã¦ã‚‚柔軟ã«ã§ãã¾ã™ã€‚例ãˆã°ã€ + ã™ã¹ã¦ã® "images" ディレクトリã®ä¸‹ã®ã€ã™ã¹ã¦ã® .gif 㨠.jpg ファイル + 㯠/images/.*(jpg|gif)$ ã¨æ›¸ãã“ã¨ãŒã§ãã¾ã™ã€‚ + Apache ã§ã¯ PCRE ãƒ©ã‚¤ãƒ–ãƒ©ãƒªãŒæä¾›ã™ã‚‹ + Perl äº’æ›æ­£è¦è¡¨ç¾ (訳注: Perl Compatible Regular Expressions) + を使ã„ã¾ã™ã€‚
    + +
    リãƒãƒ¼ã‚¹ãƒ—ロキシ
    +
    クライアントã«ã¯ オリジンã®ã‚µãƒ¼ãƒ ã®ã‚ˆã†ã«è¦‹ãˆã‚‹ + プロキシ サーãƒã€‚セキュリティ㮠+ ãŸã‚ã‚„ã€è² è·åˆ†æ•£ã®ãŸã‚ã«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰ã‚ªãƒªã‚¸ãƒ³ã®ã‚µãƒ¼ãƒã‚’éš ã—ãŸã„ã¨ãã« + 便利ã§ã™ã€‚
    + +
    Secure Sockets + Layer (SSL)
    +
    Netscape Communications Corporation ã«ã‚ˆã‚Š + TCP/IP ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã§ä¸€èˆ¬ã®é€šä¿¡ã®èªè¨¼ã¨æš—å·ç”¨ã«ä½œã‚‰ã‚ŒãŸãƒ—ロトコル。 + 最もよã使ã‚れã¦ã„ã‚‹ã‚‚ã®ã¯ HTTPS ã¤ã¾ã‚Š SSL 上ã§ã® + HyperText Transfer Protocol (HTTP) ã§ã™ã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    Server Side + Includes (SSI)
    +
    HTML ファイル中ã«å‡¦ç†ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–を埋ã‚込む技術ã®ä¸€ã¤ã€‚
    + å‚ç…§: Server Side Includes 入門 +
    + +
    セッション
    +
    一般的ãªé€šä¿¡ã«ãŠã‘る文脈情報。
    + +
    SSLeay
    +
    Eric A. Young æ°ã«ã‚ˆã‚‹ SSL/TLS を実装ã—ãŸå…ƒã€…ã®ãƒ©ã‚¤ãƒ–ラリ。
    + +
    å¯¾ç§°æš—å· +
    +
    一ã¤ã®ç§˜å¯†éµã‚’æš—å·åŒ–ã¨å¾©å·ã®ä¸¡æ–¹ã«ä½¿ã† Cipher ã® + 研究や応用を指ã™ã€‚
    + +
    Tarball
    +
    tar ユーティリティを使ã£ã¦ã¾ã¨ã‚られãŸãƒ•ァイルã®ãƒ‘ッケージ。 + Apache é…布ã¯åœ§ç¸®ã•れ㟠tar アーカイブ㋠pkzip ã§ä¿ç®¡ã•れã¦ã„ã¾ã™ã€‚
    + +
    Transport + Layer Security (TLS)
    +
    TCP/IP ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã§ã®ä¸€èˆ¬é€šä¿¡ã®èªè¨¼ã¨æš—å·åŒ–用㫠+ Internet Engineering Task Force (IETF) ã«ã‚ˆã‚Šä½œæˆã•れ㟠SSL ã® + 後継プロトコル。TLS ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 1 㯠SSL ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 3 ã¨ã»ã¼åŒã˜ã§ã™ã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    + +
    Uniform + Resource Locator (URL)
    +
    Internet ã®ãƒªã‚½ãƒ¼ã‚¹ã®åå‰ã€ã‚‚ã—ãã¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã€‚ã“ã‚Œã¯æ­£å¼ã«ã¯ + Uniform Resource Identifier + ã¨å‘¼ã°ã‚Œã‚‹ã‚‚ã®ã®ã‚ˆã使ã‚れるéžå…¬å¼ãªåå‰ã§ã™ã€‚URL ã¯æ™®é€šã¯ã€ + http ã‚„ https ã¨ã„ã£ãŸã‚¹ã‚­ãƒ¼ãƒ ã¨ãƒ›ã‚¹ãƒˆå〠+ パスã‹ã‚‰ãªã‚Šã¾ã™ã€‚ã“ã®ãƒšãƒ¼ã‚¸ã® URL ã¯ãŠãらã + http://httpd.apache.org/docs/2.4/glossary.html + ã¨æ€ã‚れã¾ã™ã€‚ +
    + +
    Uniform Resource Identifier + (URI)
    +
    抽象的ãªãƒªã‚½ãƒ¼ã‚¹ã‚„物ç†ãƒªã‚½ãƒ¼ã‚¹ã‚’åŒå®šã™ã‚‹ãŸã‚ã®ã‚³ãƒ³ãƒ‘ã‚¯ãƒˆãªæ–‡å­—列。 + æ­£å¼ã«ã¯ RFC 2396 ã§ + 定義ã•れã¦ã„ã¾ã™ã€‚WWW ã§ä½¿ã‚れã¦ã„ã‚‹ URI ã¯é€šå¸¸ + URL ã¨å‘¼ã°ã‚Œã¾ã™ã€‚ +
    + +
    ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆ
    +
    一ã¤ã® Apache を使ã£ã¦è¤‡æ•°ã®ã‚¦ã‚§ãƒ–サイトを扱ã†ã“ã¨ã€‚ + IP ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆ 㯠IP アドレスを使ã£ã¦ã‚¦ã‚§ãƒ–サイトを + 区別ã—ã¾ã™ã€‚ã¾ãŸ åå‰ãƒ™ãƒ¼ã‚¹ã®ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆ 㯠+ ホストã®åå‰ã ã‘を使ã£ã¦åŒºåˆ¥ã™ã‚‹ã®ã§ã€åŒã˜ IP アドレス上ã§ã®å¤šãã®ã‚µã‚¤ãƒˆã‚’ + ホストã§ãã¾ã™ã€‚
    + å‚ç…§: Apache ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã®æ–‡æ›¸ +
    + +
    X.509
    +
    SSL/TLS èªè¨¼ã«ä½¿ã‚れã¦ã„ã‚‹ International + Telecommunication Union (ITU-T) ã«ã‚ˆã‚пލ奍ã•れã¦ã„ã‚‹èªè¨¼è¨¼æ˜Žæ›¸ã®å½¢å¼ã€‚
    + å‚ç…§: SSL/TLS æš—å·åŒ– +
    +
    +
    +
    +

    翻訳済ã¿è¨€èªž:  de  | + en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/glossary.html.ko.euc-kr b/docs/manual/glossary.html.ko.euc-kr new file mode 100644 index 0000000..6cbd02d --- /dev/null +++ b/docs/manual/glossary.html.ko.euc-kr @@ -0,0 +1,396 @@ + + + + + +¿ë¾î - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    ¿ë¾î

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  de  | + en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + +

    ÀÌ ¹®¼­´Â À¥ ¼­ºñ½º ÀϹݿ¡ ´ëÇÑ, ƯÈ÷ ¾ÆÆÄÄ¡¿Í °ü·ÃµÈ, ¿ë¾îµéÀ» +Á¤ÀÇÇÑ´Ù. °¢ °³³ä¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â ¸µÅ©¸¦ Âü°íÇ϶ó. +(¿ªÁÖ; ÇöÀç ´Ü¾îÀÇ ¼ø¼­´Â ÇÑ±Û ¼ø¼­°¡ ¾Æ´Ï¶ó, ¿µ¹®ÀÚ +¼ø¼­ÀÔ´Ï´Ù. ¿ë¾î¹ø¿ªÇ¥´Â ¿©±â¸¦ +Âü°íÇÏ±æ ¹Ù¶ø´Ï´Ù.)

    +
    +
    top
    +
    +

    Á¤ÀÇ

    + +
    +
    Á¢±ÙÁ¦¾î (Access Control)
    +
    ³×Æ®¿÷ ¿µ¿ª¿¡ ´ëÇÑ Á¢±ÙÀ» Á¦ÇÑ. ¾ÆÆÄÄ¡¿¡¼­´Â º¸Åë Æ¯Á¤ +URLÀÇ Á¢±ÙÀ» Á¦ÇÑÇϱâÀ§ÇØ »ç¿ëÇÑ´Ù.
    Âü°í: ÀÎÁõ, ±ÇÇѺο©, Á¢±ÙÁ¦¾î
    + +
    ¾Ë°í¸®Áò (Algorithm)
    +
    À¯ÇÑÇÑ ´Ü°è¸¦ °ÅÃÄ ¹®Á¦¸¦ Ǫ´Â ¸íÈ®ÇÑ °ø½Ä ȤÀº ±ÔÄ¢µé. +¾Ïȣȭ¸¦ À§ÇÑ ¾Ë°í¸®ÁòÀ» º¸Åë ¾ÏÈ£±â(Ciphers)¶ó°í +ºÎ¸¥´Ù.
    + +
    APache eXtension Tool +(apxs)
    ¸ðµâ +(module) ¼Ò½º¸¦ µ¿Àû°øÀ¯°´Ã¼ (DSO)·Î +ÄÄÆÄÀÏÇÏ°í ¾ÆÆÄÄ¡ À¥¼­¹ö¿¡ ¼³Ä¡ÇÏ´Â ÀÛ¾÷À» µ½´Â perl +½ºÅ©¸³Æ®.
    Âü°í: Manpage: +apxs
    + +
    ÀÎÁõ (Authentication)
    +
    ¼­¹ö, Ŭ¶óÀ̾ðÆ®, »ç¿ëÀÚ µî ³×Æ®¿÷ ½Çü¿¡ ´ëÇÑ +È®ÀÎ.
    Âü°í: ÀÎÁõ, ±ÇÇѺο©, +Á¢±ÙÁ¦¾î
    + +
    ÀÎÁõ¼­ (Certificate)
    +
    ¼­¹ö³ª Ŭ¶óÀÌ¾ðÆ®¿Í °°Àº ³×Æ®¿÷ ½Çü¸¦ ÀÎÁõÇÏ´Â ÀÚ·á. + ÀÎÁõ¼­¿¡´Â ¼ÒÀ¯ÀÚ (subject¶ó°í ÇÔ), ¼­¸í ÀÎÁõ±â°ü (Certificate + Authority) (issuer¶ó°í ÇÔ), ¼ÒÀ¯ÀÚÀÇ °ø°³Å°, CA°¡ ¸¸µç ¼­¸í µî¿¡ ´ëÇÑ + X.509 Á¤º¸°¡ ÀÖ´Ù. ³×Æ®¿÷ ½Çü´Â CA ÀÎÁõ¼­¸¦ »ç¿ëÇÏ¿© + ¼­¸íÀ» °Ë»çÇÑ´Ù.
    +Âü°í: SSL/TLS ¾Ïȣȭ
    + +
    ÀÎÁõ ¼­¸í ¿äû (Certificate +Signing Request, CSR)
    ÀÎÁõ±â°ü (Certification +Authority)¿¡ Á¦ÃâÇÏ¿© CA ÀÎÁõ¼­ (Certificate)ÀÇ +°³ÀÎŰ (Private Key)·Î ¼­¸íµÉ ¾ÆÁ÷ +¼­¸íµÇÁö¾ÊÀº ÀÎÁõ¼­. CSRÀÌ ¼­¸íµÇ¸é +½ÇÁ¦ ÀÎÁõ¼­°¡ µÈ´Ù.
    +Âü°í: SSL/TLS ¾Ïȣȭ
    + +
    ÀÎÁõ±â°ü (Certification +Authority, CA)
    ¾ÈÀüÇÑ ¹æ¹ýÀ¸·Î +³×Æ®¿÷ ½Çü¿¡ ´ëÇÑ ÀÎÁõÀ» ¼­¸íÇÏ´Â ½Å·ÚÇÏ´Â Á¦»ïÀÚ. ´Ù¸¥ ³×Æ®¿÷ +½ÇüµéÀº ¼­¸íÀ¸·Î CA°¡ ÀÎÁõ¼­ ¼ÒÀ¯ÀÚ¸¦ ÀÎÁõÇß´ÂÁö È®ÀÎÇÒ ¼ö +ÀÖ´Ù.
    +Âü°í: SSL/TLS ¾Ïȣȭ
    + +
    ¾ÏÈ£±â (Cipher)
    ÀڷḦ +¾ÏȣȭÇÏ´Â ¾Ë°í¸®ÁòÀ̳ª ½Ã½ºÅÛ. ¿¹¸¦ µé¾î, DES, IDEA, RC4 µîÀÌ ÀÖ´Ù.
    +Âü°í: SSL/TLS ¾Ïȣȭ
    + +
    ¾ÏÈ£¹® (Ciphertext)
    Æò¹® (Plaintext)À» ¾ÏÈ£±â +(Cipher)·Î ó¸®ÇÑ °á°ú.
    Âü°í: SSL/TLS +¾Ïȣȭ
    + +
    °øÅë °ÔÀÌÆ®¿þÀÌ ÀÎÅÍÆäÀ̽º +(Common Gateway Interface, CGI)
    +
    ¿ÜºÎ ÇÁ·Î±×·¥ÀÌ ¿äûÀ» ¼­ºñ½ºÇÒ ¼ö ÀÖµµ·Ï ¸¸µç À¥¼­¹ö¿Í ¿ÜºÎ +ÇÁ·Î±×·¥ »çÀÌÀÇ ÀÎÅÍÆäÀ̽º Ç¥ÁØ. ÀÎÅÍÆäÀ̽º´Â ¿ø·¡ NCSA°¡ +Á¤ÀÇÇßÁö¸¸, RFC +ÇÁ·ÎÁ§Æ®À̱⵵ ÇÏ´Ù.
    +Âü°í: CGI·Î µ¿Àû ÆäÀÌÁö »ý¼º
    + + +
    ¼³Á¤ Áö½Ã¾î (Configuration +Directive)
    +
    Âü°í: Áö½Ã¾î
    + +
    ¼³Á¤ÆÄÀÏ (Configuration File)
    +
    ¾ÆÆÄÄ¡¸¦ ¼³Á¤ÇÏ´Â Áö½Ã¾î (directive)¸¦ +Àû¾îµÐ ÅØ½ºÆ®ÆÄÀÏ.
    +Âü°í: ¼³Á¤ÆÄÀÏ
    + +
    CONNECT
    +
    HTTP¸¦ ÅëÇØ ÀÚ·áÈ帧À» ÇÁ·Ï½ÃÇÏ´Â HTTP ¸Þ½áµå +(method). SSL ÇÁ·ÎÅäÄÝ µî ´Ù¸¥ ÇÁ·ÎÅäÄÝÀ» °¨½Î±âÀ§ÇØ »ç¿ëÇÑ´Ù.
    + +
    »ç¿ëÀå¼Ò (Context)
    ¼³Á¤ÆÄÀÏ (configuration file)¿¡¼­ +ƯÁ¤ Áö½Ã¾î (directive)¸¦ »ç¿ëÇÒ ¼ö +ÀÖ´Â Àå¼Ò.
    Âü°í: ¾ÆÆÄÄ¡ Áö½Ã¾î¸¦ ¼³¸íÇϴµ¥ +»ç¿ëÇÑ ¿ë¾îÁ¤ÀÇ
    + +
    ÀüÀÚ¼­¸í (Digital Signature)
    +
    ÀÎÁõ¼­³ª ´Ù¸¥ ÆÄÀÏÀ» °Ë»çÇÏ´Â ¾ÏȣȭµÈ ¹®ÀÚµé. ÀÎÁõ±â°ü (Certification + Authority)Àº ÀÎÁõ¼­ (Certificate)¿¡ Æ÷ÇÔµÈ + °ø°³Å° (Public Key)¸¦ ÇØ½¬ÇÑ °á°ú¸¦ ÀÚ½ÅÀÇ + °³ÀÎŰ (Private Key)·Î ¾ÏȣȭÇÏ¿© ¼­¸íÀ» ¸¸µç´Ù. + ¿ÀÁ÷ CAÀÇ °ø°³Å°¸¸ÀÌ ¼­¸íÀ» Ç® ¼ö Àֱ⶧¹®¿¡, CA°¡ ÀÎÁõ¼­ + (Certificate)¸¦ °¡Áø ³×Æ®¿÷ ½Çü¸¦ ÀÎÁõÇßÀ½À» Áõ¸íÇÒ + ¼ö ÀÖ´Ù.
    +Âü°í: SSL/TLS ¾Ïȣȭ
    + +
    Áö½Ã¾î (Directive)
    ¾ÆÆÄÄ¡ÀÇ +¿©·¯ ±â´ÉÀ» Á¶ÀýÇÏ´Â ¼³Á¤ ¸í·É¾î. Áö½Ã¾î´Â ¼³Á¤ÆÄÀÏ (Configuration File)¿¡¼­ +»ç¿ëÇÑ´Ù.
    Âü°í: Áö½Ã¾î ¸ñ·Ï
    + +
    µ¿Àû°øÀ¯°´Ã¼ (Dynamic Shared +Object) (DSO)
    ¾ÆÆÄÄ¡ httpd +½ÇÇàÆÄÀϰú º°µµ·Î ÄÄÆÄÀÏÇÏ¿© ÇÊ¿äÇÒ¶§ ÀоîµéÀÏ ¼ö ÀÖ´Â ¸ðµâ (Module).
    +Âü°í: µ¿Àû°øÀ¯°´Ã¼ Áö¿ø
    + +
    ȯ°æº¯¼ö (Environment Variable) +(env-variable)
    +
    Á¤º¸¸¦ ÀúÀåÇϰí ÇÁ·Î±×·¥°£¿¡ Åë½ÅÀ» À§ÇØ ¿î¿µÃ¼Á¦ ½©ÀÌ °ü¸®ÇÏ´Â +º¯¼ö. ¾ÆÆÄÄ¡¿¡µµ ȯ°æº¯¼ö¶ó´Â ³»ºÎ º¯¼ö°¡ ÀÖÁö¸¸, ½© ȯ°æÀÌ +¾Æ´Ï¶ó ¾ÆÆÄÄ¡ ³»ºÎ¿¡ ÀúÀåµÈ´Ù.
    +Âü°í: ¾ÆÆÄÄ¡ÀÇ È¯°æº¯¼ö
    + +
    ¼öÃâ¿ë (Export-Crippled)
    +
    ¹Ì±¹ ¼öÃâ°ü¸®±ÔÁ¦(Export Administration Regulations, EAR)¸¦ + ÁؼöÇϱâÀ§ÇØ ¾ÏÈ£(¿Í º¸¾È)ÀÇ °­µµ¸¦ ³·Ãã. ¼öÃâ¿ë ¾Ïȣȭ + ¼ÒÇÁÆ®¿þ¾î´Â Ű Å©±â°¡ ÀÛ°Ô Á¦ÇѵǾî, ¾ÏÈ£¹® + (Ciphertext)À» ¹«½ÄÇÑ ¹æ¹ý(brute force)À¸·Î Ç® ¼ö ÀÖ´Ù.
    +Âü°í: SSL/TLS ¾Ïȣȭ (SSL/TLS Encryption)
    + +
    ÇÊÅÍ (Filter)
    +
    ¼­¹ö°¡ º¸³»°Å³ª ¹Þ´Â ÀڷḦ ó¸®ÇÏ´Â °úÁ¤. ÀÔ·ÂÇÊÅÍ´Â +Ŭ¶óÀÌ¾ðÆ®°¡ ¼­¹ö·Î º¸³»´Â ÀڷḦ ó¸®Çϰí, Ãâ·ÂÇÊÅÍ´Â ¼­¹ö°¡ +Ŭ¶óÀÌ¾ðÆ®¿¡°Ô º¸³¾ ¹®¼­¸¦ ó¸®ÇÑ´Ù. ¿¹¸¦ µé¾î, +INCLUDES Ãâ·ÂÇÊÅÍ´Â ¹®¼­ÀÇ Server +Side Includes¸¦ ó¸®ÇÑ´Ù.
    +Âü°í: ÇÊÅÍ
    + +
    ¿ÏÀüÇÑ µµ¸ÞÀθí +(Fully-Qualified Domain-Name) (FQDN)
    +
    IP ÁÖ¼Ò¿¡ ´ëÀÀÇÏ´Â, È£½ºÆ®¸í°ú µµ¸ÞÀθíÀ¸·Î ±¸¼ºµÈ ³×Æ®¿÷ +½ÇüÀÇ À¯ÀÏÇÑ À̸§. ¿¹¸¦ µé¾î, www°¡ È£½ºÆ®¸íÀ̰í +example.comÀÌ µµ¸ÞÀθíÀ϶§, +www.example.comÀº ¿ÏÀüÇÑ µµ¸ÞÀθíÀÌ´Ù.
    + +
    Çڵ鷯 (Handler)
    +
    ÆÄÀÏÀ» ¿äûÇÒ¶§ ¼öÇàÇÏ´Â ÀÛ¾÷¿¡ ´ëÇÑ ¾ÆÆÄÄ¡ ³»ºÎ Ç¥Çö. +ÀϹÝÀûÀ¸·Î ÆÄÀÏÀº ÆÄÀÏ Á¾·ù¿¡ µû¶ó ¾Ï¹¬ÀûÀÎ Çڵ鷯¸¦ °¡Áø´Ù. +º¸Åë ¸ðµç ÆÄÀÏÀº ¼­¹ö°¡ °£´ÜÈ÷ ¼­ºñ½ºÇÏÁö¸¸, ¾î¶² ÆÄÀÏ Á¾·ù´Â +µû·Î "󸮵ȴÙ(handled)". ¿¹¸¦ µé¾î, cgi-script +Çڵ鷯´Â CGI·Î ó¸®ÇÒ ÆÄÀÏÀ» ÁöÁ¤ÇÑ´Ù.
    +Âü°í: ¾ÆÆÄÄ¡¿¡¼­ Çڵ鷯 »ç¿ë
    + +
    Çì´õ (Header)
    +
    HTTP ¿äû°ú ÀÀ´ä¿¡¼­ ½ÇÁ¦ ³»¿ë ÀÌÀü¿¡ +º¸³»´Â ºÎºÐÀ¸·Î ³»¿ëÀ» ¼³¸íÇÏ´Â Á¤º¸°¡ ÀÖ´Ù.
    + +
    .htaccess
    À¥¹®¼­µé ¾È¿¡ ÀÖ´Â +¼³Á¤ÆÄÀÏ (configuration file)·Î, +¼³Á¤ Áö½Ã¾î (directive)¸¦ ÀÚ½ÅÀÌ À§Ä¡ÇÑ +µð·ºÅ丮¿Í ¸ðµç ÇÏÀ§µð·ºÅ丮¿¡ Àû¿ëÇÑ´Ù. À̸§°ú ´Þ¸® ÀÌ +ÆÄÀÏ¿¡¼­´Â ´Ü¼øÇÑ Á¢±ÙÁ¦¾î Áö½Ã¾î¿Ü¿¡ °ÅÀÇ ¸ðµç Á¾·ùÀÇ Áö½Ã¾î¸¦ +»ç¿ëÇÒ ¼ö ÀÖ´Ù.
    +Âü°í: ¼³Á¤ÆÄÀÏ
    + +
    httpd.conf
    +
    ¾ÆÆÄÄ¡ ÁÖ ¼³Á¤ÆÄÀÏ (configuration +file). ±âº»ÀûÀÎ À§Ä¡´Â +/usr/local/apache2/conf/httpd.confÀÌÁö¸¸, ½ÇÇàÇÒ¶§ +ȤÀº ÄÄÆÄÀ϶§ ¼³Á¤À¸·Î º¯°æÇÒ ¼ö ÀÖ´Ù.
    +Âü°í: ¼³Á¤ÆÄÀÏ
    + +
    HyperText Transfer +Protocol (HTTP)
    +
    ¿ùµå¿ÍÀ̵åÀ¥¿¡¼­ »ç¿ëÇϴ ǥÁØ Àü¼Û ÇÁ·ÎÅäÄÝ. ¾ÆÆÄÄ¡´Â +RFC 2616¿¡¼­ +Á¤ÀÇÇÑ HTTP/1.1À̶ó´Â ÇÁ·ÎÅäÄÝÀÇ 1.1 ¹öÀüÀ» ±¸ÇöÇÑ´Ù.
    + +
    HTTPS
    +
    ¿ùµåÈ­À̵åÀ¥ÀÇ Ç¥ÁØ ¾ÏÈ£Åë½Å ¹æ¹ý, HyperText Transfer + Protocol (Secure). »ç½Ç ¹Ø´Ü¿¡ SSLÀ» + »ç¿ëÇÑ HTTPÀÌ´Ù.
    +Âü°í: SSL/TLS ¾Ïȣȭ
    + +
    ¸Þ½áµå (Method)
    Ŭ¶óÀÌ¾ðÆ®°¡ +º¸³»´Â HTTP ¿äûÁÙÀÌ +ÀÚ¿ø¿¡ ¼öÇàÇϵµ·Ï Áö½ÃÇÑ Çൿ. HTTP ¸Þ½áµå¿¡´Â GET, +POST, PUT µîÀÌ ÀÖ´Ù.
    + +
    ¸Þ½ÃÁö ¿ä¾à (Message Digest)
    +
    ¸Þ½ÃÁö ³»¿ëÀÌ Àü¼ÛÁß º¯°æµÇÁö ¾Ê¾ÒÀ½À» Áõ¸íÇϱâÀ§ÇÑ + ¸Þ½ÃÁöÀÇ ÇØ½¬.
    +Âü°í: SSL/TLS ¾Ïȣȭ
    + +
    MIME-type
    Àü¼ÛÇÒ ¹®¼­ÀÇ +Á¾·ù¸¦ ¼³¸íÇÏ´Â ¹æ½Ä. Multipurpose Internet Mail Extensions +Çü½ÄÀ» ºô·Á¿Ô±â¶§¹®¿¡ ÀÌ·¸°Ô À̸§À» Áö¾ú´Ù. ½½·¡½¬¸¦ »çÀÌ¿¡ +µÐ major type°ú minor typeÀ¸·Î ÀÌ·ç¾îÁø´Ù. ¿¹¸¦ µé¸é, +text/html, image/gif, +application/octet-stream µîÀÌ´Ù. MIME-typeÀº HTTPÀÇ +Content-Type Çì´õ (header)·Î +Àü¼ÛÇÑ´Ù.
    Âü°í: mod_mime
    + +
    ¸ðµâ (Module)
    ÇÁ·Î±×·¥ÀÇ µ¶¸³µÈ +ºÎºÐ. ¸¹Àº ¾ÆÆÄÄ¡ ±â´ÉÀº ´ç½ÅÀÌ Æ÷ÇÔ¿©ºÎ¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Â ¸ðµâ¿¡ +µé¾îÀÖ´Ù. ¾ÆÆÄÄ¡ httpd ½ÇÇàÆÄÀϰú °°ÀÌ ÄÄÆÄÀÏÇÑ ¸ðµâÀ» Á¤Àû +¸ðµâÀ̶ó°í Çϸç, µû·Î ºÐ¸®µÇ¾î ½ÇÇà½Ã ¼±ÅÃÀûÀ¸·Î ÀоîµéÀÏ +¼ö ÀÖ´Â ¸ðµâÀ» µ¿Àû ¸ðµâ ȤÀº DSO¶ó°í +ÇÑ´Ù. ±âº»ÀûÀ¸·Î Æ÷ÇÔÇÏ´Â ¸ðµâÀ» base ¸ðµâÀ̶ó°í ÇÑ´Ù. +¾ÆÆÄÄ¡ À¥¼­¹ö Ÿº¼ (tarball)°ú °°ÀÌ +¹èÆ÷µÇÁö´Â ¾ÊÁö¸¸ ¾ÆÆÄÄ¡¿¡´Â ¸¹Àº ¸ðµâµéÀÌ ÀÖ´Ù. À̵éÀ» +Á¦»ïÀÚ°¡ ¸¸µç(third-party) ¸ðµâÀ̶ó°í ÇÑ´Ù.
    +Âü°í: ¸ðµâ ¸ñ·Ï
    + +
    ¸ðµâ ¸¶¹ý¼ö (Module Magic Number) +(MMN)
    +
    ¸ðµâ ¸¶¹ý¼ö´Â ¾ÆÆÄÄ¡ ¼Ò½ºÄڵ尡 Á¤ÀÇÇÑ »ó¼ö·Î, ¸ðµâÀÇ +ÀÌÁøÈ£È¯¼º°ú °ü·ÃÀÌ ÀÖ´Ù. ¸ðµâ ¸¶¹ý¼ö´Â ÀÌÁøÈ£È¯¼ºÀ» ´õ ÀÌ»ó º¸ÀåÇÒ +¼ö ¾øµµ·Ï ¾ÆÆÄÄ¡ ³»ºÎ ±¸Á¶³ª ÇÔ¼ö È£Ãâ, ´Ù¸¥ API ÀϺΰ¡ º¯°æµÈ +°æ¿ì¿¡ ¹Ù²ï´Ù. MMNÀÌ º¯Çϸé Á¦»ïÀÚ°¡ ¸¸µç ¸ðµâÀº ¸ðµÎ ÃÖ¼ÒÇÑ ´Ù½Ã +ÄÄÆÄÀÏµÇ¾ß ÇÑ´Ù. »õ ¾ÆÆÄÄ¡ ¹öÀü¿¡ ¸Âµµ·Ï Á¶±Ý ¼öÁ¤ÇؾßÇÒ °æ¿ìµµ +ÀÖ´Ù. +
    + +
    OpenSSL
    +
    SSL/TLS¸¦ À§ÇÑ ¿ÀǼҽº µµ±¸
    + Âü°í http://www.openssl.org/
    + +
    Pass Phrase
    +
    °³ÀÎŰ ÆÄÀÏÀ» º¸È£ÇÏ´Â ¹®±¸. ÀÎÁõÇÏÁö¾ÊÀº »ç¿ëÀÚ°¡ ÀÌ °³ÀÎŰ +ÆÄÀÏÀ» »ç¿ëÇÏ¿© ¾ÏȣȭÇÏÁö ¸øÇϵµ·Ï ÇÑ´Ù. º¸Åë ¾ÏÈ£±â +(Ciphers)°¡ »ç¿ëÇÏ´Â ºñ¹Ð½º·± ¾ÏÈ£/ÇØµ¶ ŰÀÌ´Ù.
    Âü°í: SSL/TLS ¾Ïȣȭ
    + +
    Æò¹® (Plaintext)
    +
    ¾ÏȣȭÇÏÁö ¾ÊÀº ±Û.
    + +
    °³ÀÎŰ (Private Key)
    ¹ÞÀº +ÀڷḦ ÇØµ¶ÇÏ°í º¸³»´Â ÀڷḦ ¼­¸íÇϱâÀ§ÇÑ °ø°³Å° ¾Ïȣȭ (Public Key +Cryptography) ½Ã½ºÅÛÀÇ ¾ÏȣŰ.
    +Âü°í: SSL/TLS ¾Ïȣȭ
    + +
    ÇÁ·Ï½Ã (Proxy)
    Ŭ¶óÀÌ¾ðÆ®¿Í +½ÇÁ¦ ¼­¹ö »çÀÌ¿¡ ÀÖ´Â Áß°£ ¼­¹ö. Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ¿äûÀ» +¹Þ¾Æ ½ÇÁ¦ ¼­¹ö·Î º¸³»°í, ½ÇÁ¦ ¼­¹ö¿¡°Ô¼­ ¹ÞÀº ÀÀ´äÀ» ´Ù½Ã +Ŭ¶óÀÌ¾ðÆ®¿¡°Ô º¸³½´Ù. ¿©·¯ Ŭ¶óÀÌ¾ðÆ®°¡ °°Àº ³»¿ëÀ» ¿äûÇϸé +ÇÁ·Ï½Ã´Â ¸Å¹ø ¼­¹ö¿¡ ¿äûÇÏÁö¾Ê°í ij½¬¿¡ ÀúÀåµÈ ³»¿ëÀ» »ç¿ëÇÏ¿© +ÀÀ´ä½Ã°£À» ÁÙÀÏ ¼ö ÀÖ´Ù.
    +Âü°í: mod_proxy
    + +
    °ø°³Å° (Public Key)
    °ø°³Å° ¾Ïȣȭ (Public Key +Cryptography) ½Ã½ºÅÛ¿¡¼­ ŰÀÇ ¼ÒÀ¯ÀÚ¿¡°Ô º¸³»´Â ¹®±¸¸¦ ¾ÏȣȭÇϰųª +¼ÒÀ¯ÀÚ°¡ ¸¸µç ¼­¸íÀ» Ç®±âÀ§ÇÑ °ø°³µÈ Ű.
    +Âü°í: SSL/TLS ¾Ïȣȭ
    + +
    °ø°³Å° ¾Ïȣȭ (Public Key +Cryptography)
    +
    ¾ÏÈ£¿Í ÇØµ¶¿¡ ¼­·Î ´Ù¸¥ ۸¦ »ç¿ëÇÏ´Â ºñ´ëĪ(asymmetric) +¾Ïȣȭ ½Ã½ºÅÛÀÇ ¿¬±¸ ¹× Ȱ¿ë. ¾ÏÈ£¿Í ÇØµ¶¿¡ »ç¿ëÇÏ´Â µÎ°³ÀÇ Å°´Â +Ű½Ö(key pair)À» ÀÌ·é´Ù. ºñ´ëĪ ¾Ïȣȭ¶ó°íµµ ºÎ¸¥´Ù.
    +Âü°í: SSL/TLS ¾Ïȣȭ
    + +
    Á¤±ÔÇ¥Çö½Ä (Regular Expression) (Regex)
    ±ÛÀÇ ÆÐÅÏÀ» ±â¼úÇÏ´Â ¹æ½Ä. +¿¹¸¦ µé¾î, "¹®ÀÚ A·Î ½ÃÀÛÇÏ´Â ¸ðµç ´Ü¾î", "¼ýÀÚ 10°³·ÎµÈ ÀüÈ­¹øÈ£", +½ÉÁö¾î "½°Ç¥°¡ µÎ°³ÀÖ°í ´ë¹®ÀÚ Q°¡ ¾ø´Â ¹®Àå" µîÀ» Ç¥ÇöÇÒ ¼ö ÀÖ´Ù. +Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÏ¸é ¸Å¿ì À¯¿¬ÇÏ°Ô ÆÄÀÏÀ̳ª ÀÚ¿ø¿¡ ¾î¶² ¼ºÁúÀ» Àû¿ëÇÒ +¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, "images"¶õ µð·ºÅ丮 ¾Æ·¡¿¡ ÀÖ´Â ¸ðµç .gif¿Í +.jpg ÆÄÀÏÀº "/images/.*(jpg|gif)$"·Î ÁöĪÇÒ ¼ö +ÀÖ´Ù. ¾ÆÆÄÄ¡´Â PCRE ¶óÀ̺귯¸®¸¦ +»ç¿ëÇÏ¿© Perlȣȯ Á¤±ÔÇ¥Çö½ÄÀ» Áö¿øÇÑ´Ù.
    + +
    ¿ªÇÁ·Ï½Ã (Reverse Proxy)
    +
    Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ½ÇÁ¦ ¼­¹öó·³ º¸ÀÌ´Â ÇÁ·Ï½Ã (proxy) ¼­¹ö. º¸¾È»ó ÀÌÀ¯ ȤÀº ºÎÇϸ¦ +ºÐ»êÇϱâÀ§ÇØ Å¬¶óÀÌ¾ðÆ®¿¡°Ô ½ÇÁ¦ ¼­¹ö¸¦ ¼û±æ¶§ À¯¿ëÇÏ´Ù.
    + +
    Secure Sockets Layer (SSL)
    Netscape Communications»ç°¡ TCP/IP +³×Æ®¿÷ÀÇ ÀϹÝÀûÀÎ Åë½Å ÀÎÁõ°ú ¾Ïȣȭ¸¦ À§ÇØ ¸¸µç ÇÁ·ÎÅäÄÝ. +°¡Àå ÀϹÝÀûÀÎ ¿ëµµ´Â HTTPS (HyperText Transfer Protocol +(HTTP) over SSL)ÀÌ´Ù.
    +Âü°í: SSL/TLS ¾Ïȣȭ
    + +
    Server Side Includes (SSI)
    HTML ÆÄÀÏ ¾È¿¡ ó¸®Áö½Ã¾î¸¦ Æ÷ÇÔÇÏ´Â +±â¼ú.
    Âü°í: Server Side Includes ¼Ò°³
    + +
    ¼¼¼Ç (Session)
    +
    ÀϹÝÀûÀ¸·Î Åë½ÅÀÇ »óȲ(context) Á¤º¸.
    + +
    SSLeay
    +
    Eric A. YoungÀÌ °³¹ßÇÑ ¿ø·¡ SSL/TLS ±¸Çö ¶óÀ̺귯¸®
    + +
    ´ëĪÀû ¾ÏÈ£¹ý (Symmetric +Cryptography)
    +
    ¾ÏÈ£¿Í ÇØµ¶ ÀÛ¾÷¿¡ °°Àº ¾Ïȣ۸¦ »ç¿ëÇÏ´Â ¾ÏÈ£±â + (Ciphers)ÀÇ ¿¬±¸ ¹× Ȱ¿ë.
    +Âü°í: SSL/TLS Encryption
    + +
    Ÿº¼ (Tarball)
    +
    tar µµ±¸¸¦ »ç¿ëÇÏ¿© ÆÄÀϵéÀ» ¸ðÀº ¹­À½. ¾ÆÆÄÄ¡´Â +tar ÆÄÀÏÀ» ¾ÐÃàÇϰųª pkzipÀ¸·Î ¾ÐÃàÇÏ¿© ¹èÆ÷µÈ´Ù.
    + +
    Transport Layer Security (TLS)
    +
    ÀÎÅͳݱâ¼ú °ü·Ã ±¹Á¦Ç¥ÁØÈ­±â±¸(Internet Engineering Task +Force, IETF)°¡ TCP/IP ³×Æ®¿÷ÀÇ ÀϹÝÀûÀÎ Åë½Å ÀÎÁõ°ú ¾Ïȣȭ¸¦ +À§ÇØ ¸¸µç SSLÀÇ ÈÄ¼Ó ÇÁ·ÎÅäÄÝ. TLS ¹öÀü 1Àº SSL ¹öÀü 3°ú °ÅÀÇ +À¯»çÇÏ´Ù.
    +Âü°í: SSL/TLS ¾Ïȣȭ
    + +
    Uniform Resource Locator +(URL)
    +
    ÀÎÅͳݿ¡ ÀÖ´Â ÀÚ¿øÀÇ À̸§/ÁÖ¼Ò. Á¤½ÄÀ¸·Î´Â Uniform Resource +Identifier¶ó°í ÇÏ´Â °ÍÀÇ ÀÏ»óÀûÀÎ ºñ°ø½Ä ¸íĪÀÌ´Ù. º¸Åë URLÀº +http³ª https°°Àº ½ºÅ´(scheme), È£½ºÆ®¸í, +°æ·Î·Î ±¸¼ºµÈ´Ù. ÀÌ ÆäÀÌÁöÀÇ URLÀº +http://httpd.apache.org/docs/2.4/glossary.htmlÀÌ´Ù.
    + +
    Uniform Resource Identifier +(URI)
    +
    Ãß»óÀûÀÎ ÀÚ¿øÀ̳ª ½ÇÁ¦ ÀÚ¿øÀ» ÁöĪÇϱâÀ§ÇÑ °£°áÇÑ ¹®ÀÚ¿­. +°ø½ÄÀûÀ¸·Î RFC +2396¿¡¼­ Á¤ÀÇÇÑ´Ù. ¿ùµå¿ÍÀ̵åÀ¥¿¡¼­ »ç¿ëÇÏ´Â URI¸¦ º¸Åë +URLÀ̶ó°í ºÎ¸¥´Ù.
    + +
    °¡»óÈ£½ºÆ® (Virtual Hosting)
    +
    ¾ÆÆÄÄ¡ Çϳª·Î ¿©·¯ À¥»çÀÌÆ®¸¦ ¼­ºñ½ºÇϱâ. IP °¡»óÈ£½ºÆ®´Â +À¥»çÀÌÆ®¸¶´Ù IP ÁÖ¼Ò°¡ ´Ù¸£´Ù. À̸§±â¹Ý(name-based) +°¡»óÈ£½ºÆ®´Â È£½ºÆ®¸í¸¸À» »ç¿ëÇϹǷΠÇÑ IP ÁÖ¼Ò¿¡¼­ ¿©·¯ +»çÀÌÆ®¸¦ ¼­ºñ½ºÇÒ ¼ö ÀÖ´Ù.
    +Âü°í: ¾ÆÆÄÄ¡ °¡»óÈ£½ºÆ® ¹®¼­
    + +
    X.509
    +
    ±¹Á¦Àü±âÅë½Å¿¬ÇÕ(International Telecommunication Union, +ITU-T)ÀÌ ±ÇÀåÇÏ´Â ÀÎÁõ¼­ ¾ç½Ä. SSL/TLS ÀÎÁõ¿¡¼­ »ç¿ëÇÑ´Ù.
    +Âü°í: SSL/TLS ¾Ïȣȭ
    +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  de  | + en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/glossary.html.tr.utf8 b/docs/manual/glossary.html.tr.utf8 new file mode 100644 index 0000000..a05e054 --- /dev/null +++ b/docs/manual/glossary.html.tr.utf8 @@ -0,0 +1,529 @@ + + + + + +Terim Sözlüğü - Apache HTTP Sunucusu Sürüm 2.4 + + + + + + + +
    <-
    +

    Terim Sözlüğü

    +
    +

    Mevcut Diller:  de  | + en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Bu sözlük, genelinde HTML sayfa sunumuna, özelinde Apache HTTP Sunucusuna + özgü ortak terminolojinin bir kısmını içerir. Her kavram ile ilgili daha + ayrıntılı bilgi bağlarla sağlanmıştır.

    +
    +
    top
    +
    +

    Tanımlar

    + +
    +
    Algoritma
    + +
    Bir sorunu sonlu sayıda adımda çözümlemek için uygulanan kurallar + kümesi veya anlam belirsizliği içermeyen bir formül. Şifreleme için + kullanılan algoritmalara şifre denir. +
    + +
    Aktarım Katmanı Güvenliği
    +
    İngilizcesi: Transport Layer Security (TLS)
    +
    TCP/IP ağları üzerinden genel iletişimin kimlik doğrulamalı ve şifreli + yapılabilmesi için SSL’nin ardılı olarak Genel Ağ Mühendisliği Görev Gücü + (IETF) tarafından oluşturulmuş protokol. TLS’nin 1. sürümü ile SSL’in 3. + sürümü hemen hemen aynıdır.
    + Bakınız: SSL/TLS Şifrelemesi +
    + +
    Alt istek
    +
    Diğer dosya sistemlerini veya URL yollarını kısmen veya tamamen + değerlendiren modüller için sunucuda bir alt istek API'si mevcuttur. Bu + API'nin olası müşterileri için + DirectoryIndex, + mod_autoindex ve mod_include örnek + verilebilir. +
    + +
    Anahtar Parolası
    +
    Özel anahtar dosyalarını yetkisiz kişilerden koruyan sözcük veya + cümle. Genellikle sadece şifreler + için kullanılan gizli şifreleme/şifre çözme anahtarını korur.
    + Bakınız: SSL/TLS Şifrelemesi +
    + +
    Apache Eklenti + Aracı (apxs)
    +
    İngilizcesi: APache eXtension Tool - apxs
    +
    Modül kaynak kodlarının devinen + paylaşımlı nesneler (DSO) halinde + derlenmesine ve Apache Sunucusu içinde kurulmasına yardım eden bir Perl + betiği.
    Daha ayrıntılı bilgi için apxs kılavuz + sayfasına bakınız. +
    + +
    Apache Taşınabilir Arayüzü (APR)
    +
    İngilizcesi: Apache Portable Runtime - APR
    +
    Sunucu ile işletim sistemi arasındaki temel arayüzleri oluşturan + kütüphaneler kümesine verilen ad. APR, Apache HTTP Sunucusuna paralel + bağımsız bir proje olarak geliştirilmektedir.
    + Bakınız: Apache Taşınabilir Arayüzü + Projesi +
    + +
    BaÄŸlam
    +
    Yapılandırma dosyalarında + sadece belli türdeki yönergelerin + bulunmasına izin verilen bir bölge.
    + Bakınız: Apache Yönergelerini + Açıklamak için Kullanılan Terimler +
    + +
    Bakışımlı Şifreleme Tekniği
    +
    Şifreleme ve şifre çözme için tek bir anahtarın kullanıldığı + bir şifreleme tekniği.
    + Bakınız: SSL/TLS Şifrelemesi +
    + +
    Başlık
    +
    Bir HTTP isteğinin parçası olarak, + gönderilen yanıtta asıl içerikten önce yer alan ve içerik hakkında + mecazlar içeren veri. +
    + +
    CONNECT
    +
    Ham veri kanallarını HTTP üzerinden yönlendirmek için kullanılan bir HTTP yöntemi. SSL protokolü gibi diğer protokolleri sarmalamakta kullanılabilir. +
    + +
    Devingen + Paylaşımlı Nesne (DSO)
    +
    İngilizcesi: Dynamic Shared Object (DSO)
    +
    İstek halinde yüklenebilen, Apache httpd + çalıştırılabilir dosyasından ayrı olarak derlenmiş modüllerin ortak adı.
    + Bakınız: Devingen Paylaşımlı Nesne Desteği +
    + +
    Düz Metin
    +
    ÅžifrelenmemiÅŸ metin.
    + +
    Düzenli İfade + (Regex)
    +
    Metin içinde bir şablon tanımlama yolu. Örneğin, “A harfi ile + başlayan bütün sözcükler†veya “10 rakamlı telefon numaraları†ya da + “Baş harfi Z olmayan ve iki virgül içeren cümleler†gibi. Düzenli + ifadeler, Apache’de belli özniteliklere uygun dosya veya özkaynakları + toplamak için esnek bir yol sağlamasından ötürü oldukça yararlıdır. + Örneğin, “resimler†dizini altındaki dosyalardan .gif ve .jpg uzantılı + olanları toplamak için “/resimler/.*(jpg|gif)$†düzenli + ifadesi yazılabilir. Dizgileri değiştirmek için düzenli ifadelerin + kullanıldığı yerlerde, eşleşen (parantezlerin içinde) gruplanmış + parçalara başvurmak için $1 ... $9 özel değişkenleri kullanılır. $0 özel + değişkeni eşleşen ifadenin tamamına karşılık gelir. Bir dizgi içinde $ + işaretini kendisi olarak kullanmak isterseniz önüne bir \ imi + koymalısınız. Geçmişe uyumluluk adına bazı yerlerde $0 yerine & + değişkeni kullanılabilir. Ancak 2.3.6 sürümünden beri bu artık mümkün + değildir. Apache, PCRE kütüphanesi ile + sağlanan Perl uyumlu düzenli ifadeleri kullanır. PCRE düzenli + ifadelerinin sözdizimi ile ilgili ayrıntılı bilgiyi Wikipedia'da bulabilirsiniz. +
    + +
    EriÅŸim Denetimi
    + +
    Ağ bölgelerine erişimin kısıtlanması. Apache bağlamında normal + olarak belli URL’lere erişimi kısıtlamak şeklinde + uygulanır.
    Bakınız: Kimlik Doğrulama, + Yetkilendirme ve Erişim Denetimi +
    + +
    Eylemci
    +
    Bir dosya istendiğinde uygulanacak eylemi Apache içinde gerçekleştiren + nesne. Genellikle dosyalar, dosya türüne bağlı dolaylı eylemcilere + sahiptir. Normalde tüm dosyalar sunucu tarafından sıradan birer dosya + olarak işleme sokulduğu halde bazı belli dosyalar diğerlerinden ayrı + ele alınır. Örneğin, cgi-script eylemcisi dosyaları + CGI’ler tarafından işlenebilir hale + getirmek üzere işleme sokar.
    + Bakınız: Apache Eylemcilerinin Kullanımı +
    + +
    Genel Anahtar
    +
    Genel Anahtarlı + Şifreleme Tekniğinde, sahibinin yaptığı imzaları çözmeye ve + sahibine gönderilen iletileri şifrelemeye yarayan genel erişime açık + anahtar.
    + Bakınız: SSL/TLS Şifrelemesi +
    + +
    Genel Anahtarlı Şifreleme Tekniği
    +
    Şifreleme ve şifre çözme için iki ayrı anahtarın kullanıldığı + bakışımsız şifreleme sistemlerinin konusu veya uygulaması. Bu amaçla + kullanılan anahtarlar bir anahtar çiftinden oluşur. Genel Anahtarlı + Şifrelemeye Bakışımsız Şifreleme de denir.
    + Bakınız: SSL/TLS Şifrelemesi +
    + +
    Gizli Anahtar
    +
    Genel Anahtarlı + Şifreleme Tekniğinde, giden iletileri imzalamak ve gelen + iletilerin şifrelerini çözmek amacıyla kullanılan gizli anahtar.
    + Bakınız: SSL/TLS Şifrelemesi +
    + +
    Güvenli Hiper Metin Aktarım Protokolü + (HTTPS)
    +
    İngilizcesi: The HyperText Transfer Protocol (Secure), (HTTPS)
    +
    Güvenli Hiper Metin Aktarım Protokolü, Genel Ağ’da kullanılan standart + şifreli iletişim mekanizmasıdır. Aslında HTTP protokolünün SSL üzerinden gerçekleştirilmesinden başka bir + şey değildir.
    + Bakınız: SSL/TLS Şifrelemesi +
    + +
    Güvenli Soket Katmanı
    +
    İngilizcesi: Secure Sockets Layer (SSL)
    +
    TCP/IP ağları üzerinden genel iletişimin kimlik doğrulamalı ve şifreli + yapılabilmesi için Netscape Communications Corporation tarafından + oluşturulmuş bir protokol. Günümüzde en çok HTTPS, yani SSL + üzerinden Hiper Metin Aktarım Protokolü şeklinde kullanılmaktadır.
    + Bakınız: SSL/TLS Şifrelemesi +
    + +
    Hiper Metin Aktarım Protokolü + (HTTP)
    +
    İngilizcesi: HyperText Transfer Protocol (HTTP)
    +
    Genel Ağ’da kullanılan standart aktarım protokollerinden biri. + Apache, RFC 2616 ile + tanımlanmış protokolün HTTP/1.1 olarak bilinen 1.1 sürümünü gerçekler. +
    + +
    .htaccess
    +
    Belge dosyaları ağacı içine yerleştirilen bir yapılandırma dosyası olup yerleştiği + dizine ve o dizinin alt dizinlerine yapılandırma yönergeleri + uygulanmasını sağlar. İsmine rağmen böyle bir dosyanın içerebileceği + yönergeler erişim denetleme yönergeleri ile sınırlı değildir; hemen + her tür yönergeyi içerebilir.
    + Bakınız: Yapılandırma Dosyaları +
    + +
    httpd.conf
    +
    Ana Apache yapılandırma + dosyası. Dosya sistemindeki öntanımlı yeri + /usr/local/apache2/conf/httpd.conf olup derleme + sırasındaki yapılandırmayla veya çalışma anındaki yapılandırmayla + başka bir yer belirtilebilir.
    + Bakınız: Yapılandırma Dosyaları +
    + +
    İhracat Engelli
    +
    İngilizcesi: Export-Crippled
    +
    Amerika Birleşik Devletlerinin İhracat Yönetim Düzenlemelerine (EAR) + uymak için şifreleme yoluyla sakatlanmış yazılım. İhracat engelli olması + için şifrelenmiş yazılımları birer şifreli metin haline getiren şifre + anahtarları küçük boyutlu olduğundan şifreleme zor + kullanılarak kırılabilir.
    + Bakınız: SSL/TLS Şifrelemesi +
    + +
    İleti Özeti
    +
    İngilizcesi: Message Digest
    +
    Aktarım sırasında içeriğinin değişme olasılığı bulunan bir iletinin + içeriğini doğrulamak için kullanılan bir özet.
    + Bakınız: SSL/TLS Şifrelemesi +
    + +
    Karşı Vekil
    +
    İstemciye kendini asıl sunucu imiş gibi gösteren bir + vekil sunucu. Güvenlik, yük dengelemesi + gibi sebeplerle asıl sunucuyu istemcilerden gizlemek için yararlıdır. +
    + +
    Kimlik DoÄŸrulama
    +
    Sunucu, istemci veya kullanıcı gibi bir ağ öğesinin kimliğinin + olumlanması.
    Bakınız: Kimlik Doğrulama, + Yetkilendirme ve Erişim Denetimi +
    + +
    MIME türü
    +
    Aktarılan belgenin çeşidini betimlemenin bir yolu. MIME, Türkçe’ye + ‘Çok Amaçlı Genel Ağ Posta Eklentileri’ olarak çevrilebilecek olan + "Multipurpose Internet Mail Extensions" sözcüklerinden türetilmiş bir + kısaltmadır. MIME türleri bir bölü çizgisi ile ayrılmış bir ana ve bir + alt belge türünün birleşiminden oluşur. text/html, + image/gif ve application/octet-stream örnek + olarak verilebilir. HTTP protokolünde MIME türleri + Content-Type başlığında + aktarılır.
    Bakınız: mod_mime +
    + +
    Modül
    +
    Bir programın bağımsız parçalarından her biri. Apache işlevselliğinin + çoğu yapılandırmaya dahil edilip edilmeyeceğine kullanıcı tarafından + karar verilebilen modüllerden oluşur. Apache httpd + çalıştırılabiliri içinde derlenmiş modüllere durağan modüller + adı verilirken ayrı bir yerde saklanan ve çalışma anında isteğe bağlı + olarak yüklenebilen modüllere devingen modüller veya + DSO’lar denir. Yapılandırmaya öntanımlı + olarak dahil edilen modüllere temel modüller denir. Apache + için kullanılabilecek modüllerin çoğu Apache HTTP Sunucusunun + tar paketi içinde dağıtılmaz; bunlara + üçüncü parti modüller denir.
    + Bakınız: Modül Dizini +
    + +
    OpenSSL
    +
    SSL/TLS için açık kaynak kodlu araç kiti.
    Daha ayrıntılı bilgi + için http://www.openssl.org/ + adresine bakınız. +
    + +
    Ortak Ağgeçidi Arayüzü (CGI)
    +
    İngilizcesi: Common Gateway Interface (CGI)
    +
    Bir HTTP sunucusunun bir harici programa hizmet istekleri yapmasını + mümkün kılan, sunucu ile bir harici program arasındaki bir arayüz + standardı. Özellikleri kapsayan bir + Bilgilendirici RFC + vardır.
    + Bakınız: CGI ile Devingen İçerik +
    + +
    Ortam DeÄŸiÅŸkeni (ortam-deÄŸiÅŸkeni)
    +
    İşletim sistemi kabuğu tarafından yönetilen ve programlar arasında + bilgi alışverişi amacıyla kullanılan isimli değişkenler. Ayrıca, + Apache de ortam değişkenleri olarak tanımlanabilecek dahili değişkenler + içerir fakat bunlar kabuk ortamında değil dahili Apache yapıları içinde + saklanır.
    + Bakınız: Apache Ortam Değişkenleri +
    + +
    Oturum
    +
    Bir iletiÅŸimin baÄŸlamsal bilgileri.
    + +
    Özet
    +
    Uzunluğu değişebilen bir dizgenin belli bir durumuna ilişkin sabit + uzunlukta bir dizge üretmek için kullanılan geri dönüşümsüz bir + algoritma. Algoritmaya girdi olan farklı uzunluktaki dizgeler (özet + işlevine bağlı olarak) aynı uzunlukta farklı özetler üretir. +
    + +
    Sanal Konaklık
    +
    Tek bir Apache sunucusundan çok sayıda site sunulması. IP tabanlı + sanal konaklıkta siteler birbirlerinden IP adreslerine göre + ayrılırken, isim tabanlı sanal konaklıkta siteler aynı IP + adresinden kendi isimleriyle sunulabilirler.
    + Bakınız: Apache Sanal Konak Belgeleri +
    + +
    Sayısal İmza
    +
    Bir sertifikayı veya bir dosyayı doğrulamakta kullanılan şifreli bir + metin. Bir imza Sertifika + Makamı tarafından bir sertifikaya gömülü olan + genel anahtardan bir özet üretilerek oluşturulur. İmza şifresi + sadece sertifika sahibi ağ öğesinin kimliğini doğrulayacak + SM’nin genel anahtarı kullanılarak çözülebilir.
    + Bakınız: SSL/TLS Şifrelemesi +
    + +
    Sertifika
    +
    Sunucu, istemci gibi ağ öğelerinin kimliğini kanıtlamakta kullanılan + bir veri kaydı. Bir sertifika, sertifika sahibi (buna sertifikanın + konusu da denir), sertifikayı imzalayan Sertifika Makamı (SM) (buna + sertifika yayıncısı da denir), sertifika sahibinin genel anahtarı ve SM tarafından üretilen imza + gibi parçalardan oluşan X.509 bilgisi içerir. Ağ öğeleri bu imzaları SM + sertifikalarını kullanarak doğrular.
    + Bakınız: SSL/TLS Şifrelemesi +
    + +
    Sertifika İmzalama İsteği (Sİİ)
    +
    İngilizcesi: Certificate Signing Request (CSR)
    +
    İmzasız bir sertifikayı Sertifika Makamına kendi SM Sertifikasının + özel anahtarı ile imzalaması + için yapılan istek. Sİİ imzalanınca bir gerçek sertifika haline + gelir.
    Bakınız: SSL/TLS Şifrelemesi +
    + +
    Sertifika Makamı (SM)
    +
    İngilizcesi: Certification Authority (CA)
    +
    Ağ öğelerinin güvenilir olarak kimliklerinin doğrulanması için + sertifikaları imzalayan güvenilir üçüncü şahıs. Diğer ağ öğeleri, + sertifikalı bir öğenin kimliğini kanıtlayan bir SM’yi doğrulamak + için imzayı sınayabilir.
    + Bakınız: SSL/TLS Şifrelemesi +
    + +
    Sihirli Modül + Numarası (SMN)
    +
    Sihirli Modül Numarası, modüllerin ikil uyumluluğu ile ilgili olarak + Apache kaynak kodunda tanımlanmış bir sabittir. Apache dahili yapıları, + uygulama programlama arayüzünün önemli parçaları ve işlev çağrıları artık + ikil uyumluluğun garanti edilemeyeceği kadar değiştiği zaman SMN + değiştirilir. Bir SMN değişikliğinde ve bazen de sırf yeni bir Apache + sürümü ile çalışmak icabettiğinde tüm üçüncü parti modüllerin en azından + yeniden derlenmesi gerekir. +
    + +
    SSLeay
    +
    Eric A. Young tarafından geliştirilmiş özgün SSL/TLS + gerçeklenim kütüphanesi. +
    + +
    Sunucu Adı + Belirtimi
    +
    İngilizcesi: Server Name Indication (SNI)
    +
    İlk SSL uzlaşımı sırasında istenen sunucu isminin aktarılmasını + mümkün kılan bir SSL işlevidir. Böylece sunucunun, SSL uzlaşım + işlemlerlerinde kullanılacak sanal konak yapılandırmasını doğru + bir şekilde seçebilmesi sağlanmıştır. Bu özellik RFC 3546'da TLS + eklentili SSL başlatma bölümüne eklenmiştir.
    + Bakınız: SSL SSS + ve RFC 3546 +
    + +
    Sunucu Taraflı İçerik Yerleştirme
    +
    İngilizcesi: Server Side Includes (SSI)
    +
    İşlem yönergelerini HTML dosyalara gömme tekniği.
    + Bakınız: Sunucu Taraflı İçerik Yerleştirmeye + Giriş +
    + +
    Süzgeç
    +
    Sunucu tarafından alınan ve gönderilen veriye uygulanan bir işlem. + Giriş süzgeçleri sunucuya istemci tarafından gönderilen veriyi işlerken + çıkış süzgeçleri sunucu tarafından istemciye gönderilen belgeleri işler. + Örneğin, INCLUDES çıkış süzgeci, belgeleri sunucu taraflı içerik için işleme sokar.
    + Bakınız: Süzgeçler +
    + +
    Åžifre
    +
    Veri şifrelemek için kullanılan bir algoritma veya sistem. DES, IDEA + veya RC4 örnek verilebilir.
    + Bakınız: SSL/TLS Şifrelemesi +
    + +
    Åžifreli Metin
    +
    Bir Düz Metin bir + Şifreden geçirilince elde edilen + sonuç.
    Bakınız: SSL/TLS Şifrelemesi +
    + +
    Tam Alan Adı + (TAA)
    +
    İngilizcesi: Fully-Qualified Domain-Name (FQDN)
    +
    Bir IP adresiyle eşleşebilen, bir konak adıyla bir alan adının + birleşiminden oluşan eşsiz bir ağ öğesi ismi. Örneğin, + httpd.apache.org tam alan adında httpd bir konak + adıyken apache.org bir alan adıdır. +
    + +
    Tar Paketi
    +
    tar uygulaması kullanılarak bir araya getirilmiş + dosyalardan oluşan bir paket. Apache dağıtımları sıkıştırılmış tar + arşivleri içinde veya pkzip kullanılarak saklanır. +
    + +
    Tektip Özkaynak Betimleyici
    +
    İngilizcesi: Uniform Resource Identifier + (URI)
    +
    Soyut veya somut bir özkaynağı betimlemek için kullanılan bütünleşik + bir karakter dizisi. Aslen RFC 2396 tarafından tanımlanmıştır. Genel Ağ’da kullanılan URI’lerden + genellikle URL’ler olarak bahsedilir. +
    + +
    Tektip Özkaynak Konumlayıcı
    +
    İngilizcesi: Uniform Resource Locator (URL)
    +
    Genel Ağ üzerindeki bir özkaynağın ismi veya adresi. Aslen Tektip Özkaynak Betimleyici + denilen terimin gayrı resmi karşılığıdır. URL’ler http veya + https gibi bir şemayı takip eden bir konak adı ve bir dosya + yolundan oluşurlar. Örneğin, bu sayfanın URL’si + http://httpd.apache.org/docs/2.4/glossary.html olurdu. +
    + +
    Vekil
    +
    Asıl sunucu ile istemci arasında aracılık yapan sunucu. + İstemciden aldığı istekleri asıl sunucuya gönderip, ondan aldığı + yanıtları istemciye gönderir. Aynı içeriğe birden fazla istemci talip + olursa vekil sunucu bu istekleri her seferinde asıl sunucudan istemek + yerine kendi deposundan karşılar, böylece yanıt zamanı kısalır.
    + Bakınız: mod_proxy +
    + +
    Yapılandırma Dosyası
    +
    Apache yapılandırmasını denetim altına alan yönergeleri içeren bir metin dosyası.
    + Bakınız: Yapılandırma Dosyaları +
    + +
    Yapılandırma Yönergesi
    +
    Bakınız: Yönerge
    + +
    Yönerge
    +
    Belli Apache davranışlarından bir veya daha fazlasını denetim altına + alan bir yapılandırma komutu. Yönergeler yapılandırma dosyalarına yerleştirilir.
    + Bakınız: Yönerge Dizini +
    + +
    Yöntem
    +
    HTTP bağlamında, istemci tarafından + istek satırında belirtilen, bir özkaynağa uygulanacak bir eylem. HTTP + bağlamında belirtilebilecek yöntemlere örnek olarak GET, + POST ve PUT verilebilir. +
    + +
    X.509
    +
    SSL/TLS kimlik doğrulamasında kullanılmak üzere Uluslararası Telekom + Birliği (ITU-T) tarafından önerilmiş bir kimlik doğrulama sertitifası + şeması
    Bakınız: SSL/TLS Şifrelemesi +
    +
    +
    +
    +

    Mevcut Diller:  de  | + en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Yorumlar

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/handler.html b/docs/manual/handler.html new file mode 100644 index 0000000..d6db324 --- /dev/null +++ b/docs/manual/handler.html @@ -0,0 +1,29 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: handler.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: handler.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: handler.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: handler.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: handler.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: handler.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 + +URI: handler.html.zh-cn.utf8 +Content-Language: zh-cn +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/handler.html.en b/docs/manual/handler.html.en new file mode 100644 index 0000000..c02bc81 --- /dev/null +++ b/docs/manual/handler.html.en @@ -0,0 +1,182 @@ + + + + + +Apache's Handler Use - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Apache's Handler Use

    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko  | + tr  | + zh-cn 

    +
    + +

    This document describes the use of Apache's Handlers.

    +
    + +
    top
    +
    +

    What is a Handler

    + + + + +

    A "handler" is an internal Apache representation of the + action to be performed when a file is called. Generally, files + have implicit handlers, based on the file type. Normally, all + files are simply served by the server, but certain file types + are "handled" separately.

    + +

    Handlers may also be configured explicitly, + based on either filename extensions or on location, + without relation to file type. This is + advantageous both because it is a more elegant solution, and + because it also allows for both a type and a + handler to be associated with a file. (See also Files with Multiple + Extensions.)

    + +

    Handlers can either be built into the server or included in + a module, or they can be added with the Action directive. The + built-in handlers in the standard distribution are as + follows:

    + +
      +
    • default-handler: Send the file using the + default_handler(), which is the handler used by + default to handle static content. (core)
    • + +
    • send-as-is: Send file with HTTP headers + as is. (mod_asis)
    • + +
    • cgi-script: Treat the file as a CGI + script. (mod_cgi)
    • + +
    • imap-file: Parse as an imagemap rule + file. (mod_imagemap)
    • + +
    • server-info: Get the server's + configuration information. (mod_info)
    • + +
    • server-status: Get the server's status + report. (mod_status)
    • + +
    • type-map: Parse as a type map file for + content negotiation. (mod_negotiation)
    • +
    +
    top
    +
    +

    Examples

    + + +

    Modifying static content using a CGI script

    + + +

    The following directives will cause requests for files with + the html extension to trigger the launch of the + footer.pl CGI script.

    + +
    Action add-footer /cgi-bin/footer.pl
    +AddHandler add-footer .html
    + + +

    Then the CGI script is responsible for sending the + originally requested document (pointed to by the + PATH_TRANSLATED environment variable) and making + whatever modifications or additions are desired.

    + + +

    Files with HTTP headers

    + + +

    The following directives will enable the + send-as-is handler, which is used for files which + contain their own HTTP headers. All files in the + /web/htdocs/asis/ directory will be processed by + the send-as-is handler, regardless of their + filename extensions.

    + +
    <Directory "/web/htdocs/asis">
    +    SetHandler send-as-is
    +</Directory>
    + + + +
    top
    +
    +

    Programmer's Note

    + + +

    In order to implement the handler features, an addition has + been made to the Apache API that + you may wish to make use of. Specifically, a new record has + been added to the request_rec structure:

    + +
    char *handler
    + + +

    If you wish to have your module engage a handler, you need + only to set r->handler to the name of the + handler at any time prior to the invoke_handler + stage of the request. Handlers are implemented as they were + before, albeit using the handler name instead of a content + type. While it is not necessary, the naming convention for + handlers is to use a dash-separated word, with no slashes, so + as to not invade the media type name-space.

    +
    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko  | + tr  | + zh-cn 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/handler.html.es b/docs/manual/handler.html.es new file mode 100644 index 0000000..6515cca --- /dev/null +++ b/docs/manual/handler.html.es @@ -0,0 +1,195 @@ + + + + + +Uso de los Handlers en Apache - Servidor HTTP Apache Versión 2.4 + + + + + + + +
    <-
    +

    Uso de los Handlers en Apache

    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr  | + zh-cn 

    +
    + +

    Este documento describe el uso de los Handlers en Apache.

    +
    + +
    top
    +
    +

    ¿Qué es un Handler?

    + + + + +

    Un "handler" es una representación interna de Apache de + una acción que se va a ejecutar cuando hay una llamada a un + fichero. Generalmente, los ficheros tienen handlers + implícitos, basados en el tipo de fichero de que se + trata. Normalmente, todos los ficheros son simplemente servidos + por el servidor, pero algunos tipos de ficheros se tratan de forma + diferente.

    + +

    Handlers pueden ser usados de manera explicita, + basándose en la extensión del fichero o en + la ubicación en la que esté, se pueden especificar handlers + sin tener en cuenta el tipo de fichero que se trate. Esto es + una ventaja por dos razones. Primero, es una solución + más elegante. Segundo, porque a un fichero se le pueden + asignar tanto un tipo como un handler. (Consulte + también la sección Ficheros y extensiones + múltiples.)

    + +

    Los Handlers pueden tanto ser compilados con el servidor + como incluidos en un módulo, o añadidos con la + directiva Action. Los + handlers que vienen incluidos en el core con el servidor de la distribución + estándar de Apache son:

    + +
      +
    • default-handler: Envía el fichero + usando el default_handler(), que es el handler + usado por defecto para tratar contenido + estático. (core)
    • + +
    • send-as-is: Envía el fichero con + cabeceras HTTP tal y como es. (mod_asis)
    • + +
    • cgi-script: Trata el fichero como un sript + CGI. (mod_cgi)
    • + +
    • imap-file: Trata el fichero como un mapa de + imágenes. (mod_imagemap)
    • + +
    • server-info: Extrae la información de + configuración del + servidor. (mod_info)
    • + +
    • server-status: Extrae el informe del estado + del servidor. (mod_status)
    • + +
    • type-map: Trata el fichero como una + correspondencia de tipos para la negociación de contenidos. + (mod_negotiation)
    • +
    +
    top
    +
    +

    Ejemplos

    + + +

    Modificar contenido estático usando un script + CGI

    + + +

    Las siguientes directivas hacen que cuando haya una + petición de ficheros con la extensión + html se lance el script CGI + footer.pl.

    + +

    + Action add-footer /cgi-bin/footer.pl
    + AddHandler add-footer .html +

    + +

    En este caso, el script CGI es el responsable de enviar el + documento originalmente solicitado (contenido en la variable de + entorno PATH_TRANSLATED) y de hacer cualquier + modificación o añadido deseado.

    + + +

    Archivos con cabeceras HTTP

    + + +

    Las siguientes directivas activan el handler + send-as-is, que se usa para ficheros que contienen + sus propias cabeceras HTTP. Todos los archivos en el directorio + /web/htdocs/asis/ serán procesados por el + handler send-as-is, sin tener en cuenta su + extension.

    + +
    <Directory "/web/htdocs/asis">
    +    SetHandler send-as-is
    +</Directory>
    + + + +
    top
    +
    +

    Nota para programadores

    + + +

    Para implementar las funcionalidades de los handlers, se ha + hecho un añadido a la API de + Apache que puede que quiera usar. Para ser más + específicos, se ha añadido un nuevo registro a la + estructura request_rec:

    + +
    char *handler
    + + +

    Si quiere que su módulo llame a un handler , solo tiene + que añadir r->handler al nombre del handler + en cualquier momento antes de la fase invoke_handler + de la petición. Los handlers se implementan siempre como se + hacía antes, aunque usando el nombre del handler en vez de un + tipo de contenido. Aunque no es de obligado cumplimiento, la + convención de nombres para los handlers es que se usen + palabras separadas por guiones, sin barras, de manera que no se + invada el media type name-space.

    +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr  | + zh-cn 

    +
    top

    Comentarios

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/handler.html.fr.utf8 b/docs/manual/handler.html.fr.utf8 new file mode 100644 index 0000000..2f2ab2f --- /dev/null +++ b/docs/manual/handler.html.fr.utf8 @@ -0,0 +1,188 @@ + + + + + +Utilisation des gestionnaires d'Apache (handlers) - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Utilisation des gestionnaires d'Apache (handlers)

    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr  | + zh-cn 

    +
    + +

    Ce document décrit l'utilisation des gestionnaires d'Apache (handlers).

    +
    + +
    top
    +
    +

    Qu'est-ce qu'un gestionnaire ?

    + + + + +

    Un "gestionnaire" est une représentation interne à Apache de l'action + qui doit être entreprise quand un fichier est appelé. En général, les + fichiers ont des gestionnaires implicites, basés sur le type du fichier. + Normalement, tous les fichiers sont traités simplement par le serveur, + mais certains types de fichiers sont "gérés" séparément.

    + +

    Les gestionnaires peuvent aussi être configurés explicitement, + soit en fonction des extensions des noms de fichier, soit en fonction + du chemin du fichier, + sans faire référence au type de fichier. Ceci a le double avantage d'être + une solution plus élégante, et aussi d'autoriser à associer à la fois + un type et un gestionnaire avec un fichier. (Voir aussi Fichiers avec extensions + multiples.)

    + +

    Les gestionnaires peuvent être soit partie intégrante + du serveur ou inclus dans un module, soit ajoutés à l'aide de la directive + Action. Les gestionnaires + intégrés dans la distribution standard se présentent comme suit :

    + +
      +
    • default-handler: envoie le fichier en utilisant + le default_handler(), qui est le gestionnaire utilisé par + défaut pour traiter les contenus statiques. (core)
    • + +
    • send-as-is: envoie les fichiers avec en-têtes HTTP + tels quels. (mod_asis)
    • + +
    • cgi-script: traite le fichier comme un + script CGI. (mod_cgi)
    • + +
    • imap-file: Traite le fichier comme un ensemble + de règles de descriptions d'images (imagemap). + (mod_imagemap)
    • + +
    • server-info: Extrait des informations sur la + configuration du serveur. (mod_info)
    • + +
    • server-status: Rédige un rapport sur le statut + du serveur. (mod_status)
    • + +
    • type-map: Traite le fichier comme une description + de type pour la négociation du contenu. + (mod_negotiation)
    • +
    +
    top
    +
    +

    Exemples

    + + +

    Modification d'un contenu statique à l'aide d'un script CGI

    + + +

    Les directives suivantes vont faire en sorte que les requêtes pour + des fichiers possédant une extension html déclenchent + l'exécution du script CGI footer.pl.

    + +
    Action add-footer /cgi-bin/footer.pl
    +AddHandler add-footer .html
    + + +

    À ce moment-là, le script CGI se charge d'envoyer le document + initialement demandé (référencé par la variable d'environnement + PATH_TRANSLATED) et d'effectuer tous ajout ou modification + voulus.

    + + +

    Fichiers avec en-têtes HTTP

    + + +

    Les directives suivantes vont activer le gestionnaire + send-as-is, qui est utilisé pour les fichiers qui possèdent + leurs propres en-têtes HTTP. Tous les fichiers situés dans le répertoire + /web/htdocs/asis/ seront traités par le gestionnaire + send-as-is, sans tenir compte de l'extension + de leur nom de fichier.

    + +
    <Directory "/web/htdocs/asis">
    +    SetHandler send-as-is
    +</Directory>
    + + + +
    top
    +
    +

    Note du développeur

    + + +

    Pour implémenter la fonctionnalité des gestionnaires, l' + API Apache a fait l'objet d'un ajout + que vous pourriez être amené à utiliser. + + Plus précisément, un nouvel enregistrement a été ajouté à la structure + request_rec :

    + +
    char *handler
    + + +

    Si vous voulez que votre module déclenche l'utilisation d'un + gestionnaire, il vous suffit de définir r->handler avec + le nom du gestionnaire à n'importe quel moment avant l'étape + invoke_handler + de la requête. Les gestionnaires sont implémentés comme auparavant, + quoique l'on utilise le nom du gestionnaire à la place d'un type + de contenu. Bien que ce ne soit pas obligatoire, la convention de nommage + des gestionnaires stipule l'utilisation d'un mot composé séparé par des + tirets, sans slashes, afin de ne pas interférer avec l'espace de nommage + des types de média.

    +
    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr  | + zh-cn 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/handler.html.ja.utf8 b/docs/manual/handler.html.ja.utf8 new file mode 100644 index 0000000..229d686 --- /dev/null +++ b/docs/manual/handler.html.ja.utf8 @@ -0,0 +1,189 @@ + + + + + +Apache ã®ãƒãƒ³ãƒ‰ãƒ©ã®ä½¿ç”¨ - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    Apache ã®ãƒãƒ³ãƒ‰ãƒ©ã®ä½¿ç”¨

    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko  | + tr  | + zh-cn 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + +

    Apache ã®ãƒãƒ³ãƒ‰ãƒ©ã®ä½¿ç”¨ã«é–¢ã—ã¦è¨˜è¿°ã—ã¦ã„ã¾ã™ã€‚

    +
    + +
    top
    +
    +

    ãƒãƒ³ãƒ‰ãƒ©ã¨ã¯

    + + + + +

    「ãƒãƒ³ãƒ‰ãƒ©ã€ã¨ã¯ã€ãƒ•ァイルãŒå‘¼ã°ã‚ŒãŸã¨ãã«å®Ÿè¡Œã•れる動作㮠+ Apache ã«ãŠã‘る内部表ç¾ã§ã™ã€‚ + 通常ã€ãƒ•ァイルã¯ãƒ•ァイルタイプ(訳注: MIME-type)ã«åŸºã¥ã„ãŸæš—é»™ã®ãƒãƒ³ãƒ‰ãƒ©ãŒã‚りã¾ã™ã€‚ + 普通ã¯ã™ã¹ã¦ã®ãƒ•ァイルã¯å˜ã«ã‚µãƒ¼ãƒã«æ‰±ã‚れã¾ã™ãŒã€ + ファイルタイプã®ä¸­ã«ã¯åˆ¥ã«ã€Œãƒãƒ³ãƒ‰ãƒ«ã€(訳注: 扱ã†) + ã•れるもã®ã‚‚ã‚りã¾ã™ã€‚

    + +

    ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‹¡å¼µå­ã‚„ç½®ã„ã¦ã„る場所ã«åŸºã¥ã„ã¦ãƒ•ァイルタイプã¨é–¢ä¿‚ãªã〠+ ãƒãƒ³ãƒ‰ãƒ©ã‚’明示的ã«è¨­å®šã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + ã“れã¯ã‚ˆã‚Šå„ªé›…ãªè§£æ±ºæ³•ã¨ã„ã†ç‚¹ã¨ã€ãƒ•ァイルã«ã‚¿ã‚¤ãƒ—ã¨ãƒãƒ³ãƒ‰ãƒ©ã®ä¸¡æ–¹ã‚’関連付ã‘ã‚‹ã“ã¨ãŒã§ãã‚‹ã¨ã„ã†ç‚¹ã§å„ªã‚Œã¦ã„ã¾ã™ã€‚ + (è¤‡æ•°ã®æ‹¡å¼µå­ã®ã‚るファイルもå‚ç…§ã—ã¦ãã ã•ã„)。

    + +

    ãƒãƒ³ãƒ‰ãƒ©ã¯ã‚µãƒ¼ãƒã«çµ„ã¿è¾¼ã‚“ã ã‚Šã€ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¨ã—ã¦å«ã‚ãŸã‚Šã€ + Action + ディレクティブã¨ã—ã¦è¿½åŠ ã—ãŸã‚Šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ä»¥ä¸‹ã¯æ¨™æº–é…布ã«çµ„ã¿è¾¼ã¾ã‚Œã¦ã„ã‚‹ãƒãƒ³ãƒ‰ãƒ©ã§ã™ã€‚ +

    + +
      +
    • default-handler:default_handelr() + を使ã£ã¦ãƒ•ァイルをé€ã‚Šã¾ã™ã€‚ + é™çš„ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„を扱ã†ã¨ãã«ãƒ‡ãƒ•ォルトã§ä½¿ç”¨ã•れるãƒãƒ³ãƒ‰ãƒ©ã§ã™ã€‚ + (core)
    • + +
    • send-as-is: + HTTP ヘッダã®ã‚るファイルをãã®ã¾ã¾é€ã‚Šã¾ã™ã€‚ + (mod_asis)
    • + +
    • cgi-script: ファイルを CGI + スクリプトã¨ã—ã¦æ‰±ã„ã¾ã™ã€‚ + (mod_cgi)
    • + +
    • imap-file: + イメージマップã®ãƒ«ãƒ¼ãƒ«ãƒ•ァイルã¨ã—ã¦è§£æžã—ã¾ã™ã€‚ + (mod_imagemap)
    • + +
    • server-info: サーãƒã®è¨­å®šæƒ…報をå–å¾—ã—ã¾ã™ã€‚ + (mod_info)
    • + +
    • server-status: サーãƒã®çŠ¶æ…‹å ±å‘Šã‚’å–å¾—ã—ã¾ã™ã€‚ + (mod_status)
    • + +
    • type-map: + コンテントãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã®ãŸã‚ã®ã‚¿ã‚¤ãƒ—マップã¨ã—ã¦è§£æžã—ã¾ã™ã€‚ + (mod_negotiation)
    • +
    +
    top
    +
    +

    例

    + + +

    CGI スクリプトを用ã„ã¦é™çš„ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„を変更ã™ã‚‹

    + + +

    以下ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã«ã‚ˆã£ã¦ã€æ‹¡å¼µå­ãŒ html + ã§ã‚るファイル㯠footer.pl + CGI スクリプトを起動ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚

    + +
    Action add-footer /cgi-bin/footer.pl
    +AddHandler add-footer .html
    + + +

    CGI スクリプトã¯å¸Œæœ›ã®ä¿®æ­£ã‚„追加を行ãªã£ã¦ã€å…ƒã€…è¦æ±‚ã•ã‚ŒãŸæ–‡æ›¸ + (環境変数 PATH_TRANSLATED + ã§æŒ‡ã•れã¦ã„ã¾ã™) ã‚’é€ã‚‹è²¬ä»»ãŒã‚りã¾ã™ã€‚ +

    + + +

    HTTP ヘッダã®ã‚るファイル

    + + +

    以下ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–㯠send-as-is + ãƒãƒ³ãƒ‰ãƒ©ã‚’使用ã™ã‚‹ã‚ˆã†ã«æŒ‡ç¤ºã—ã¾ã™ã€‚ã“ã®ãƒãƒ³ãƒ‰ãƒ©ã¯è‡ªåˆ†è‡ªèº«ã® HTTP + ヘッダをæŒã£ã¦ã„るファイルã«ä½¿ç”¨ã•れã¾ã™ã€‚ã“ã“ã§ã¯ã€æ‹¡å¼µå­ã«é–¢ã‚らãšã€ + /web/htdocs/asis ディレクトリã«ã‚ã‚‹å…¨ã¦ã®ãƒ•ァイル㯠+ send-as-is ãƒãƒ³ãƒ‰ãƒ©ã«ã‚ˆã£ã¦æ‰±ã‚れã¾ã™ã€‚

    + +
    <Directory /web/htdocs/asis>
    +    SetHandler send-as-is
    +</Directory>
    + + + +
    top
    +
    +

    プログラマå‘ã‘ã®ãƒ¡ãƒ¢

    + + +

    ãƒãƒ³ãƒ‰ãƒ©ã®æ©Ÿèƒ½ã‚’実装ã™ã‚‹ãŸã‚ã«ã€åˆ©ç”¨ã™ã‚‹ã¨ä¾¿åˆ©ã‹ã‚‚ã—れãªã„ã‚‚ã®ãŒ + Apache API + ã«è¿½åŠ ã•れã¾ã—ãŸã€‚詳ã—ã言ã†ã¨ã€request_rec + æ§‹é€ ä½“ã«æ–°ã—ã„レコードãŒè¿½åŠ ã•れãŸã¨ã„ã†ã“ã¨ã§ã™ã€‚

    + +
    char *handler
    + + +

    ã‚‚ã—モジュールãŒãƒãƒ³ãƒ‰ãƒ©ã«é–¢ã‚りãŸã„å ´åˆã€ + やらãªã‘れã°ãªã‚‰ãªã„ã“ã¨ã¯ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒ invoke_handler + ステージã«é”ã™ã‚‹ä»¥å‰ã« r->handler + を設定ã™ã‚‹ã“ã¨ã ã‘ã§ã™ã€‚ãƒãƒ³ãƒ‰ãƒ©ã¯ã‚³ãƒ³ãƒ†ãƒ³ãƒˆã‚¿ã‚¤ãƒ—ã®ä»£ã‚り㫠+ ãƒãƒ³ãƒ‰ãƒ©åを使ã†ã‚ˆã†ã«ãªã£ã¦ã„ã‚‹ã“ã¨ä»¥å¤–ã¯ã€ä»¥å‰ã¨åŒã˜ã‚ˆã†ã«å®Ÿè£…ã•れã¦ã„ã¾ã™ã€‚ + å¿…ãšè¦æ±‚ã•れã¦ã„ã‚‹ã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¿ã‚¤ãƒ— + ã®åå‰ç©ºé–“ã‚’ä¾µã•ãªã„よã†ã«ã€ãƒãƒ³ãƒ‰ãƒ©ã®åå‰ã«ã¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã‚’å«ã¾ãªã„〠+ ダッシュ(訳注: "-")ã§åˆ†é›¢ã•れãŸåå‰ã‚’付ã‘ã‚‹ç¿’æ…£ã«ãªã£ã¦ã„ã¾ã™ã€‚

    +
    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko  | + tr  | + zh-cn 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/handler.html.ko.euc-kr b/docs/manual/handler.html.ko.euc-kr new file mode 100644 index 0000000..2a9ce27 --- /dev/null +++ b/docs/manual/handler.html.ko.euc-kr @@ -0,0 +1,181 @@ + + + + + +¾ÆÆÄÄ¡¿¡¼­ Çڵ鷯 »ç¿ë - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡¿¡¼­ Çڵ鷯 »ç¿ë

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + tr  | + zh-cn 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + +

    ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡¿¡¼­ Çڵ鷯¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.

    +
    + +
    top
    +
    +

    Çڵ鷯°¡ ¹«¾ùÀΰ¡

    + + + + +

    ÆÄÀÏÀ» ¿äûÇÒ¶§ ¾ÆÆÄÄ¡°¡ ³»ºÎÀûÀ¸·Î ¼öÇàÇÒ ÀÛ¾÷À» + "Çڵ鷯(handler)"¶ó°í ÇÑ´Ù. ÀϹÝÀûÀ¸·Î ÆÄÀÏÀº ÆÄÀÏ Á¾·ù¿¡ + µû¶ó ¾Ï¹¬ÀûÀÎ Çڵ鷯¸¦ °¡Áö°í ÀÖ´Ù. ¸ðµç ÆÄÀÏÀº º¸Åë °£´ÜÈ÷ + ¼­¹ö°¡ ¼­ºñ½ºÇÏÁö¸¸, ¾î¶² ÆÄÀÏ Á¾·ù´Â µû·Î "󸮵ȴÙ(handled)".

    + +

    Apache 1.1ºÎÅÍ Çڵ鷯¸¦ ¸í½ÃÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. + ÆÄÀÏ Á¾·ù¿Í °ü°è¾øÀÌ Çڵ鷯¸¦ ÆÄÀÏÀÇ È®ÀåÀÚ³ª À§Ä¡¿¡ µû¶ó + ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â ´õ ÈǸ¢ÇÑ ¹æ¹ýÀÌ°í ÆÄÀÏÀ» Á¾·ù¿Í Çڵ鷯 + µÑ ¸ðµÎ¿Í ¿¬°èÇÒ ¼ö Àֱ⶧¹®¿¡ ÁÁ´Ù. (¿©·¯ È®ÀåÀÚ¸¦ °¡Áø ÆÄÀϵµ + Âü°í)

    + +

    Çڵ鷯´Â ¼­¹ö³ª ¸ðµâ·Î ±¸ÇöÇÏ¿©, Action Áö½Ã¾î·Î Ãß°¡ÇÒ + ¼ö ÀÖ´Ù. Ç¥ÁØ ¹èÆ÷º»¿¡ ÀÖ´Â ±âº» Çڵ鷯´Â ´ÙÀ½°ú °°´Ù:

    + +
      +
    • default-handler: Á¤ÀûÀÎ ³»¿ëÀ» + ó¸®ÇϱâÀ§ÇØ ±âº»ÀûÀ¸·Î »ç¿ëÇÏ´Â Çڵ鷯 + default_handler()¸¦ »ç¿ëÇÏ¿© ÆÄÀÏÀ» º¸³½´Ù. + (core)
    • + +
    • send-as-is: HTTP Çì´õ°¡ ÀÖ´Â ÆÄÀÏÀ» + ±×´ë·Î º¸³½´Ù. (mod_asis)
    • + +
    • cgi-script: ÆÄÀÏÀ» CGI·Î ó¸®ÇÑ´Ù. + (mod_cgi)
    • + +
    • imap-file: imagemap ±ÔÄ¢ ÆÄÀÏ·Î + ó¸®ÇÑ´Ù. (mod_imagemap)
    • + +
    • server-info: ¼­¹öÀÇ ¼³Á¤ Á¤º¸¸¦ + ¾Ë·ÁÁØ´Ù. (mod_info)
    • + +
    • server-status: ¼­¹öÀÇ »óŸ¦ º¸°íÇÑ´Ù. + (mod_status)
    • + +
    • type-map: ³»¿ëÇù»ó¿¡ »ç¿ëÇÒ + type mapÀ¸·Î ó¸®ÇÑ´Ù. + (mod_negotiation)
    • +
    +
    top
    +
    +

    ¿¹Á¦

    + + +

    CGI ½ºÅ©¸³Æ®¸¦ »ç¿ëÇÏ¿© Á¤ÀûÀÎ ³»¿ë ¼öÁ¤Çϱâ

    + + +

    ´ÙÀ½ Áö½Ã¾î´Â È®ÀåÀÚ°¡ htmlÀÎ ÆÄÀÏÀ» + ¿äûÇÒ °æ¿ì footer.pl CGI ½ºÅ©¸³Æ®¸¦ ¶ç¿î´Ù.

    + +

    + Action add-footer /cgi-bin/footer.pl
    + AddHandler add-footer .html +

    + +

    CGI ½ºÅ©¸³Æ®´Â + (PATH_TRANSLATED ȯ°æº¯¼ö°¡ ÁöĪÇÏ´Â) ¿ø·¡ + ¿äûÇÑ ¹®¼­¸¦ ÀûÀýÈ÷ ¼öÁ¤ÇÑ ÈÄ º¸³½´Ù.

    + + +

    HTTP Çì´õ¸¦ Æ÷ÇÔÇÏ´Â ÆÄÀÏ

    + + +

    ´ÙÀ½ Áö½Ã¾î´Â HTTP Çì´õ¸¦ Æ÷ÇÔÇÏ´Â ÆÄÀÏ¿¡ + send-as-is Çڵ鷯¸¦ Áö½ÃÇÑ´Ù. + /web/htdocs/asis/ µð·ºÅ丮 ¾È¿¡ ÀÖ´Â ¸ðµç + ÆÄÀÏÀº È®ÀåÀÚ¿Í °ü°è¾øÀÌ send-as-is Çڵ鷯°¡ + ó¸®ÇÑ´Ù.

    + +

    + <Directory /web/htdocs/asis>
    + SetHandler send-as-is
    + </Directory> +

    + + +
    top
    +
    +

    ÇÁ·Î±×·¡¸Ó¸¦ À§ÇÑ Á¤º¸

    + + +

    Çڵ鷯 ±â´ÉÀ» ±¸ÇöÇϱâÀ§ÇØ »ç¿ëÇÔÁ÷ÇÑ + Apache API°¡ Ãß°¡µÇ¾ú´Ù. + ƯÈ÷ request_rec ±¸Á¶Ã¼¿¡ »õ·Î¿î Çʵ尡 + Ãß°¡µÇ¾ú´Ù:

    + +

    + char *handler +

    + +

    ¸ðµâÀÌ Çڵ鷯¸¦ »ç¿ëÇÏ·Á¸é, ¿äûÀÇ + invoke_handler ´Ü°è ÀÌÀü¿¡ + r->handler¿¡ Çڵ鷯 À̸§À» ÁöÁ¤ÇØÁֱ⸸ + ÇÏ¸é µÈ´Ù. Çڵ鷯´Â content type ´ë½Å Çڵ鷯 À̸§À» »ç¿ëÇÑ + °ÍÀ» Á¦¿ÜÇϰí´Â Àü°ú °°ÀÌ ±¸ÇöµÇ¾ú´Ù. ²À Áöų ÇÊ¿ä´Â ¾øÁö¸¸ + Çڵ鷯 À̸§¿¡ ½½·¡½¬¸¦ »ç¿ëÇÏÁö ¾Ê°í, ´Ü¾îµé »çÀÌ¿¡ »©±â + ±âÈ£¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù. ±×·¡¼­ Çڵ鷯 À̸§ÀÌ + media type°ú °ãÄ¡Áö ¾Ê´Â´Ù.

    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + tr  | + zh-cn 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/handler.html.tr.utf8 b/docs/manual/handler.html.tr.utf8 new file mode 100644 index 0000000..5dad3e8 --- /dev/null +++ b/docs/manual/handler.html.tr.utf8 @@ -0,0 +1,179 @@ + + + + + +Apache Eylemcilerinin Kullanımı - Apache HTTP Sunucusu Sürüm 2.4 + + + + + + + +
    <-
    +

    Apache Eylemcilerinin Kullanımı

    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + ja  | + ko  | + tr  | + zh-cn 

    +
    + +

    Bu belgede Apache Eylemcilerinin kullanımı açıklanmıştır.

    +
    + +
    top
    +
    +

    Eylemci Nedir?

    + + + + +

    Bir eylemci bir dosya çağrıldığında uygulanacak eylemin Apache + dahilindeki gösterimidir. Genellikle dosyaların kendi türüne bağlı + olarak örtük eylemcileri vardır. Normalde tüm dosyalar basitçe sunucu + tarafından sunulurlar, fakat bazı dosya türleri normalden farklı şekilde + ele alınırlar.

    + +

    Eylemciler, dosya türünden bağımsız olarak dosyanın bulunduğu yere veya + dosya ismi uzantısına göre de yapılandırılabilirler. Gerek, zarif bir + çözüm oluşuyla gerekse, hem dosya türünü hem de bir dosya ile ilişkili + bir eylemciyi mümkün kılması sebebiyle bunun getirisi daha yüksektir. + (Ayrıca, çok uzantılı + dosyalara da bakınız.)

    + +

    Eylemciler sunucu içinde derlenebileceği gibi bir modül olarak ya da + Action yönergesi ile de + sunucuya dahil edilebilirler. Standart dağıtımda bulunan yerleşik + eylemciler şunlardır:

    + +
      +
    • default-handler: Dosyayı, öntanımlı olarak duraÄŸan + içeriÄŸi iÅŸlemekte kullanılan default_handler() iÅŸlevini + kullanarak gönderir. (core)
    • + +
    • send-as-is: Dosyayı HTTP baÅŸlıklarıyla olduÄŸu gibi + gönderir. (mod_asis)
    • + +
    • cgi-script: Dosyayı bir CGI betiÄŸi olarak ele alır. + (mod_cgi)
    • + +
    • imap-file: Dosyayı bir resim eÅŸleme kuralları + dosyası olarak çözümler. (mod_imagemap)
    • + +
    • server-info: Sunucunun yapılandırma bilgisini + döndürür. (mod_info)
    • + +
    • server-status: Sunucunun durum raporunu döndürür. + (mod_status)
    • + +
    • type-map: Dosyayı içerik uzlaşımı için bir tür + eÅŸlem dosyası olarak çözümler. (mod_negotiation)
    • +
    +
    top
    +
    +

    Örnekler

    + + +

    Bir CGI betiği kullanarak durağan içeriğin değiştirilmesi

    + + +

    Aşağıdaki yönergeler sayesinde, html uzantılı dosyalar + için yapılan istekler footer.pl CGI betiğininin + çalıştırılmasına sebep olacaktır.

    + +
    Action add-footer /cgi-bin/footer.pl
    +AddHandler add-footer .html
    + + +

    Bu yapılandırmayla, istenen belgenin özgün haliyle mi (yeri + PATH_TRANSLATED ortam değişkenindedir) yoksa istenen + değişiklikler veya eklemeler yapıldıktan sonra mı gönderileceğinden + CGI betiği sorumlu olacaktır.

    + + +

    HTTP başlıklı dosyalar

    + + +

    Aşağıdaki yönergeler kendi HTTP başlıklarını içeren dosyalar için + kullanılan send-as-is eylemcisini etkinleştirmek amacıyla + kullanılmıştır. /siteler/htdocs/asis/ dizinindeki tüm + dosyalar dosya ismi uzantılarına bakılmaksızın send-as-is + eylemcisi tarafından işleme sokulacaktır.

    + +
    <Directory "/web/htdocs/asis">
    +    SetHandler send-as-is
    +</Directory>
    + + + +
    top
    +
    +

    Yazılım Geliştirenler İçin

    + + +

    Eylemci özellikleri gerçeklenirken kullanılmak üzere Apache API’ye bir ekleme yapılmıştır. + Özellikle de, request_rec yapısına yeni bir kayıt + eklenmiştir:

    + +
    char *handler
    + + +

    Modülünüzün bir eylemciyi devreye sokmasını isterseniz, tek yapacağınız + isteğin invoke_handler aşamasının hemen öncesinde + r->handler alanına eylemcinin ismini atamak olacaktır. + Eylemciler daha önce de bahsedildiği gibi bir içerik türü yerine bir + eylemci ismi kullanılarak gerçeklenirler. Çok gerekli olmamakla + birlikte, eylemciler için kullanılan adlandırma uzlaşımları gereğince, + ismi oluşturan sözcükler, ortam türü isim alanını ihlal etmemek amacıyla + bölü imleri ile değil tire imleri ile ayrılırlar.

    +
    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + ja  | + ko  | + tr  | + zh-cn 

    +
    top

    Yorumlar

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/handler.html.zh-cn.utf8 b/docs/manual/handler.html.zh-cn.utf8 new file mode 100644 index 0000000..cbc4bb0 --- /dev/null +++ b/docs/manual/handler.html.zh-cn.utf8 @@ -0,0 +1,157 @@ + + + + + +Apache 的处ç†å™¨ - Apache HTTP æœåС噍 版本 2.4 + + + + + + + +
    <-
    +

    Apache 的处ç†å™¨

    +
    +

    å¯ç”¨è¯­è¨€:  en  | + es  | + fr  | + ja  | + ko  | + tr  | + zh-cn 

    +
    +
    此翻译å¯èƒ½è¿‡æœŸã€‚è¦äº†è§£æœ€è¿‘的更改,请阅读英文版。
    + +

    本页æè¿° Apache 处ç†å™¨çš„用法。

    +
    + +
    top
    +
    +

    什么是处ç†å™¨

    + + + + +

    “处ç†å™¨â€æ˜¯å½“文件被调用时,Apache è¦æ‰§è¡Œçš„动作的内部表示形å¼ã€‚ + 一般æ¥è¯´ï¼Œæ¯ä¸ªæ–‡ä»¶éƒ½æœ‰åŸºäºŽå…¶æ–‡ä»¶ç±»åž‹çš„éšå¼å¤„ç†å™¨ã€‚通常的文件会被 + æœåŠ¡å™¨ç®€å•处ç†ï¼Œä½†æ˜¯æŸäº›æ–‡ä»¶ç±»åž‹ä¼šè¢«åˆ†åˆ«â€œå¤„ç†â€ã€‚

    + +

    处ç†å™¨ä¹Ÿå¯ä»¥è¢«åŸºäºŽæ‰©å±•åæˆ–ä½ç½®æ¥æ˜Žç¡®é…置。它们都很有用,这ä¸ä»… + 因为它是优雅的方案,而且还å…许类型与处ç†å™¨å…³è”到文件 + (å‚è§æ–‡ä»¶ä¸Žå¤šä¸ªæ‰©å±•å)。

    + +

    处ç†å™¨å¯ä»¥ç¼–译到æœåŠ¡å™¨ä¸­ï¼Œæˆ–è€…åŒ…å«åœ¨æ¨¡å—中,它们还å¯ä»¥è¢« Action 指令增加。标准å‘行版中内置的处ç†å™¨æœ‰:

    + +
      +
    • default-handler: 使用 + default_handler() å‘逿–‡ä»¶ï¼Œå®ƒæ˜¯ç”¨æ¥å¤„ç†é™æ€å†…容的处ç†å™¨(核心)。
    • + +
    • send-as-is: 直接å‘é€ï¼Œä¸å¢žåŠ  HTTP 头(mod_asis)。
    • + +
    • cgi-script: 按 CGI 脚本处ç†(mod_cgi)。
    • + +
    • imap-file: 按 imagemap 规则处ç†(mod_imagemap)。
    • + +
    • server-info: å–å¾—æœåС噍é…置信æ¯(mod_info)。
    • + +
    • server-status: å–å¾—æœåŠ¡å™¨çŠ¶æ€æŠ¥å‘Š(mod_status)。
    • + +
    • type-map: 用于内容å商,按类型映射文件处ç†(mod_negotiation)。
    • +
    +
    top
    +
    +

    例å­

    + + +

    使用 CGI è„šæœ¬ä¿®æ”¹é™æ€å†…容

    + + +

    下é¢çš„æŒ‡ä»¤å°†ä¼šä½¿å…·æœ‰html扩展åçš„æ–‡ä»¶ï¼Œè§¦å‘ CGI 脚本footer.pl的执行。

    + +

    + Action add-footer /cgi-bin/footer.pl
    + AddHandler add-footer .html +

    + +

    于是 CGI è´Ÿè´£å‘é€è¯·æ±‚的文档(PATH_TRANSLATED 环境å˜é‡æŒ‡å‘它),按照需è¦ä½œå‡º and making + whatever modifications or additions are desired.

    + + +

    嫿œ‰ HTTP 头的文件

    + + +

    下é¢çš„æŒ‡ä»¤ä¼šå¯ç”¨ + send-as-is 处ç†å™¨ï¼Œç”¨äºŽåŒ…å«è‡ªå·±çš„ HTTP 的文件。ä¸ç®¡ä»€ä¹ˆæ‰©å±•å, + 所有ä½äºŽ /web/htdocs/asis/ 目录的文件会被 + send-as-is 处ç†å™¨å¤„ç†ã€‚

    + +

    + <Directory /web/htdocs/asis>
    + SetHandler send-as-is
    + </Directory> +

    + + +
    top
    +
    +

    对程åºå‘˜çš„说明

    + + +

    为了实现处ç†å™¨ç‰¹æ€§ï¼Œå¢žåŠ äº†éœ€è¦ä½¿ç”¨çš„ Apache API。 + 特别的,结构 request_rec 增加了新æˆå‘˜:

    + +

    + char *handler +

    + +

    å¦‚æžœä½ æƒ³è¦æ¨¡å—实现处ç†å™¨ï¼Œåªéœ€è¦åœ¨åœ¨å¤„ç†è¯·æ±‚,调用 invoke_handler + 之å‰ï¼Œå°† r->handler 指å‘处ç†å™¨å称。处ç†å™¨çš„实现与以å‰ä¸€æ ·ï¼Œåªæ˜¯ç”¨å¤„ç†å™¨åç§°å–代了内容类型。 + è™½ç„¶ä¸æ˜¯å¿…è¦ï¼Œå¤„ç†å™¨çš„命å约定是使用破折å·åˆ†å‰²çš„å•è¯ï¼Œæ²¡æœ‰æ–œæ ï¼Œä»Žè€Œä¸ä¾µå…¥åª’体类型å称空间。

    +
    +
    +

    å¯ç”¨è¯­è¨€:  en  | + es  | + fr  | + ja  | + ko  | + tr  | + zh-cn 

    +
    top

    评论

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/access.html b/docs/manual/howto/access.html new file mode 100644 index 0000000..2e5d6ab --- /dev/null +++ b/docs/manual/howto/access.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: access.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: access.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: access.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/howto/access.html.en b/docs/manual/howto/access.html.en new file mode 100644 index 0000000..4234946 --- /dev/null +++ b/docs/manual/howto/access.html.en @@ -0,0 +1,229 @@ + + + + + +Access Control - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Access Control

    +
    +

    Available Languages:  en  | + es  | + fr 

    +
    + +

    Access control refers to any means of controlling access to any + resource. This is separate from authentication and authorization.

    +
    + +
    top
    +
    +

    Related Modules and Directives

    + +

    Access control can be done by several different modules. The most + important of these are mod_authz_core and + mod_authz_host. Also discussed in this document + is access control using mod_rewrite.

    + +
    top
    +
    +

    Access control by host

    +

    + If you wish to restrict access to portions of your site based on the + host address of your visitors, this is most easily done using + mod_authz_host. +

    + +

    The Require + provides a variety of different ways to allow or deny access to + resources. In conjunction with the RequireAll, RequireAny, and RequireNone directives, these + requirements may be combined in arbitrarily complex ways, to enforce + whatever your access policy happens to be.

    + +

    + The Allow, + Deny, and + Order directives, + provided by mod_access_compat, are deprecated and + will go away in a future version. You should avoid using them, and + avoid outdated tutorials recommending their use. +

    + +

    The usage of these directives is:

    + +
    Require host address
    +Require ip ip.address
    + + +

    In the first form, address is a fully qualified + domain name (or a partial domain name); you may provide multiple + addresses or domain names, if desired.

    + +

    In the second form, ip.address is an IP address, a + partial IP address, a network/netmask pair, or a network/nnn CIDR + specification. Either IPv4 or IPv6 addresses may be used.

    + +

    See the + mod_authz_host documentation for further examples of this + syntax.

    + +

    You can insert not to negate a particular requirement. + Note, that since a not is a negation of a value, it cannot + be used by itself to allow or deny a request, as not true + does not constitute false. Thus, to deny a visit using a negation, + the block must have one element that evaluates as true or false. + For example, if you have someone spamming your message + board, and you want to keep them out, you could do the + following:

    + +
    <RequireAll>
    +    Require all granted
    +    Require not ip 10.252.46.165
    +</RequireAll>
    + + +

    Visitors coming from that address (10.252.46.165) + will not be able to see the content covered by this directive. If, + instead, you have a machine name, rather than an IP address, you + can use that.

    + +
    Require not host host.example.com
    +    
    + + +

    And, if you'd like to block access from an entire domain, + you can specify just part of an address or domain name:

    + +
    Require not ip 192.168.205
    +Require not host phishers.example.com moreidiots.example
    +Require not host gov
    + + +

    Use of the RequireAll, RequireAny, and RequireNone directives may be + used to enforce more complex sets of requirements.

    + +
    top
    +
    +

    Access control by arbitrary variables

    + +

    Using the <If>, + you can allow or deny access based on arbitrary environment + variables or request header values. For example, to deny access + based on user-agent (the browser type) you might do the + following:

    + +
    <If "%{HTTP_USER_AGENT} == 'BadBot'">
    +    Require all denied
    +</If>
    + + +

    Using the Require + expr syntax, this could also be written as:

    + + +
    Require expr %{HTTP_USER_AGENT} != 'BadBot'
    + + +

    Warning:

    +

    Access control by User-Agent is an unreliable technique, + since the User-Agent header can be set to anything at all, + at the whim of the end user.

    +
    + +

    See the expressions document for a + further discussion of what expression syntaxes and variables are + available to you.

    + +
    top
    +
    +

    Access control with mod_rewrite

    + +

    The [F] RewriteRule flag causes a 403 Forbidden + response to be sent. Using this, you can deny access to a resource based + on arbitrary criteria.

    + +

    For example, if you wish to block access to a resource between 8pm + and 7am, you can do this using mod_rewrite.

    + +
    RewriteEngine On
    +RewriteCond "%{TIME_HOUR}" ">=20" [OR]
    +RewriteCond "%{TIME_HOUR}" "<07"
    +RewriteRule "^/fridge"     "-" [F]
    + + +

    This will return a 403 Forbidden response for any request after 8pm + or before 7am. This technique can be used for any criteria that you wish + to check. You can also redirect, or otherwise rewrite these requests, if + that approach is preferred.

    + +

    The <If> directive, + added in 2.4, replaces many things that mod_rewrite has + traditionally been used to do, and you should probably look there first + before resorting to mod_rewrite.

    + +
    top
    +
    +

    More information

    + +

    The expression engine gives you a + great deal of power to do a variety of things based on arbitrary + server variables, and you should consult that document for more + detail.

    + +

    Also, you should read the mod_authz_core + documentation for examples of combining multiple access requirements + and specifying how they interact.

    + +

    See also the Authentication and Authorization + howto.

    +
    +
    +

    Available Languages:  en  | + es  | + fr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/access.html.es b/docs/manual/howto/access.html.es new file mode 100644 index 0000000..16e2ccd --- /dev/null +++ b/docs/manual/howto/access.html.es @@ -0,0 +1,236 @@ + + + + + +Control de Acceso - Servidor HTTP Apache Versión 2.4 + + + + + + + +
    <-
    +

    Control de Acceso

    +
    +

    Idiomas disponibles:  en  | + es  | + fr 

    +
    + +

    El control de acceso, hace referencia a todos los medios que proporcionan + una forma de controlar el acceso a cualquier recurso. Esta parte está + separada de autenticación y autorización.

    +
    + +
    top
    +
    +

    Módulos y Directivas relacionados

    + +

    El control de acceso puede efectuarse mediante diferentes módulos. Los + más importantes de éstos son mod_authz_core y + mod_authz_host. También se habla en este documento de + el control de acceso usando el módulo mod_rewrite.

    + +
    top
    +
    +

    Control de Acceso por host

    +

    + Si lo que se quiere es restringir algunas zonas del sitio web, basándonos + en la dirección del visitante, esto puede ser realizado de manera + fácil con el módulo mod_authz_host. +

    + +

    La directiva Require + proporciona una variedad de diferentes maneras de permitir o denegar el acceso a los recursos. Además puede ser usada junto con las directivas:RequireAll, RequireAny, y RequireNone, estos requerimientos pueden + ser combinados de forma compleja y arbitraria, para cumplir cualquiera que + sean tus políticas de acceso.

    + +

    + Las directivas Allow, + Deny, y + Order, + proporcionadas por mod_access_compat, están obsoletas y + serán quitadas en futuras versiones. Deberá evitar su uso, y también + los tutoriales desactualizaos que recomienden su uso. +

    + +

    El uso de estas directivas es:

    + + +
    Require host address 
    +Require ip ip.address +
    + + +

    En la primera línea, address es el FQDN de un nombre de + dominio (o un nombre parcial del dominio); puede proporcionar múltiples + direcciones o nombres de dominio, si se desea. +

    + +

    En la segunda línea, ip.address es la dirección IP, una + dirección IP parcial, una red con su máscara, o una especificación red/nnn + CIDR. Pueden usarse tanto IPV4 como IPV6.

    + +

    Consulte también la + documentación de mod_authz_host para otros ejemplos de esta sintaxis. +

    + +

    Puede ser insertado not para negar un requisito en particular. + Note que, ya que not es una negación de un valor, no puede ser + usado por si solo para permitir o denegar una petición, como not true + que no contituye ser false. En consecuencia, para denegar una + visita usando una negación, el bloque debe tener un elemento que se evalúa como + verdadero o falso. Por ejemplo, si tienes a alguien espameandote tu tablón de + mensajes, y tu quieres evitar que entren o dejarlos fuera, puedes realizar + lo siguiente: +

    + +
    <RequireAll>
    +    Require all granted
    +    Require not ip 10.252.46.165
    +</RequireAll>
    + + +

    Los visitantes que vengan desde la IP que se configura (10.252.46.165) + no tendrán acceso al contenido que cubre esta directiva. Si en cambio, lo que se + tiene es el nombre de la máquina, en vez de la IP, podrás usar:

    + +
    Require not host host.example.com
    +    
    + + +

    Y, Si lo que se quiere es bloquear el acceso desde dominio especifico, + podrás especificar parte de una dirección o nombre de dominio:

    + +
    Require not ip 192.168.205
    +Require not host phishers.example.com moreidiots.example
    +Require not host gov
    + + +

    Uso de las directivas RequireAll, RequireAny, y RequireNone pueden ser usadas + para forzar requisitos más complejos.

    + +
    top
    +
    +

    Control de acceso por variables arbitrarias.

    + +

    Haciendo el uso de <If>, + puedes permitir o denegar el acceso basado en variables de entrono arbitrarias + o en los valores de las cabeceras de las peticiones. Por ejemplo para denegar + el acceso basándonos en el "user-agent" (tipo de navegador así como Sistema Operativo) + puede que hagamos lo siguiente: +

    + +
    <If "%{HTTP_USER_AGENT} == 'BadBot'">
    +    Require all denied
    +</If>
    + + +

    Usando la sintaxis de Require + expr , esto también puede ser escrito de la siguiente forma: +

    + + +
    Require expr %{HTTP_USER_AGENT} != 'BadBot'
    + + +

    Advertencia:

    +

    El control de acceso por User-Agent es una técnica poco fiable, + ya que la cabecera de User-Agent puede ser modificada y establecerse + al antojo del usuario.

    +
    + +

    Vea también la página de expresiones + para una mayor aclaración de que sintaxis tienen las expresiones y que + variables están disponibles.

    + +
    top
    +
    +

    Control de acceso con mod_rewrite

    + +

    El flag [F] de RewriteRule causa una respuesta 403 Forbidden + para ser enviada. USando esto, podrá denegar el acceso a recursos basándose + en criterio arbitrario.

    + +

    Por ejemplo, si lo que desea es bloquear un recurso entre las 8pm y las + 7am, podrá hacerlo usando mod_rewrite:

    + +
    RewriteEngine On
    +RewriteCond "%{TIME_HOUR}" ">=20" [OR]
    +RewriteCond "%{TIME_HOUR}" "<07"
    +RewriteRule "^/fridge"     "-"       [F]
    + + +

    Esto devolverá una respuesta de error 403 Forbidden para cualquier petición + después de las 8pm y antes de las 7am. Esta técnica puede ser usada para cualquier + criterio que desee usar. También puede redireccionar, o incluso reescribir estas + peticiones, si se prefiere ese enfoque. +

    + +

    La directiva <If>, + añadida en la 2.4, sustituye muchas cosas que mod_rewrite + tradicionalmente solía hacer, y deberá comprobar estas antes de recurrir a +

    + +
    top
    +
    +

    Más información

    + +

    El motor de expresiones le da una gran + capacidad de poder para hacer una gran variedad de cosas basadas en + las variables arbitrarias del servidor, y debe consultar este + documento para más detalles.

    + +

    También, deberá leer la documentación de mod_authz_core + para ejemplos de combinaciones de múltiples requisitos de acceso y especificar + cómo interactúan. +

    + +

    Vea también los howtos de Authenticación y Autorización +

    +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr 

    +
    top

    Comentarios

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/access.html.fr.utf8 b/docs/manual/howto/access.html.fr.utf8 new file mode 100644 index 0000000..d075caa --- /dev/null +++ b/docs/manual/howto/access.html.fr.utf8 @@ -0,0 +1,242 @@ + + + + + +Contrôle d'accès - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Contrôle d'accès

    +
    +

    Langues Disponibles:  en  | + es  | + fr 

    +
    + +

    Le contrôle d'accès fait référence à tout concept de contrôle + d'accès à une ressource quelconque. Il est distinct du processus d'authentification et d'autorisation.

    +
    + +
    top
    +
    +

    Modules et directives concernés

    + +

    Plusieurs modules peuvent intervenir dans le contrôle d'accès. + Les plus importants sont mod_authz_core et + mod_authz_host. Ce document illustre aussi comment + utiliser mod_rewrite pour le contrôle + d'accès.

    + +
    top
    +
    +

    Contrôle d'accès en fonction de l'hôte du +client

    +

    + Si vous souhaitez restreindre l'accès à certaines parties de votre + site web en fonction de l'addresse de l'hôte de vos visiteurs, le + plus simple pour y parvenir consiste à utiliser le module + mod_authz_host. +

    + +

    La directive Require permet d'accorder ou + d'interdire l'accès à certaines ressources de différentes manières. + Ces critères d'accès, en conjonction avec les directives RequireAll, RequireAny, et RequireNone, peuvent être + combinés d'une manière suffisamment complexe pour + satisfaire votre politique de contrôle d'accès.

    + +

    + Les directives Allow, Deny, et Order fournies par le module + mod_access_compat sont obsolètes, et sont appelées à + disparaître dans les versions futures. Il est donc déconseillé de + les utiliser, et de se fier aux tutoriels qui recommandent leur + utilisation. +

    + +

    Les directives Require s'utilisent comme suit :

    + +
    Require host address
    +Require ip ip.address
    + + +

    Dans la première forme, nom-hôte est un nom de domaine + pleinement qualifié (fqdn), ou un nom de domaine partiel ; vous + pouvez spécifier plusieurs noms de domaines, si vous le désirez.

    + +

    Dans la seconde forme, adresse-ip est une adresse IP + complète, une adresse IP partielle, une paire réseau/masque de + sous-réseau ou une spécification CIDR de la forme réseau/nnn. Il est + possible de spécifier des adresses IPv4 ou IPv6.

    + +

    Voir la + documentation de mod_authz_host pour d'autres exemples de cette + syntaxe.

    + +

    Vous pouvez insérer le mot-clé not pour inverser un + critère particulier. Notez que le mot not étant la + négation d'une valeur, il ne peut pas être utilisé pour autoriser + ou interdire une requête, car non vrai ne + sera pas interpreté par httpd comme faux. Ainsi, pour interdire la + visite d'une page à l'aide d'une négation, le bloc doit contenir un + élément évalué à vrai ou faux. + Par exemple, si quelqu'un est en train d'inonder + votre forum de messages indésirables, vous pouvez ajouter cette ligne pour lui refuser + l'accès :

    + +
    <RequireAll>
    +    Require all granted
    +    Require not ip 10.252.46.165
    +</RequireAll>
    + + +

    Les visiteurs possédant cette adresse (10.252.46.165) ne pourront pas voir le + contenu concerné par cette directive. Si vous voulez interdire + l'accès à une machine en fonction de son nom, vous pouvez ajouter + ceci :

    + +
    Require not host host.example.com
    +    
    + + +

    Et si vous voulez interdire l'accès à un domaine particulier, + vous pouvez spécifier des adresses IP partielles ou des noms de + domaine, comme ceci :

    + +
    Require not ip 192.168.205
    +Require not host phishers.example.com moreidiots.example
    +Require not host gov
    + + +

    Les directives RequireAll, RequireAny, et RequireNone permettent également de préciser des + critères d'accès plus complexes.

    + +
    top
    +
    +

    Contrôle d'accès en fonction de variables +arbitraires

    + +

    Vous pouvez accorder ou refuser l'accès en fonction de variables + d'environnement arbitraires ou de valeurs d'en-têtes de la requête + en utilisant la directive <If>. Par exemple, pour interdire l'accès en + fonction du user-agent (le type de navigateur), vous pouvez + spécifier ceci :

    + +
    <If "%{HTTP_USER_AGENT} == 'BadBot'">
    +    Require all denied
    +</If>
    + + +

    La syntaxe expr de la directive Require permet de réécrire + l'exemple précédent de la manière suivante :

    + + +
    Require expr %{HTTP_USER_AGENT} != 'BadBot'
    + + +

    Avertissement :

    +

    Contrôler l'accès en fonction de l'en-tête + User-Agent n'est pas une technique fiable, car cet + en-tête peut être défini à une valeur quelconque, selon le bon + vouloir de l'utilisateur.

    +
    + +

    Voir le document à propos des expressions pour une description plus + approfondie des syntaxes d'expressions et des variables disponibles.

    + +
    top
    +
    +

    Utilisation de mod_rewrite pour le contrôle +d'accès

    + +

    Le drapeau [F] de la directive RewriteRule permet d'envoyer une + réponse de type 403 Forbidden. Il vous permet donc d'interdire + l'accès à une ressource en fonction d'un critère arbitraire.

    + +

    Par exemple, pour bloquer l'accès à une ressources entre 20h et + 7h du matin, vous pouvez utiliser mod_rewrite :

    + +
    RewriteEngine On
    +RewriteCond "%{TIME_HOUR}" ">=20" [OR]
    +RewriteCond "%{TIME_HOUR}" "<07"
    +RewriteRule "^/fridge"     "-" [F]
    + + +

    Toute requête arrivant après 20h ou avant 7h du matin provoquera + l'envoi d'une réponse de type 403 Forbidden. Vous pouvez utiliser + cette technique pour vérifier toutes sortes de critères. En outre, + si vous le préférez, vous pouvez rediriger ou réécrire la requête.

    + +

    Notez que la directive <If>, introduite à partir de la version 2.4, + permet de remplacer le module mod_rewrite dans de + nombreuses situations où il était traditionnellement utilisé, et + il sera probablement préférable pour vous de tenter de l'utiliser + avant de vous tourner vers mod_rewrite.

    + +
    top
    +
    +

    Informations complémentaires

    + +

    Le moteur d'expressions vous fournit + une grande puissance d'action en fonction de variables du serveur + arbitraires, et il vous est conseillé de consulter le document + correspondant pour plus de détails.

    + +

    De même, vous devez lire la documentation du module + mod_authz_core pour des exemples de combinaison de + critères d'accès multiples, et en particulier la manière dont ces + derniers interagissent.

    + +

    Voir aussi le How-To Authentification and + autorisation.

    +
    +
    +

    Langues Disponibles:  en  | + es  | + fr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/auth.html b/docs/manual/howto/auth.html new file mode 100644 index 0000000..5e5578d --- /dev/null +++ b/docs/manual/howto/auth.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: auth.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: auth.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: auth.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: auth.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: auth.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: auth.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/howto/auth.html.en b/docs/manual/howto/auth.html.en new file mode 100644 index 0000000..a0e9a06 --- /dev/null +++ b/docs/manual/howto/auth.html.en @@ -0,0 +1,640 @@ + + + + + +Authentication and Authorization - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Authentication and Authorization

    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Authentication is any process by which you verify that + someone is who they claim they are. Authorization is any + process by which someone is allowed to be where they want to + go, or to have information that they want to have.

    + +

    For general access control, see the Access + Control How-To.

    +
    + +
    top
    +
    +

    Related Modules and Directives

    + +

    There are three types of modules involved in the authentication and +authorization process. You will usually need to choose at least one +module from each group.

    + + + +

    In addition to these modules, there are also + mod_authn_core and + mod_authz_core. These modules implement core + directives that are core to all auth modules.

    + +

    The module mod_authnz_ldap is both an + authentication and authorization provider. The module + mod_authz_host provides authorization + and access control based on hostname, IP address or characteristics + of the request, but is not part of the authentication provider + system. For backwards compatibility with the mod_access, there is + a new module mod_access_compat.

    + +

    You probably also want to take a look at the Access Control howto, which discusses the + various ways to control access to your server.

    + +
    top
    +
    +

    Introduction

    +

    If you have information on your web site that is sensitive + or intended for only a small group of people, the techniques in + this article will help you make sure that the people that see + those pages are the people that you wanted to see them.

    + +

    This article covers the "standard" way of protecting parts + of your web site that most of you are going to use.

    + +

    Note:

    +

    If your data really needs to be secure, consider using + mod_ssl in addition to any authentication.

    +
    +
    top
    +
    +

    The Prerequisites

    +

    The directives discussed in this article will need to go + either in your main server configuration file (typically in a + <Directory> section), or + in per-directory configuration files (.htaccess files).

    + +

    If you plan to use .htaccess files, you will + need to have a server configuration that permits putting + authentication directives in these files. This is done with the + AllowOverride directive, which + specifies which directives, if any, may be put in per-directory + configuration files.

    + +

    Since we're talking here about authentication, you will need + an AllowOverride directive like the + following:

    + +
    AllowOverride AuthConfig
    + + +

    Or, if you are just going to put the directives directly in + your main server configuration file, you will of course need to + have write permission to that file.

    + +

    And you'll need to know a little bit about the directory + structure of your server, in order to know where some files are + kept. This should not be terribly difficult, and I'll try to + make this clear when we come to that point.

    + +

    You will also need to make sure that the modules + mod_authn_core and mod_authz_core + have either been built into the httpd binary or loaded by the + httpd.conf configuration file. Both of these modules provide core + directives and functionality that are critical to the configuration + and use of authentication and authorization in the web server.

    +
    top
    +
    +

    Getting it working

    +

    Here's the basics of password protecting a directory on your + server.

    + +

    First, you need to create a password file. Exactly how you do + this will vary depending on what authentication provider you have + chosen. More on that later. To start with, we'll use a text password + file.

    + +

    This file should be + placed somewhere not accessible from the web. This is so that + folks cannot download the password file. For example, if your + documents are served out of /usr/local/apache/htdocs, you + might want to put the password file(s) in + /usr/local/apache/passwd.

    + +

    To create the file, use the htpasswd utility that + came with Apache. This will be located in the bin directory + of wherever you installed Apache. If you have installed Apache from + a third-party package, it may be in your execution path.

    + +

    To create the file, type:

    + +

    + htpasswd -c /usr/local/apache/passwd/passwords rbowen +

    + +

    htpasswd will ask you for the password, and + then ask you to type it again to confirm it:

    + +

    + # htpasswd -c /usr/local/apache/passwd/passwords rbowen
    + New password: mypassword
    + Re-type new password: mypassword
    + Adding password for user rbowen +

    + +

    If htpasswd is not in your path, of course + you'll have to type the full path to the file to get it to run. + With a default installation, it's located at + /usr/local/apache2/bin/htpasswd

    + +

    Next, you'll need to configure the server to request a + password and tell the server which users are allowed access. + You can do this either by editing the httpd.conf + file or using an .htaccess file. For example, if + you wish to protect the directory + /usr/local/apache/htdocs/secret, you can use the + following directives, either placed in the file + /usr/local/apache/htdocs/secret/.htaccess, or + placed in httpd.conf inside a <Directory + "/usr/local/apache/htdocs/secret"> section.

    + +
    AuthType Basic
    +AuthName "Restricted Files"
    +# (Following line optional)
    +AuthBasicProvider file
    +AuthUserFile "/usr/local/apache/passwd/passwords"
    +Require user rbowen
    + + +

    Let's examine each of those directives individually. The AuthType directive selects + the method that is used to authenticate the user. The most + common method is Basic, and this is the method + implemented by mod_auth_basic. It is important to be aware, + however, that Basic authentication sends the password from the client to + the server unencrypted. This method should therefore not be used for + highly sensitive data, unless accompanied by mod_ssl. + Apache supports one other authentication method: + AuthType Digest. This method is implemented by mod_auth_digest and was intended to be more secure. This is no + longer the case and the connection should be encrypted with mod_ssl instead.

    + +

    The AuthName directive sets + the Realm to be used in the authentication. The realm serves + two major functions. First, the client often presents this information to + the user as part of the password dialog box. Second, it is used by the + client to determine what password to send for a given authenticated + area.

    + +

    So, for example, once a client has authenticated in the + "Restricted Files" area, it will automatically + retry the same password for any area on the same server that is + marked with the "Restricted Files" Realm. + Therefore, you can prevent a user from being prompted more than + once for a password by letting multiple restricted areas share + the same realm. Of course, for security reasons, the client + will always need to ask again for the password whenever the + hostname of the server changes.

    + +

    The AuthBasicProvider is, + in this case, optional, since file is the default value + for this directive. You'll need to use this directive if you are + choosing a different source for authentication, such as + mod_authn_dbm or mod_authn_dbd.

    + +

    The AuthUserFile + directive sets the path to the password file that we just + created with htpasswd. If you have a large number + of users, it can be quite slow to search through a plain text + file to authenticate the user on each request. Apache also has + the ability to store user information in fast database files. + The mod_authn_dbm module provides the AuthDBMUserFile directive. These + files can be created and manipulated with the dbmmanage and htdbm programs. Many + other types of authentication options are available from third + party modules.

    + +

    Finally, the Require + directive provides the authorization part of the process by + setting the user that is allowed to access this region of the + server. In the next section, we discuss various ways to use the + Require directive.

    +
    top
    +
    +

    Letting more than one +person in

    +

    The directives above only let one person (specifically + someone with a username of rbowen) into the + directory. In most cases, you'll want to let more than one + person in. This is where the AuthGroupFile comes in.

    + +

    If you want to let more than one person in, you'll need to + create a group file that associates group names with a list of + users in that group. The format of this file is pretty simple, + and you can create it with your favorite editor. The contents + of the file will look like this:

    + +

    + GroupName: rbowen dpitts sungo rshersey +

    + +

    That's just a list of the members of the group in a long + line separated by spaces.

    + +

    To add a user to your already existing password file, + type:

    + +

    + htpasswd /usr/local/apache/passwd/passwords dpitts +

    + +

    You'll get the same response as before, but it will be + appended to the existing file, rather than creating a new file. + (It's the -c that makes it create a new password + file).

    + +

    Now, you need to modify your .htaccess file or + <Directory> block + to look like the following:

    + +
    AuthType Basic
    +AuthName "By Invitation Only"
    +# Optional line:
    +AuthBasicProvider file
    +AuthUserFile "/usr/local/apache/passwd/passwords"
    +AuthGroupFile "/usr/local/apache/passwd/groups"
    +Require group GroupName
    + + +

    Now, anyone that is listed in the group GroupName, + and has an entry in the password file, will be let in, if + they type the correct password.

    + +

    There's another way to let multiple users in that is less + specific. Rather than creating a group file, you can just use + the following directive:

    + +
    Require valid-user
    + + +

    Using that rather than the Require user rbowen + line will allow anyone in that is listed in the password file, + and who correctly enters their password.

    +
    top
    +
    +

    Possible problems

    +

    Because of the way that Basic authentication is specified, + your username and password must be verified every time you + request a document from the server. This is even if you're + reloading the same page, and for every image on the page (if + they come from a protected directory). As you can imagine, this + slows things down a little. The amount that it slows things + down is proportional to the size of the password file, because + it has to open up that file, and go down the list of users + until it gets to your name. And it has to do this every time a + page is loaded.

    + +

    A consequence of this is that there's a practical limit to + how many users you can put in one password file. This limit + will vary depending on the performance of your particular + server machine, but you can expect to see slowdowns once you + get above a few hundred entries, and may wish to consider a + different authentication method at that time.

    +
    top
    +
    +

    Alternate password storage

    + +

    Because storing passwords in plain text files has the above + problems, you may wish to store your passwords somewhere else, such + as in a database.

    + +

    mod_authn_dbm and mod_authn_dbd are two + modules which make this possible. Rather than selecting AuthBasicProvider file, instead + you can choose dbm or dbd as your storage + format.

    + +

    To select a dbm file rather than a text file, for example:

    + +
    <Directory "/www/docs/private">
    +    AuthName "Private"
    +    AuthType Basic
    +    AuthBasicProvider dbm
    +    AuthDBMUserFile "/www/passwords/passwd.dbm"
    +    Require valid-user
    +</Directory>
    + + +

    Other options are available. Consult the + mod_authn_dbm documentation for more details.

    +
    top
    +
    +

    Using multiple providers

    + +

    With the introduction of the new provider based authentication and + authorization architecture, you are no longer locked into a single + authentication or authorization method. In fact any number of the + providers can be mixed and matched to provide you with exactly the + scheme that meets your needs. In the following example, both the + file and LDAP based authentication providers are being used.

    + +
    <Directory "/www/docs/private">
    +    AuthName "Private"
    +    AuthType Basic
    +    AuthBasicProvider file ldap
    +    AuthUserFile "/usr/local/apache/passwd/passwords"
    +    AuthLDAPURL ldap://ldaphost/o=yourorg
    +    Require valid-user
    +</Directory>
    + + +

    In this example the file provider will attempt to authenticate + the user first. If it is unable to authenticate the user, the LDAP + provider will be called. This allows the scope of authentication + to be broadened if your organization implements more than + one type of authentication store. Other authentication and authorization + scenarios may include mixing one type of authentication with a + different type of authorization. For example, authenticating against + a password file yet authorizing against an LDAP directory.

    + +

    Just as multiple authentication providers can be implemented, multiple + authorization methods can also be used. In this example both file group + authorization as well as LDAP group authorization is being used.

    + +
    <Directory "/www/docs/private">
    +    AuthName "Private"
    +    AuthType Basic
    +    AuthBasicProvider file
    +    AuthUserFile "/usr/local/apache/passwd/passwords"
    +    AuthLDAPURL ldap://ldaphost/o=yourorg
    +    AuthGroupFile "/usr/local/apache/passwd/groups"
    +    Require group GroupName
    +    Require ldap-group cn=mygroup,o=yourorg
    +</Directory>
    + + +

    To take authorization a little further, authorization container + directives such as + <RequireAll> + and + <RequireAny> + allow logic to be applied so that the order in which authorization + is handled can be completely controlled through the configuration. + See Authorization + Containers for an example of how they may be applied.

    + +
    top
    +
    +

    Beyond just authorization

    + +

    The way that authorization can be applied is now much more flexible + than just a single check against a single data store. Ordering, logic + and choosing how authorization will be done is now possible.

    + +

    Applying logic and ordering

    +

    Controlling how and in what order authorization will be applied + has been a bit of a mystery in the past. In Apache 2.2 a provider-based + authentication mechanism was introduced to decouple the actual + authentication process from authorization and supporting functionality. + One of the side benefits was that authentication providers could be + configured and called in a specific order which didn't depend on the + load order of the auth module itself. This same provider based mechanism + has been brought forward into authorization as well. What this means is + that the Require directive + not only specifies which authorization methods should be used, it also + specifies the order in which they are called. Multiple authorization + methods are called in the same order in which the + Require directives + appear in the configuration.

    + +

    With the introduction of authorization container directives + such as + <RequireAll> + and + <RequireAny>, + the configuration also has control over when the + authorization methods are called and what criteria determines when + access is granted. See + Authorization Containers + for an example of how they may be used to express complex + authorization logic.

    + +

    By default all + Require + directives are handled as though contained within a + <RequireAny> + container directive. In other words, if + any of the specified authorization methods succeed, then authorization + is granted.

    + + + +

    Using authorization providers for access control

    +

    Authentication by username and password is only part of the + story. Frequently you want to let people in based on something + other than who they are. Something such as where they are + coming from.

    + +

    The authorization providers all, + env, host and ip let you + allow or deny access based on other host based criteria such as + host name or ip address of the machine requesting a + document.

    + +

    The usage of these providers is specified through the + Require directive. + This directive registers the authorization providers + that will be called during the authorization stage of the request + processing. For example:

    + +
    Require ip address
    +        
    + + +

    where address is an IP address (or a partial IP + address) or:

    + +
    Require host domain_name
    +        
    + + +

    where domain_name is a fully qualified domain name + (or a partial domain name); you may provide multiple addresses or + domain names, if desired.

    + +

    For example, if you have someone spamming your message + board, and you want to keep them out, you could do the + following:

    + +
    <RequireAll>
    +    Require all granted
    +    Require not ip 10.252.46.165
    +</RequireAll>
    + + +

    Visitors coming from that address will not be able to see + the content covered by this directive. If, instead, you have a + machine name, rather than an IP address, you can use that.

    + +
    <RequireAll>
    +    Require all granted
    +    Require not host host.example.com
    +</RequireAll>
    + + +

    And, if you'd like to block access from an entire domain, + you can specify just part of an address or domain name:

    + +
    <RequireAll>
    +    Require all granted
    +    Require not ip 192.168.205
    +    Require not host phishers.example.com moreidiots.example
    +    Require not host ke
    +</RequireAll>
    + + +

    Using <RequireAll> + with multiple <Require> directives, each negated with not, + will only allow access, if all of negated conditions are true. In other words, + access will be blocked, if any of the negated conditions fails.

    + + + +

    Access Control backwards compatibility

    +

    One of the side effects of adopting a provider based mechanism for + authentication is that the previous access control directives + Order, + Allow, + Deny and + Satisfy are no longer needed. + However to provide backwards compatibility for older configurations, these + directives have been moved to the mod_access_compat module.

    + +

    Note

    +

    The directives provided by mod_access_compat have + been deprecated by mod_authz_host. + Mixing old directives like Order, Allow or Deny with new ones like + Require is technically possible + but discouraged. The mod_access_compat module was created to support + configurations containing only old directives to facilitate the 2.4 upgrade. + Please check the upgrading guide for more + information. +

    +
    + + +
    top
    +
    +

    Authentication Caching

    +

    There may be times when authentication puts an unacceptable load + on a provider or on your network. This is most likely to affect users + of mod_authn_dbd (or third-party/custom providers). + To deal with this, HTTPD 2.3/2.4 introduces a new caching provider + mod_authn_socache to cache credentials and reduce + the load on the origin provider(s).

    +

    This may offer a substantial performance boost to some users.

    +
    top
    +
    +

    More information

    +

    You should also read the documentation for + mod_auth_basic and mod_authz_host + which contain some more information about how this all works. The + directive <AuthnProviderAlias> can also help + in simplifying certain authentication configurations.

    + +

    The various ciphers supported by Apache for authentication data are + explained in Password + Encryptions.

    + +

    And you may want to look at the Access + Control howto, which discusses a number of related topics.

    + +
    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/auth.html.es b/docs/manual/howto/auth.html.es new file mode 100644 index 0000000..7ccd694 --- /dev/null +++ b/docs/manual/howto/auth.html.es @@ -0,0 +1,717 @@ + + + + + +Autenticación y Autorización - Servidor HTTP Apache Versión 2.4 + + + + + + + +
    <-
    +

    Autenticación y Autorización

    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    +
    Esta traducción podría estar + obsoleta. Consulte la versión en inglés de la + documentación para comprobar si se han producido cambios + recientemente.
    + +

    Autenticación es cualquier proceso por el cuál se verifica que uno es + quien dice ser. Autorización es cualquier proceso en el cuál cualquiera + está permitido a estar donde se quiera, o tener información la cuál se + quiera tener. +

    + +

    Para información de control de acceso de forma genérica visiteHow to de Control de Acceso.

    +
    + +
    top
    +
    +

    Módulos y Directivas Relacionados

    + +

    Hay tres tipos de módulos involucrados en los procesos de la autenticación + y autorización. Normalmente deberás escoger al menos un módulo de cada grupo.

    + + + +

    A parte de éstos módulos, también están + mod_authn_core y + mod_authz_core. Éstos módulos implementan las directivas + esenciales que son el centro de todos los módulos de autenticación.

    + +

    El módulo mod_authnz_ldap es tanto un proveedor de + autenticación como de autorización. El módulo + mod_authz_host proporciona autorización y control de acceso + basado en el nombre del Host, la dirección IP o características de la propia + petición, pero no es parte del sistema proveedor de + autenticación. Para tener compatibilidad inversa con el mod_access, + hay un nuevo modulo llamado mod_access_compat.

    + +

    También puedes mirar el how-to de Control de Acceso , donde se plantean varias formas del control de acceso al servidor.

    + +
    top
    +
    +

    Introducción

    +

    Si se tiene información en nuestra página web que sea información + sensible o pensada para un grupo reducido de usuarios/personas, + las técnicas que se describen en este manual, le servirán + de ayuda para asegurarse de que las personas que ven esas páginas sean + las personas que uno quiere.

    + +

    Este artículo cubre la parte "estándar" de cómo proteger partes de un + sitio web que muchos usarán.

    + +

    Nota:

    +

    Si de verdad es necesario que tus datos estén en un sitio seguro, + considera usar mod_ssl como método de autenticación adicional a cualquier forma de autenticación.

    +
    +
    top
    +
    +

    Los Prerequisitos

    +

    Las directivas que se usan en este artículo necesitaran ponerse ya sea + en el fichero de configuración principal del servidor ( típicamente en + la sección + <Directory> de httpd.conf ), o + en cada uno de los ficheros de configuraciones del propio directorio + (los archivos .htaccess).

    + +

    Si planea usar los ficheros .htaccess , necesitarás + tener en la configuración global del servidor, una configuración que permita + poner directivas de autenticación en estos ficheros. Esto se hace con la + directiva AllowOverride, la cual especifica + que directivas, en su caso, pueden ser puestas en cada fichero de configuración + por directorio.

    + +

    Ya que estamos hablando aquí de autenticación, necesitarás una directiva + AllowOverride como la siguiente: +

    + +
    AllowOverride AuthConfig
    + + +

    O, si solo se van a poner las directivas directamente en la configuración + principal del servidor, deberás tener, claro está, permisos de escritura + en el archivo.

    + +

    Y necesitarás saber un poco de como está estructurado el árbol de + directorios de tu servidor, para poder saber donde se encuentran algunos + archivos. Esto no debería ser una tarea difícil, aún así intentaremos + dejarlo claro llegado el momento de comentar dicho aspecto.

    + +

    También deberás de asegurarte de que los módulos + mod_authn_core y mod_authz_core + han sido incorporados, o añadidos a la hora de compilar en tu binario httpd o + cargados mediante el archivo de configuración httpd.conf. Estos + dos módulos proporcionan directivas básicas y funcionalidades que son críticas + para la configuración y uso de autenticación y autorización en el servidor web.

    +
    top
    +
    +

    Conseguir que funcione

    +

    Aquí está lo básico de cómo proteger con contraseña un directorio en tu + servidor.

    + +

    Primero, necesitarás crear un fichero de contraseña. Dependiendo de que + proveedor de autenticación se haya elegido, se hará de una forma u otra. Para empezar, + usaremos un fichero de contraseña de tipo texto.

    + +

    Este fichero deberá estar en un sitio que no se pueda tener acceso desde + la web. Esto también implica que nadie pueda descargarse el fichero de + contraseñas. Por ejemplo, si tus documentos están guardados fuera de + /usr/local/apache/htdocs, querrás poner tu archivo de contraseñas en + /usr/local/apache/passwd.

    + +

    Para crear el fichero de contraseñas, usa la utilidad + htpasswd que viene con Apache. Esta herramienta se + encuentra en el directorio /bin en donde sea que se ha + instalado el Apache. Si ha instalado Apache desde un paquete de terceros, + puede ser que se encuentre en su ruta de ejecución.

    + +

    Para crear el fichero, escribiremos:

    + +

    + htpasswd -c /usr/local/apache/passwd/passwords rbowen +

    + +

    htpasswd te preguntará por una contraseña, y después + te pedirá que la vuelvas a escribir para confirmarla:

    + +

    + $ htpasswd -c /usr/local/apache/passwd/passwords rbowen
    + New password: mypassword
    + Re-type new password: mypassword
    + Adding password for user rbowen +

    + +

    Si htpasswd no está en tu variable de entorno "path" del + sistema, por supuesto deberás escribir la ruta absoluta del ejecutable para + poder hacer que se ejecute. En una instalación por defecto, está en: + /usr/local/apache2/bin/htpasswd

    + +

    Lo próximo que necesitas, será configurar el servidor para que pida una + contraseña y así decirle al servidor que usuarios están autorizados a acceder. + Puedes hacer esto ya sea editando el fichero httpd.conf + de configuración o usando in fichero .htaccess. Por ejemplo, + si quieres proteger el directorio + /usr/local/apache/htdocs/secret, puedes usar las siguientes + directivas, ya sea en el fichero .htaccess localizado en + following directives, either placed in the file + /usr/local/apache/htdocs/secret/.htaccess, o + en la configuración global del servidor httpd.conf dentro de la + sección <Directory + "/usr/local/apache/htdocs/secret"> , como se muestra a continuación:

    + +
    <Directory "/usr/local/apache/htdocs/secret">
    +AuthType Basic
    +AuthName "Restricted Files"
    +# (Following line optional)
    +AuthBasicProvider file
    +AuthUserFile "/usr/local/apache/passwd/passwords"
    +Require user rbowen
    +</Directory>
    + + +

    Vamos a explicar cada una de las directivas individualmente. + La directiva AuthType selecciona el método + que se usa para autenticar al usuario. El método más común es + Basic, y éste es el método que implementa + mod_auth_basic. Es muy importante ser consciente, + de que la autenticación básica, envía las contraseñas desde el cliente + al servidor sin cifrar. + Este método por tanto, no debe ser utilizado para proteger datos muy sensibles, + a no ser que, este método de autenticación básica, sea acompañado del módulo + mod_ssl. + Apache soporta otro método más de autenticación que es del tipo + AuthType Digest. Este método, es implementado por el módulo mod_auth_digest y con el se pretendía crear una autenticación más + segura. Este ya no es el caso, ya que la conexión deberá realizarse con mod_ssl en su lugar. +

    + +

    La directiva AuthName + establece el Realm para ser usado en la autenticación. El + Realm tiene dos funciones principales. + La primera, el cliente presenta a menudo esta información al usuario como + parte del cuadro de diálogo de contraseña. La segunda, que es utilizado por + el cliente para determinar qué contraseña enviar a para una determinada zona + de autenticación.

    + +

    Así que, por ejemple, una vez que el cliente se ha autenticado en el área de + los "Ficheros Restringidos", entonces re-intentará automáticamente + la misma contraseña para cualquier área en el mismo servidor que es marcado + con el Realm de "Ficheros Restringidos" + Por lo tanto, puedes prevenir que a un usuario se le pida mas de una vez por su + contraseña, compartiendo así varias áreas restringidas el mismo Realm + Por supuesto, por razones de seguridad, el cliente pedirá siempre por una contraseña, + siempre y cuando el nombre del servidor cambie. +

    + +

    La directiva AuthBasicProvider es, + en este caso, opcional, ya que file es el valor por defecto + para esta directiva. Deberás usar esta directiva si estas usando otro medio + diferente para la autenticación, como por ejemplo + mod_authn_dbm o mod_authn_dbd.

    + +

    La directiva AuthUserFile + establece el path al fichero de contraseñas que acabamos de crear con el + comando htpasswd. Si tiene un número muy grande de usuarios, + puede ser realmente lento el buscar el usuario en ese fichero de texto plano + para autenticar a los usuarios en cada petición. + Apache también tiene la habilidad de almacenar información de usuarios en + unos ficheros de rápido acceso a modo de base de datos. + El módulo mod_authn_dbm proporciona la directiva AuthDBMUserFile. Estos ficheros pueden ser creados y + manipulados con el programa dbmmanage y htdbm. + Muchos otros métodos de autenticación así como otras opciones, están disponibles en + módulos de terceros + Base de datos de Módulos disponibles.

    + +

    Finalmente, la directiva Require + proporciona la parte del proceso de autorización estableciendo el o los + usuarios que se les está permitido acceder a una región del servidor. + En la próxima sección, discutiremos las diferentes vías de utilizar la + directiva Require.

    +
    top
    +
    +

    Dejar que más de una persona + entre

    +

    Las directivas mencionadas arriba sólo permiten a una persona + (especialmente con un usuario que en ej ejemplo es rbowen) + en el directorio. En la mayoría de los casos, se querrá permitir el acceso + a más de una persona. Aquí es donde la directiva + AuthGroupFile entra en juego.

    + +

    Si lo que se desea es permitir a más de una persona el acceso, necesitarás + crear un archivo de grupo que asocie los nombres de grupos con el de personas + para permitirles el acceso. El formato de este fichero es bastante sencillo, + y puedes crearlo con tu editor de texto favorito. El contenido del fichero + se parecerá a:

    + +

    + GroupName: rbowen dpitts sungo rshersey +

    + +

    Básicamente eso es la lista de miembros los cuales están en un mismo fichero + de grupo en una sola linea separados por espacios.

    + +

    Para añadir un usuario a tu fichero de contraseñas existente teclee:

    + +

    + htpasswd /usr/local/apache/passwd/passwords dpitts +

    + +

    Te responderá lo mismo que anteriormente, pero se añadirá al fichero + existente en vez de crear uno nuevo. (Es decir el flag -c será + el que haga que se genere un nuevo + fichero de contraseñas).

    + +

    Ahora, tendrá que modificar su fichero .htaccess para que sea + parecido a lo siguiente:

    + +
    AuthType Basic
    +AuthName "By Invitation Only"
    +# Optional line:
    +AuthBasicProvider file
    +AuthUserFile "/usr/local/apache/passwd/passwords"
    +AuthGroupFile "/usr/local/apache/passwd/groups"
    +Require group GroupName
    + + +

    Ahora, cualquiera que esté listado en el grupo GroupName, + y tiene una entrada en el fichero de contraseñas, se les + permitirá el acceso, si introducen su contraseña correctamente.

    + +

    Hay otra manera de dejar entrar a varios usuarios, que es menos específica. + En lugar de crear un archivo de grupo, sólo puede utilizar la siguiente + directiva:

    + +
    Require valid-user
    + + +

    Usando ésto en vez de la línea Require user rbowen + permitirá a cualquier persona acceder, la cuál aparece en el archivo de + contraseñas, y que introduzca correctamente su contraseña. Incluso puede + emular el comportamiento del grupo aquí, sólo manteniendo un fichero de + contraseñas independiente para cada grupo. La ventaja de este enfoque es + que Apache sólo tiene que comprobar un archivo, en lugar de dos. La desventaja + es que se tiene que mantener un montón de ficheros de contraseña de grupo, y + recuerde hacer referencia al fichero correcto en la directiva + AuthUserFile.

    +
    top
    +
    +

    Posibles Problemas

    +

    Debido a la forma en que se especifica la autenticación básica, + su nombre de usuario y la contraseña deben ser verificados cada vez + que se solicita un documento desde el servidor. Esto es, incluso si  + se  vuelve a cargar la misma página, y para cada imagen de la página (si +    provienen de un directorio protegido). Como se puede imaginar, esto +    ralentiza las cosas un poco. La cantidad que ralentiza las cosas es + proporcional al tamaño del archivo de contraseñas, porque tiene que + abrir ese archivo, recorrer lista de usuarios hasta que llega a su nombre. + Y tiene que hacer esto cada vez que se carga una página.

    + +

    Una consecuencia de esto, es que hay un limite práctico de cuantos + usuarios puedes introducir en el fichero de contraseñas. Este límite + variará dependiendo de la máquina en la que tengas el servidor, + pero puedes notar ralentizaciones en cuanto se metan cientos de entradas, + y por lo tanto consideraremos entonces otro método de autenticación + en ese momento. +

    +
    top
    +
    +

    Método alternativo de almacenamiento de las + contraseñas

    + +

    Debido a que el almacenamiento de las contraseñas en texto plano tiene + el problema mencionado anteriormente, puede que se prefiera guardar + las contraseñas en otro lugar como por ejemplo una base de datos. +

    + +

    Los módulos mod_authn_dbm y mod_authn_dbd son + dos módulos que hacen esto posible. En vez de seleccionar la directiva de fichero + AuthBasicProvider , en su lugar + se puede elegir dbm o dbd como formato de almacenamiento.

    + +

    Para seleccionar los ficheros de tipo dbm en vez de texto plano, podremos hacer algo parecido a lo siguiente:

    + +
    <Directory "/www/docs/private">
    +    AuthName "Private"
    +    AuthType Basic
    +    AuthBasicProvider dbm
    +    AuthDBMUserFile "/www/passwords/passwd.dbm"
    +    Require valid-user
    +</Directory>
    + + +

    Hay otras opciones disponibles. Consulta la documentación de + mod_authn_dbm para más detalles.

    +
    top
    +
    +

    Uso de múltiples proveedores

    + +

    Con la introducción de la nueva autenticación basada en un proveedor y + una arquitectura de autorización, ya no estaremos restringidos a un único + método de autenticación o autorización. De hecho, cualquier número de + los proveedores pueden ser mezclados y emparejados para ofrecerle + exactamente el esquema que se adapte a sus necesidades. + En el siguiente ejemplo, veremos como ambos proveedores tanto el fichero + como el LDAP son usados en la autenticación: +

    + +
    <Directory "/www/docs/private">
    +    AuthName "Private"
    +    AuthType Basic
    +    AuthBasicProvider file ldap
    +    AuthUserFile "/usr/local/apache/passwd/passwords"
    +    AuthLDAPURL ldap://ldaphost/o=yourorg
    +    Require valid-user
    +</Directory>
    + + +

    En este ejemplo el fichero, que actúa como proveedor, intentará autenticar + primero al usuario. Si no puede autenticar al usuario, el proveedor del LDAP + será llamado para que realice la autenticación. + Esto permite al ámbito de autenticación ser amplio, si su organización + implementa más de un tipo de almacén de autenticación. + Otros escenarios de autenticación y autorización pueden incluir la + mezcla de un tipo de autenticación con un tipo diferente de autorización. + Por ejemplo, autenticar contra un fichero de contraseñas pero autorizando + dicho acceso mediante el directorio del LDAP.

    + +

    Así como múltiples métodos y proveedores de autenticación pueden + ser implementados, también pueden usarse múltiples formas de + autorización. + En este ejemplo ambos ficheros de autorización de grupo así como + autorización de grupo mediante LDAP va a ser usado: +

    + +
    <Directory "/www/docs/private">
    +    AuthName "Private"
    +    AuthType Basic
    +    AuthBasicProvider file
    +    AuthUserFile "/usr/local/apache/passwd/passwords"
    +    AuthLDAPURL ldap://ldaphost/o=yourorg
    +    AuthGroupFile "/usr/local/apache/passwd/groups"
    +    Require group GroupName
    +    Require ldap-group cn=mygroup,o=yourorg
    +</Directory>
    + + +

    Para llevar la autorización un poco más lejos, las directivas + de autorización de contenedores tales como + <RequireAll> + and + <RequireAny> + nos permiten aplicar una lógica de en qué orden se manejará la autorización dependiendo + de la configuración y controlada a través de ella. + Mire también Contenedores de + Autorización para ejemplos de cómo pueden ser aplicados.

    + +
    top
    +
    +

    Más allá de la Autorización

    + +

    El modo en que la autorización puede ser aplicada es ahora mucho más flexible + que us solo chequeo contra un almacén de datos (contraseñas). Ordenando la + lógica y escoger la forma en que la autorización es realizada, ahora es posible +

    + +

    Aplicando la lógica y ordenación

    +

    Controlar el cómo y en qué orden se va a aplicar la autorización ha + sido un misterio en el pasado. En Apache 2.2 un proveedor del + mecanismo de autenticación fue introducido para disociar el proceso actual + de autenticación y soportar funcionalidad. + Uno de los beneficios secundarios fue que los proveedores de autenticación + podían ser configurados y llamados en un orden especifico que no dependieran + en el orden de carga del propio modulo. + Este proveedor de dicho mecanismo, ha sido introducido en la autorización + también. Lo que esto significa es que la directiva + Require + no sólo especifica que método de autorización deberá ser usado, si no + también especifica el orden en que van a ser llamados. Múltiples + métodos de autorización son llamados en el mismo orden en que la directiva + Require aparece en la + configuración. +

    + +

    + Con la Introducción del contenedor de directivas de autorización tales como + <RequireAll> + y + <RequireAny>, + La configuración también tiene control sobre cuándo se llaman a los métodos + de autorización y qué criterios determinan cuándo se concede el acceso. + Vease + Contenedores de autorización + Para un ejemplo de cómo pueden ser utilizados para expresar una lógica + más compleja de autorización. +

    + +

    + Por defecto todas las directivas + Require + son manejadas como si estuvieran contenidas en una directiva + <RequireAny>. + En otras palabras, Si alguno de los métodos de autorización + especificados tiene éxito, se concede la autorización. +

    + + + +

    Uso de los proveedores de autorización para + el control de acceso

    + +

    + La autenticación de nombre de usuario y contraseña es sólo parte + de toda la historia que conlleva el proceso. Frecuentemente quiere + dar acceso a la gente en base a algo más que lo que son. + Algo como de donde vienen. +

    + +

    + Los proveedores de autorización all, + env, host y ip + te permiten denegar o permitir el acceso basándose en otros + criterios como el nombre de la máquina o la IP de la máquina que + realiza la consulta para un documento. +

    + +

    + El uso de estos proveedores se especifica a través de la directiva + Require. + La directiva registra los proveedores de autorización que serán llamados + durante la solicitud de la fase del proceso de autorización. Por ejemplo: +

    + +
    Require ip address
    +        
    + + +

    + Donde address es una dirección IP (o una dirección IP parcial) + o bien: +

    + +
    Require host domain_name
    +        
    + + +

    + Donde domain_name es el nombre completamente cualificado de un nombre + de dominio (FQDN) (o un nombre parcial del dominio); + puede proporcionar múltiples direcciones o nombres de dominio, si se desea. +

    + +

    + Por ejemplo, si alguien envía spam a su tablón de mensajes y desea + mantenerlos alejados, podría hacer lo siguiente:

    + +
    <RequireAll>
    +    Require all granted
    +    Require not ip 10.252.46.165
    +</RequireAll>
    + + +

    + Visitantes que vengan desde esa IP no serán capaces de ver el contenido + que cubre esta directiva. Si, en cambio, lo que se tiene es el nombre de + la máquina, en vez de la dirección IP, podría usar: +

    + +
    <RequireAll>
    +    Require all granted
    +    Require not host host.example.com
    +</RequireAll>
    + + +

    + Y, si lo que se quiere es bloquear el acceso desde un determinado dominio + (bloquear el acceso desde el dominio entero), puede especificar parte + de la dirección o del propio dominio a bloquear: +

    + +
    <RequireAll>
    +    Require all granted
    +    Require not ip 192.168.205
    +    Require not host phishers.example.com moreidiots.example
    +    Require not host ke
    +</RequireAll>
    + + +

    + Usando <RequireAll> + con múltiples directivas <Require>, cada una negada con un not, + Sólo permitirá el acceso, si todas las condiciones negadas son verdaderas. + En otras palabras, el acceso será bloqueado, si cualquiera de las condiciones + negadas fallara. +

    + + + +

    Compatibilidad de Control de Acceso con versiones + anteriores

    + +

    + Uno de los efectos secundarios de adoptar proveedores basados en + mecanismos de autenticación es que las directivas anteriores + Order, + Allow, + Deny y + Satisfy ya no son necesarias. + Sin embargo, para proporcionar compatibilidad con configuraciones antiguas, + estas directivas se han movido al módulo mod_access_compat. +

    + +

    Nota:

    +

    + Las directivas proporcionadas por mod_access_compat + han quedado obsoletas por mod_authz_host. Mezclar + directivas antiguas como + Order, + Allow ó + Deny con las nuevas + como + Require + es técnicamente posible pero desaconsejable. El módulo + mod_access_compat se creó para soportar configuraciones + que contuvieran sólo directivas antiguas para facilitar la actualización + a la versión 2.4. + Por favor revise la documentación de + actualización para más información al + respecto. +

    +
    + + +
    top
    +
    +

    Cache de Autenticación

    +

    + Puede haber momentos en que la autenticación ponga una carga + inaceptable en el proveedor (de autenticación) o en tu red. + Esto suele afectar a los usuarios de mod_authn_dbd + (u otros proveedores de terceros/personalizados). + Para lidiar con este problema, HTTPD 2.3/2.4 introduce un nuevo proveedor + de caché mod_authn_socache para cachear las credenciales + y reducir la carga en el proveedor(es) original. +

    +

    + Esto puede ofrecer un aumento de rendimiento sustancial para algunos usuarios. +

    +
    top
    +
    +

    Más información

    + +

    + También debería leer la documentación para + mod_auth_basic y mod_authz_host + la cuál contiene más información de como funciona todo esto. + La directiva <AuthnProviderAlias> puede también ayudar + a la hora de simplificar ciertas configuraciones de autenticación. +

    + +

    + Los diferentes algoritmos de cifrado que están soportados por Apache + para la autenticación se explican en + Cifrado de Contraseñas. +

    + +

    + Y tal vez quiera ojear la documentación de "how to" + Control de Acceso donde se mencionan temas + relacionados.

    + +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comentarios

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/auth.html.fr.utf8 b/docs/manual/howto/auth.html.fr.utf8 new file mode 100644 index 0000000..a5faa5d --- /dev/null +++ b/docs/manual/howto/auth.html.fr.utf8 @@ -0,0 +1,681 @@ + + + + + +Authentification et autorisation - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Authentification et autorisation

    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    L'authentification est un processus qui vous permet de vérifier + qu'une personne est bien celle qu'elle prétend être. L'autorisation + est un processus qui permet à une personne d'aller là où elle veut + aller, ou d'obtenir les informations qu'elle désire.

    + +

    Pour le contrôle d'accès en général, voir le How-To Contrôle d'accès.

    +
    + +
    top
    +
    +

    Modules et directives concernés

    + +

    Trois groupes de modules sont concernés par le processus +d'authentification et d'autorisation. Vous devrez utiliser au moins un +module de chaque groupe.

    + + + +

    On peut aussi ajouter mod_authn_core et + mod_authz_core. Ces modules implémentent des + directives générales qui opèrent au dessus de tous les modules + d'authentification.

    + +

    Le module mod_authnz_ldap est un fournisseur + d'authentification et d'autorisation. Le module + mod_authz_host fournit une autorisation et un + contrôle d'accès basés sur le nom du serveur, l'adresse IP ou + certaines caractéristiques de la requête, mais ne fait pas partie du + système fournisseur d'authentification. Le module + mod_access_compat a été créé à des fins de + compatibilité ascendante avec mod_access.

    + +

    Vous devriez aussi jeter un coup d'oeil au manuel de recettes de Contrôle d'accès, qui décrit les différentes + méthodes de contrôle d'accès à votre serveur.

    + +
    top
    +
    +

    Introduction

    +

    Si votre site web contient des informations sensibles ou + destinées seulement à un groupe de personnes restreint, les + techniques exposées dans cet article vont vous aider à vous assurer + que les personnes qui ont accès à ces pages sont bien celles + auxquelles vous avez donné l'autorisation d'accès.

    + +

    Cet article décrit les méthodes "standards" de protection de + parties de votre site web que la plupart d'entre vous sont appelés à + utiliser.

    + +

    Note :

    +

    Si vos données ont un réel besoin de sécurisation, prévoyez + l'utilisation de mod_ssl en plus de toute méthode + d'authentification.

    +
    +
    top
    +
    +

    Les prérequis

    +

    Les directives décrites dans cet article devront être insérées + soit au niveau de la configuration de votre serveur principal (en + général dans une section <Directory>), soit au niveau de la + configuration des répertoires (fichiers .htaccess)

    + +

    Si vous envisagez l'utilisation de fichiers + .htaccess, la configuration de votre serveur devra + permettre l'ajout de directives d'authentification dans ces + fichiers. Pour ce faire, on utilise la directive AllowOverride, qui spécifie quelles + directives pourront éventuellement contenir les fichiers de + configuration de niveau répertoire.

    + +

    Comme il est ici question d'authentification, vous aurez besoin + d'une directive AllowOverride + du style :

    + +
    AllowOverride AuthConfig
    + + +

    Si vous avez l'intention d'ajouter les directives directement + dans le fichier de configuration principal, vous devrez bien entendu + posséder les droits en écriture sur ce fichier.

    + +

    Vous devrez aussi connaître un tant soit peu la structure des + répertoires de votre serveur, ne serait-ce que pour savoir où se + trouvent certains fichiers. Cela ne devrait pas présenter de grandes + difficultés, et nous essaierons de clarifier tout ça lorsque le besoin + s'en fera sentir.

    + +

    Enfin, vous devrez vous assurer que les modules + mod_authn_core et mod_authz_core + ont été soit compilés avec le binaire httpd, soit chargés par le + fichier de configuration httpd.conf. Ces deux modules fournissent + des directives générales et des fonctionnalités qui sont critiques + quant à la configuration et l'utilisation de l'authentification et + de l'autorisation au sein du serveur web.

    +
    top
    +
    +

    Mise en oeuvre

    +

    Nous décrivons ici les bases de la protection par mot de passe + d'un répertoire de votre serveur.

    + +

    Vous devez en premier lieu créer un fichier de mots de passe. La + méthode exacte selon laquelle vous allez créer ce fichier va varier + en fonction du fournisseur d'authentification choisi. Mais nous + entrerons dans les détails plus loin, et pour le moment, nous nous + contenterons d'un fichier de mots de passe en mode texte.

    + +

    Ce fichier doit être enregistré à un endroit non accessible + depuis le web, de façon à ce que les clients ne puissent pas le + télécharger. Par exemple, si vos documents sont servis à partir de + /usr/local/apache/htdocs, vous pouvez enregistrer le + fichier des mots de passe dans + /usr/local/apache/passwd.

    + +

    L'utilitaire htpasswd fourni avec Apache + permet de créer ce fichier. Vous le trouverez dans le répertoire + bin de votre installation d'Apache. Si vous avez + installé Apache à partir d'un paquetage tiers, il sera probablement + dans le chemin par défaut de vos exécutables.

    + +

    Pour créer le fichier, tapez :

    + +

    + htpasswd -c /usr/local/apache/passwd/passwords rbowen +

    + +

    htpasswd vous demandera d'entrer le mot de + passe, et de le retaper pour confirmation :

    + +

    + # htpasswd -c /usr/local/apache/passwd/passwords rbowen
    + New password: mot-de-passe
    + Re-type new password: mot-de-passe
    + Adding password for user rbowen +

    + +

    Si htpasswd n'est pas dans le chemin par + défaut de vos exécutables, vous devrez bien entendu entrer le chemin + complet du fichier. Dans le cas d'une installation par défaut, il se + trouve à /usr/local/apache2/bin/htpasswd.

    + +

    Ensuite, vous allez devoir configurer le serveur de façon à ce + qu'il demande un mot de passe et lui préciser quels utilisateurs ont + l'autorisation d'accès. Pour ce faire, vous pouvez soit éditer le + fichier httpd.conf, soit utiliser un fichier + .htaccess. Par exemple, si vous voulez protéger le + répertoire /usr/local/apache/htdocs/secret, vous pouvez + utiliser les directives suivantes, soit dans le fichier + /usr/local/apache/htdocs/secret/.htaccess, soit dans le + fichier httpd.conf à l'intérieur d'une section <Directory + "/usr/local/apache/htdocs/secret"> :

    + +
    AuthType Basic
    +AuthName "Restricted Files"
    +# (Following line optional)
    +AuthBasicProvider file
    +AuthUserFile "/usr/local/apache/passwd/passwords"
    +Require user rbowen
    + + +

    Examinons ces directives une à une. La directive AuthType définit la méthode + utilisée pour authentifier l'utilisateur. La méthode la plus + courante est Basic, et elle est implémentée par + mod_auth_basic. Il faut cependant garder à l'esprit + que l'authentification Basic transmet le mot de passe depuis le + client vers le serveur en clair. Cette méthode ne devra donc pas + être utilisée pour la transmission de données hautement sensibles si + elle n'est pas associée au module mod_ssl. Apache + supporte une autre méthode d'authentification : AuthType + Digest. Cette méthode est implémentée par le module mod_auth_digest et a été conçue pour + améliorer la sécurité. Ce but n'a cependant pas été atteint et il est préférable + de chiffrer la connexion avec mod_ssl.

    + +

    La directive AuthName définit + l'Identificateur (Realm) à utiliser avec + l'authentification. L'identificateur possède deux fonctions. Tout + d'abord, le client présente en général cette information à + l'utilisateur dans le cadre de la boîte de dialogue de mot de passe. + Ensuite, le client l'utilise pour déterminer quel mot de passe + envoyer pour une zone authentifiée donnée.

    + +

    Ainsi par exemple, une fois un client authentifié dans la zone + "Fichiers réservés", il soumettra à nouveau + automatiquement le même mot de passe pour toute zone du même serveur + marquée de l'identificateur "Fichiers réservés". De + cette façon, vous pouvez éviter à un utilisateur d'avoir à saisir + plusieurs fois le même mot de passe en faisant partager le même + identificateur entre plusieurs zones réservées. Bien entendu et pour + des raisons de sécurité, le client devra redemander le mot + de passe chaque fois que le nom d'hôte du serveur sera modifié.

    + +

    La directive AuthBasicProvider est, dans ce + cas, facultative, car file est la valeur par défaut + pour cette directive. Par contre, cette directive sera obligatoire + si vous utilisez une autre source d'authentification comme + mod_authn_dbm ou + mod_authn_dbd.

    + +

    La directive AuthUserFile définit le chemin + du fichier de mots de passe que nous venons de créer avec + htpasswd. Si vous possédez un grand nombre + d'utilisateurs, la durée de la recherche dans un fichier texte pour + authentifier un utilisateur à chaque requête va augmenter + rapidement, et pour pallier cet inconvénient, Apache peut aussi + stocker les données relatives aux + utilisateurs dans des bases de données rapides. Le module + mod_authn_dbm fournit la directive AuthDBMUserFile. Les programmes dbmmanage et htdbm permettent de + créer et manipuler ces fichiers. Enfin, de nombreux modules tiers + fournissent d'autres types d'authentification.

    + +

    Enfin, la directive Require implémente la partie + autorisation du processus en définissant l'utilisateur autorisé à + accéder à cette zone du serveur. Dans la section suivante, nous + décrirons les différentes méthodes d'utilisation de la directive + Require.

    +
    top
    +
    +

    Autorisation d'accès à +plusieurs personnes

    +

    Les directives ci-dessus n'autorisent qu'une personne (quelqu'un + possédant le nom d'utilisateur rbowen) à accéder au + répertoire. Dans la plupart des cas, vous devrez autoriser + l'accès à plusieurs personnes. C'est ici + qu'intervient la directive AuthGroupFile.

    + +

    Si vous voulez autoriser l'accès à plusieurs personnes, vous + devez créer un fichier de groupes qui associe des noms de groupes + avec une liste d'utilisateurs de ce groupe. Le format de ce fichier + est très simple, et vous pouvez le créer avec votre éditeur favori. + Son contenu se présente comme suit :

    + +

    + Nom-de-groupe: rbowen dpitts sungo rshersey +

    + +

    Il s'agit simplement une liste des membres du groupe sous la + forme d'une ligne séparée par des espaces.

    + +

    Pour ajouter un utilisateur à votre fichier de mots de passe + préexistant, entrez :

    + +

    + htpasswd /usr/local/apache/passwd/passwords dpitts +

    + +

    Vous obtiendrez le même effet qu'auparavant, mais le mot de passe + sera ajouté au fichier, plutôt que d'en créer un nouveau (C'est le + drapeau -c qui permet de créer un nouveau fichier de + mots de passe)..

    + +

    Maintenant, vous devez modifier votre fichier + .htaccess ou la section <Directory> comme suit :

    + +
    AuthType Basic
    +AuthName "By Invitation Only"
    +# Optional line:
    +AuthBasicProvider file
    +AuthUserFile "/usr/local/apache/passwd/passwords"
    +AuthGroupFile "/usr/local/apache/passwd/groups"
    +Require group GroupName
    + + +

    Maintenant, quiconque appartient au groupe + Nom-de-groupe, et possède une entrée dans le fichier + password pourra accéder au répertoire s'il tape le bon + mot de passe.

    + +

    Il existe une autre méthode moins contraignante pour autoriser + l'accès à plusieurs personnes. Plutôt que de créer un fichier de + groupes, il vous suffit d'ajouter la directive suivante :

    + +
    Require valid-user
    + + +

    Le remplacement de la ligne Require user rbowen par + la ligne Require valid-user autorisera l'accès à + quiconque possédant une entrée dans le fichier password, et ayant + tapé le bon mot de passe.

    +
    top
    +
    +

    Problèmes possibles

    +

    L'authentification Basic est spécifiée d'une telle manière que + vos nom d'utilisateur et mot de passe doivent être vérifiés chaque + fois que vous demandez un document au serveur, et ceci même si vous + rechargez la même page, et pour chaque image contenue dans la page + (si elles sont situées dans un répertoire protégé). Comme vous + pouvez l'imaginer, ceci ralentit un peu le fonctionnement. La mesure + dans laquelle le fonctionnement est ralenti est proportionnelle à la + taille du fichier des mots de passe, car ce dernier doit être ouvert + et la liste des utilisateurs parcourue jusqu'à ce que votre nom soit + trouvé, et ceci chaque fois qu'une page est chargée.

    + +

    En conséquence, ce ralentissement impose une limite pratique au + nombre d'utilisateurs que vous pouvez enregistrer dans un fichier de + mots de passe. Cette limite va varier en fonction des performances + de votre serveur, mais vous commencerez à remarquer un + ralentissement lorsque vous atteindrez quelques centaines + d'utilisateurs, et serez alors appelés à utiliser une méthode + d'authentification différente.

    +
    top
    +
    +

    Autre méthode de stockage des mots de +passe

    + +

    Suite au problème évoqué précédemment et induit par le stockage + des mots de passe dans un fichier texte, vous pouvez être appelé à + stocker vos mots de passe d'une autre manière, par exemple dans une + base de données.

    + +

    Pour y parvenir, on peut utiliser les modules + mod_authn_dbm ou mod_authn_dbd. + Vous pouvez choisir comme format de stockage dbm ou + dbd à la place de file pour la directive + AuthBasicProvider.

    + +

    Par exemple, pour sélectionner un fichier dbm à la place d'un + fichier texte :

    + +
    <Directory "/www/docs/private">
    +
    +    AuthName "Private"
    +    AuthType Basic
    +    AuthBasicProvider dbm
    +    AuthDBMUserFile "/www/passwords/passwd.dbm"
    +    Require valid-user
    +
    +</Directory>
    + + +

    D'autres options sont disponibles. Consultez la documentation de + mod_authn_dbm pour plus de détails.

    +
    top
    +
    +

    Utilisation de plusieurs fournisseurs +d'authentification

    + +

    Depuis l'arrivée des nouvelles architecture d'autorisation et + d'authentification basées sur les fournisseurs, vous n'êtes plus + limité à une méthode d'authentification et d'autorisation + unique. En fait, on peut panacher autant de fournisseurs que l'on + veut, ce qui vous permet d'élaborer l'architecture qui correspond + exactement à vos besoins. Dans l'exemple suivant, on utilise + conjointement les fournisseurs d'authentification + file et LDAP :

    + +
    <Directory "/www/docs/private">
    +
    +    AuthName "Private"
    +    AuthType Basic
    +    AuthBasicProvider file ldap
    +    AuthUserFile "/usr/local/apache/passwd/passwords"
    +    AuthLDAPURL ldap://ldaphost/o=yourorg
    +    Require valid-user
    +
    +</Directory>
    + + +

    Dans cet exemple, le fournisseur file va tenter d'authentifier + l'utilisateur en premier. S'il n'y parvient pas, le fournisseur LDAP + sera sollicité. Ceci permet l'élargissement des possibilités + d'authentification si votre organisation implémente plusieurs types + de bases d'authentification. D'autres scénarios d'authentification + et d'autorisation peuvent associer un type d'authentification avec + un autre type d'autorisation. Par exemple, une authentification + basée sur un fichier de mots de passe peut permettre l'attribution + d'autorisations basée sur un annuaire LDAP.

    + +

    Tout comme plusieurs fournisseurs d'authentification peuvent être + implémentés, on peut aussi utiliser plusieurs méthodes + d'autorisation. Dans l'exemple suivant, on utilise à la fois une + autorisation à base de fichier de groupes et une autorisation à base + de groupes LDAP.

    + +
    <Directory "/www/docs/private">
    +
    +    AuthName "Private"
    +    AuthType Basic
    +    AuthBasicProvider file
    +    AuthUserFile "/usr/local/apache/passwd/passwords"
    +    AuthLDAPURL ldap://ldaphost/o=yourorg
    +    AuthGroupFile "/usr/local/apache/passwd/groups"
    +    Require group GroupName
    +    Require ldap-group cn=mygroup,o=yourorg
    +
    +</Directory>
    + + +

    Pour un scénario d'autorisation un peu plus avancé, des + directives de conteneur d'autorisation comme <RequireAll> et + <RequireAny> permettent d'appliquer une + logique telle que l'ordre dans lequel les autorisations sont + appliquées peut être entièrement contrôlé au niveau de la + configuration. Voir Conteneurs + d'autorisations pour un exemple de ce contrôle.

    + +
    top
    +
    +

    Pour aller plus loin qu'une simple +autorisation

    + +

    La manière dont les autorisations sont accordées est désormais + beaucoup plus souple qu'une simple vérification auprès d'une seule + base de données. Il est maintenant possible de choisir l'ordre, la + logique et la manière selon lesquels une autorisation est + accordée.

    + +

    Appliquer logique et + ordonnancement

    +

    Le contrôle de la manière et de l'ordre selon lesquels le + processus d'autorisation était appliqué + constituait une sorte de mystère par + le passé. Dans Apache 2.2, un mécanisme d'authentification basé + sur les fournisseurs a été développé afin de séparer le + véritable processus d'authentification de l'autorisation et ses + différentes fonctionnalités. Un des avantages colatéraux + résidait dans le fait que les fournisseurs d'authentification + pouvaient être configurés et appelés selon un ordre particulier + indépendant de l'ordre de chargement du module auth proprement + dit. Ce mécanisme basé sur les fournisseurs a été étendu au + processus d'autorisation. Ceci signifie que la directive + Require définit + non seulement quelles méthodes d'autorisation doivent être + utilisées, mais aussi l'ordre dans lequel elles sont appelées. + Les méthodes d'autorisation sont appelées selon l'ordre dans + lequel les directives Require apparaissent dans la + configuration.

    + +

    Avec l'introduction des directives de conteneur + d'autorisations <RequireAll> + et <RequireAny>, la + configuration contrôle aussi le moment où les méthodes + d'autorisation sont appelées, et quels critères déterminent + l'autorisation d'accès. Voir Conteneurs + d'autorisations pour un exemple de la manière de les + utiliser pour exprimer des logiques d'autorisation + complexes.

    + +

    Par défaut, toutes les directives Require sont + traitées comme si elles étaient contenues dans une directive + <RequireAny>. En d'autres termes, il + suffit + qu'une méthode d'autorisation s'applique avec succès pour que + l'autorisation soit accordée.

    + + + +

    Utilisation de fournisseurs + d'autorisation pour le contrôle d'accès

    +

    La vérification du nom d'utilisateur et du mot de passe ne + constituent qu'un aspect des méthodes d'authentification. + Souvent, le contrôle d'accès à certaines personnes n'est pas + basé sur leur identité ; il peut dépendre, par exemple de leur + provenance.

    + +

    Les fournisseurs d'autorisation all, + env, host et ip vous + permettent d'accorder ou refuser l'accès en + fonction de critères tels que le nom d'hôte ou l'adresse + IP de la machine qui effectue la requête.

    + +

    L'utilisation de ces fournisseurs est spécifiée à l'aide de + la directive Require. Cette directive + permet d'enregistrer quels fournisseurs d'autorisation + seront appelés dans le processus d'autorisation au cours du + traitement de la requête. Par exemple :

    + +
    Require ip address
    + + +

    où adresse est une adresse IP (ou une adresse IP + partielle) ou :

    + +
    Require host domain_name
    + + +

    où nom_domaine est un nom de domaine entièrement + qualifé (ou un nom de domaine partiel) ; vous pouvez indiquer + plusieurs adresses ou noms de domaines, si vous le désirez.

    + +

    Par exemple, si vous voulez rejeter les spams dont une + machine vous inonde, vous pouvez utiliser ceci :

    + +
    <RequireAll>
    +    Require all granted
    +    Require not ip 10.252.46.165
    +</RequireAll>
    + + +

    Ainsi, les visiteurs en provenance de cette adresse ne + pourront pas voir le contenu concerné par cette directive. Si, + par contre, vous connaissez le nom de la machine, vous pouvez + utiliser ceci :

    + +
    <RequireAll>
    +    Require all granted
    +    Require not host host.example.com
    +</RequireAll>
    + + +

    Et si vous voulez interdire l'accès à toutes les machines + d'un domaine, vous pouvez spécifier une partie seulement de + l'adresse ou du nom de domaine :

    + +
    <RequireAll>
    +    Require all granted
    +    Require not ip 192.168.205
    +    Require not host phishers.example.com moreidiots.example
    +    Require not host ke
    +</RequireAll>
    + + +

    L'utilisation de la directive <RequireAll> + avec de multiples directives <Require>, toutes avec la négation + not, n'accordera l'accès que si toutes les + conditions négatives sont vérifiées. En d'autres termes, l'accès + sera refusé si au moins une des conditions négatives n'est pas + vérifiée.

    + + + +

    Compatibilité ascendante du contrôle + d'accès

    +

    L'adoption d'un mécanisme à base de fournisseurs pour + l'authentification, a pour effet colatéral de rendre inutiles + les directives Order, Allow, Deny et Satisfy. Cependant, et à + des fins de compatibilité ascendante vers les anciennes + configurations, ces directives ont été déplacées vers le module + mod_access_compat.

    + +

    Note

    +

    Les directives fournies par le module + mod_access_compat sont devenues obsolètes depuis + la refonte du module mod_authz_host. Mélanger d'anciennes + directives comme Order, Allow ou Deny avec des nouvelles comme + Require est techniquement + possible mais déconseillé. En effet, mod_access_compat a + été conçu pour supporter des configurations ne contenant que des anciennes + directives afin de faciliter le passage à la version 2.4. Voir le document + upgrading pour plus de détails. +

    +
    + + +
    top
    +
    +

    Mise en cache de l'authentification

    +

    Dans certains cas, l'authentification constitue une charge + inacceptable pour un fournisseur d'authentification ou votre réseau. + Ceci est susceptible d'affecter les utilisateurs du module + mod_authn_dbd (ou les fournisseurs + tiers/personnalisés). Pour résoudre ce problème, HTTPD 2.3/2.4 + propose un nouveau fournisseur de mise en cache, + mod_authn_socache, qui permet de mettre en cache + les données d'authentification, et ainsi réduire la charge du/des + fournisseurs(s) originels.

    +

    Cette mise en cache apportera un gain en performance substantiel + à certains utilisateurs.

    +
    top
    +
    +

    Pour aller plus loin . . .

    +

    Vous pouvez aussi lire la documentation de + mod_auth_basic et mod_authz_host + qui contient des informations supplémentaires à propos du + fonctionnement de tout ceci. + Certaines configurations d'authentification peuvent aussi être + simplifiées à l'aide de la directive <AuthnProviderAlias>.

    + +

    Les différents algorithmes de chiffrement supportés par Apache + pour authentifier les données sont expliqués dans PasswordEncryptions.

    + +

    Enfin vous pouvez consulter la recette Contrôle + d'accès, qui décrit un certain nombre de situations en relation + avec le sujet.

    + +
    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/auth.html.ja.utf8 b/docs/manual/howto/auth.html.ja.utf8 new file mode 100644 index 0000000..d5b62d0 --- /dev/null +++ b/docs/manual/howto/auth.html.ja.utf8 @@ -0,0 +1,692 @@ + + + + + +èªè¨¼ã€æ‰¿èªã€ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    èªè¨¼ã€æ‰¿èªã€ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡

    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + +

    「èªè¨¼ã€ã¨ã¯ã€èª°ã‹ãŒè‡ªåˆ†ã¯èª°ã§ã‚ã‚‹ã‹ã‚’主張ã—ãŸå ´åˆã«ã€ + ãれを確èªã™ã‚‹ãŸã‚ã®å…¨éŽç¨‹ã‚’指ã—ã¾ã™ã€‚「承èªã€ã¨ã¯ã€ + 誰ã‹ãŒè¡ŒããŸã„場所ã«è¡Œã‘るよã†ã«ã€ã‚ã‚‹ã„ã¯æ¬²ã—ã„æƒ…報を + å¾—ã‚‹ã“ã¨ãŒã§ãるよã†ã«ã™ã‚‹ãŸã‚ã®å…¨éŽç¨‹ã‚’指ã—ã¾ã™ã€‚

    +
    + +
    top
    +
    +

    関連ã™ã‚‹ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–

    +

    èªè¨¼ã¨æ‰¿èªã®å‡¦ç†ã«é–¢é€£ã™ã‚‹ 3 種類ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãŒã‚りã¾ã™ã€‚ +ãれãžã‚Œå°‘ãªãã¨ã‚‚ã²ã¨ã¤ãšã¤å¿…è¦ã§ã™ã€‚

    + + + +

    ã“れらã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã«åŠ ãˆã¦ã€mod_authn_core + 㨠mod_authz_core ãŒã‚りã¾ã™ã€‚ + ã“ã® 2 ã¤ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¯èªè¨¼ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã«å…±é€šãªã‚³ã‚¢ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã‚’ + 実装ã—ã¦ã„ã¾ã™ã€‚

    + +

    mod_authnz_ldap ã¯èªè¨¼ãƒ—ロãƒã‚¤ãƒ€ã¨æ‰¿èªãƒ—ロãƒã‚¤ãƒ€ã® + ä¸¡æ–¹ã®æ©Ÿèƒ½ã‚’æŒã£ã¦ã„ã¾ã™ã€‚ + mod_authz_host ã¯ãƒ›ã‚¹ãƒˆåã€IP アドレスや + リクエストã®ç‰¹å¾´ã«åŸºã¥ã„ãŸã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã‚’行ã„ã¾ã™ãŒã€ + èªè¨¼ãƒ—ロãƒã‚¤ãƒ€ã®ã‚·ã‚¹ãƒ†ãƒ ã®ä¸€éƒ¨ã§ã¯ã‚りã¾ã›ã‚“。 + mod_access ã¨ã®å¾Œæ–¹äº’æ›æ€§ã®ãŸã‚〠+ æ–°ã—ã„モジュール㮠mod_access_compat ãŒã‚りã¾ã™ã€‚

    + +

    様々ãªã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã®è¡Œãªã„æ–¹ã«ã¤ã„ã¦ã¯ã€ + ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã®æ–¹æ³•ã‚’ã”覧ãã ã•ã„。

    + +
    top
    +
    +

    ã¯ã˜ã‚ã«

    +

    ã‚‚ã—æ©Ÿå¯†ã®æƒ…報やã€ã”ãã”ã少数グループã®äººå‘ã‘ã®æƒ…報を + ウェブサイトã«ç½®ãã®ã§ã‚れã°ã€ã“ã®æ–‡æ›¸ã«æ›¸ã‹ã‚Œã¦ã„ã‚‹ + テクニックを使ã†ã“ã¨ã§ã€ãã®ãƒšãƒ¼ã‚¸ã‚’見ã¦ã„る人ãŸã¡ãŒ + 望ã¿ã®äººãŸã¡ã§ã‚ã‚‹ã“ã¨ã‚’確実ã«ã§ãã‚‹ã§ã—ょã†ã€‚

    + +

    ã“ã®æ–‡æ›¸ã§ã¯ã€å¤šãã®äººãŒæŽ¡ç”¨ã™ã‚‹ã§ã‚ã‚ã†ã€ + ウェブサイトã®ä¸€éƒ¨åˆ†ã‚’ä¿è­·ã™ã‚‹ã€Œä¸€èˆ¬çš„ãªã€ + 方法ã«ã¤ã„ã¦ã‚«ãƒãƒ¼ã—ã¦ã„ã¾ã™ã€‚

    + +

    注æ„

    +

    ãƒ‡ãƒ¼ã‚¿ãŒæœ¬å½“ã«æ©Ÿå¯†ãªã®ã§ã‚れã°ã€èªè¨¼ã«åŠ ãˆã¦ã•ら㫠+ mod_ssl を使ã†ã¨è‰¯ã„ã§ã—ょã†ã€‚

    +
    +
    top
    +
    +

    準備

    +

    ã“ã®æ–‡æ›¸ã§å–り扱ã‚れるディレクティブã¯ã€ + メインサーãƒè¨­å®šãƒ•ァイル (普通㯠+ <Directory> + セクション中) ã‹ã€ã‚ã‚‹ã„ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ¯Žã®è¨­å®šãƒ•ァイル + (.htaccess ファイル) ã‹ã§ç”¨ã„ã¾ã™ã€‚

    + +

    .htaccess ファイルを用ã„ã‚‹ã®ã§ã‚れã°ã€ + ã“れらã®ãƒ•ァイルã«èªè¨¼ç”¨ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã‚’ç½®ã‘るよã†ã« + サーãƒã®è¨­å®šã‚’ã—ãªã„ã¨ã„ã‘ãªã„ã§ã—ょã†ã€‚ã“れ㯠+ AllowOverride + ディレクティブã§å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ + AllowOverride + ディレクティブã§ã¯ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ¯Žã®è¨­å®šãƒ•ァイル中ã«ç½®ãã“ã¨ã®ã§ãã‚‹ + ディレクティブをã€ã‚‚ã—ã‚れã°ã€æŒ‡å®šã—ã¾ã™ã€‚

    + +

    èªè¨¼ã«ã¤ã„ã¦è©±ã‚’進ã‚ã¦ã„ã‚‹ã®ã§ã€æ¬¡ã®ã‚ˆã†ãª + AllowOverride + ディレクティブãŒå¿…è¦ã«ãªã‚‹ã§ã—ょã†ã€‚

    + +

    + AllowOverride AuthConfig +

    + +

    ãã†ã§ãªãã€ãƒ¡ã‚¤ãƒ³ã‚µãƒ¼ãƒè¨­å®šãƒ•ァイルã®ä¸­ã« + 直接置ãã®ã§ã‚れã°ã€å½“ç„¶ãªãŒã‚‰ãã®ãƒ•ァイルã¸ã®æ›¸ã込㿠+ 権é™ã‚’æŒã£ã¦ã„ãªã‘れã°ãªã‚‰ãªã„ã§ã—ょã†ã€‚

    + +

    ã¾ãŸã€ã©ã®ãƒ•ァイルãŒã©ã“ã«ä¿å­˜ã•れã¦ã„ã‚‹ã‹çŸ¥ã‚‹ãŸã‚ã«ã€ + サーãƒã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ§‹é€ ã«ã¤ã„ã¦å°‘ã—知ã£ã¦ãŠã + å¿…è¦ãŒã‚ã‚‹ã§ã—ょã†ã€‚ + ã“れã¯ãã‚“ãªã«é›£ã—ããªã„ã®ã§ã€ã“ã®æ–‡æ›¸ä¸­ã§ + ディレクトリ構造ã«ã¤ã„ã¦çŸ¥ã£ã¦ãŠãå¿…è¦ãŒã‚ã‚‹å ´é¢ã§ã¯ã€ + 明らã‹ã«ãªã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚

    + +

    mod_authn_core 㨠mod_authz_core + ã®ä¸¡æ–¹ãŒ httpd ãƒã‚¤ãƒŠãƒªã«é™çš„ã«çµ„ã¿è¾¼ã¿æ¸ˆã¿ã§ã‚ã‚‹ã‹ã€httpd.conf + 設定ファイルã§å‹•çš„ã«ãƒ­ãƒ¼ãƒ‰ã•れるã‹ã—ã¦ã€httpd ã«çµ„ã¿è¾¼ã¾ã‚Œã¦ã„ãªã‘れ㰠+ ãªã‚Šã¾ã›ã‚“。ã“れらã®äºŒã¤ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¯ã€è¨­å®šãƒ•ァイルã®ãªã‹ã§éžå¸¸ã« + é‡è¦ã§ã‚¦ã‚§ãƒ–サーãƒã®èªè¨¼ã¨æ‰¿èªã§ä½¿ç”¨ã•れるコアディレクティブ㨠+ ãã®æ©Ÿèƒ½ã‚’æä¾›ã—ã¦ã„ã¾ã™ã€‚

    +
    top
    +
    +

    動作ã•ã›ã‚‹

    +

    ã§ã¯ã€ã‚µãƒ¼ãƒä¸Šã®ã‚るディレクトリをパスワードã§ä¿è­·ã™ã‚‹ + 基本手順を示ã—ã¾ã™ã€‚

    + +

    ã¾ãšã¯ã˜ã‚ã«ã€ãƒ‘スワードファイルを作りã¾ã™ã€‚ + ã©ã®èªè¨¼ãƒ—ロãƒã‚¤ãƒ€ã‚’使ã†ã‹ã«ã‚ˆã£ã¦ã€ãƒ‘スワードファイル生æˆã®æ‰‹é †ã¯ + 大ããç•°ãªã‚Šã¾ã™ã€‚ã“ã“ã§ã®ä¾‹ã§ã¯ã€æ‰‹å§‹ã‚ã«ãƒ†ã‚­ã‚¹ãƒˆãƒ‘スワードファイルを + 使ã„ã¾ã™ã€‚

    + +

    ã“ã®ãƒ‘スワードファイルã¯ã€ã‚¦ã‚§ãƒ–ã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã§ãる場所㫠+ ç½®ãã¹ãã§ã¯ã‚りã¾ã›ã‚“。他ã®äººãŒãƒ‘スワードファイルを + ダウンロードã§ããªã„よã†ã«ã™ã‚‹ãŸã‚ã§ã™ã€‚例ãˆã°ã€ + /usr/local/apache/htdocs ã§ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’ + æä¾›ã—ã¦ã„ã‚‹ã®ã§ã‚れã°ã€ãƒ‘スワードファイル㯠+ /usr/local/apache/passwd + ãªã©ã«ç½®ã„ãŸæ–¹ãŒè‰¯ã„ã§ã—ょã†ã€‚

    + +

    ファイルを作るãŸã‚ã«ã¯ã€Apache 付属㮠htpasswd + を使ã„ã¾ã™ã€‚ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ Apache ã‚’ã©ã“ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—よã†ã¨ã‚‚〠+ インストールディレクトリ㮠bin + ディレクトリ以下ã«ç½®ã‹ã‚Œã¾ã™ã€‚サードãƒãƒ¼ãƒ†ã‚£è£½ã®ãƒ‘ッケージ㧠+ インストールã—ãŸå ´åˆã¯ã€å®Ÿè¡Œãƒ‘スã®ä¸­ã§è¦‹ã¤ã‹ã‚‹ã§ã—ょã†ã€‚

    + +

    ファイルを作るã«ã¯ã€æ¬¡ã®ã‚ˆã†ã«ã‚¿ã‚¤ãƒ—ã—ã¦ãã ã•ã„。

    + +

    + htpasswd -c /usr/local/apache/passwd/passwords rbowen +

    + +

    htpasswd ã¯ã€ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã‚’è¦æ±‚ã—ã€ãã®å¾Œ + 確èªã®ãŸã‚ã«ã‚‚ã†ä¸€åº¦å…¥åŠ›ã™ã‚‹ã‚ˆã†ã«è¦æ±‚ã—ã¦ãã¾ã™ã€‚

    + +

    + # htpasswd -c /usr/local/apache/passwd/passwords rbowen
    + New password: mypassword
    + Re-type new password: mypassword
    + Adding password for user rbowen +

    + +

    ã‚‚ã— htpasswd ãŒãƒ‘スã®ä¸­ã«å…¥ã£ã¦ã„ãªã„å ´åˆã¯ã€ + ã‚‚ã¡ã‚ã‚“ã€å®Ÿè¡Œã™ã‚‹ãŸã‚ã«ãƒ—ログラムã¾ã§ã®ãƒ•ルパスを + タイプã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚デフォルトã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«çŠ¶æ…‹ã§ã‚れã°ã€ + /usr/local/apache/bin/htpasswd + ã«ãƒ—ログラムãŒç½®ã‹ã‚Œã¦ã„ã¾ã™ã€‚

    + +

    次ã«ã€ã‚µãƒ¼ãƒãŒãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã‚’è¦æ±‚ã™ã‚‹ã‚ˆã†ã«è¨­å®šã—ã¦ã€ + ã©ã®ãƒ¦ãƒ¼ã‚¶ãŒã‚¢ã‚¯ã‚»ã‚¹ã‚’許ã•れã¦ã„ã‚‹ã‹ã‚’サーãƒã«çŸ¥ã‚‰ã›ãªã‘れ㰠+ ãªã‚Šã¾ã›ã‚“。 httpd.conf を編集ã™ã‚‹ã‹ + .htaccess ファイルを使用ã™ã‚‹ã‹ã§ + 設定ã—ã¾ã™ã€‚例ãˆã°ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª + /usr/local/apache/htdocs/secret + ã‚’ä¿è­·ã—ãŸã„å ´åˆã¯ã€ + /usr/local/apache/htdocs/secret/.htaccess + ã‹ httpd.conf 中㮠<Directory + /usr/local/apache/htdocs/secret> セクション㫠+ é…ç½®ã—ã¦ã€æ¬¡ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–を使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    + AuthType Basic
    + AuthName "Restricted Files"
    + # (Following line optional)
    + AuthBasicProvider file
    + AuthUserFile /usr/local/apache/passwd/passwords
    + Require user rbowen +

    + +

    個々ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã«ã¤ã„ã¦è¦‹ã¦ã¿ã¾ã—ょã†ã€‚ + AuthType + ディレクティブã¯ã©ã†ã„ã†èªè¨¼æ–¹æ³•ã§ãƒ¦ãƒ¼ã‚¶ã®èªè¨¼ã‚’行ã†ã‹ã‚’ + é¸æŠžã—ã¾ã™ã€‚æœ€ã‚‚ä¸€èˆ¬çš„ãªæ–¹æ³•㯠Basic + ã§ã€ã“れ㯠mod_auth_basic + ã§å®Ÿè£…ã•れã¦ã„ã¾ã™ã€‚ã—ã‹ã—ãªãŒã‚‰ã€ + ã“ã‚Œã¯æ°—を付ã‘ã‚‹ã¹ãé‡è¦ãªãƒã‚¤ãƒ³ãƒˆãªã®ã§ã™ãŒã€ + Basic èªè¨¼ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰ã‚µãƒ¼ãƒã¸ã€ + パスワードを暗å·åŒ–ã›ãšã«é€ã‚Šã¾ã™ã€‚ã§ã™ã‹ã‚‰ã“ã®æ–¹æ³•ã¯ã€ + mod_ssl ã¨çµ„ã¿åˆã‚ã›ãªã„状態ã§ã¯ã€ + ç‰¹ã«æ©Ÿå¯†æ€§ã®é«˜ã„データã«å¯¾ã—ã¦ã¯ç”¨ã„ã‚‹ã¹ãã§ã¯ + ã‚りã¾ã›ã‚“。 Apache ã§ã¯ã‚‚ã†ä¸€ã¤åˆ¥ã®èªè¨¼æ–¹æ³•: + AuthType Digest をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚ + ã“ã®æ–¹æ³•㯠mod_auth_digest + ã§å®Ÿè£…ã•れã¦ã„ã¦ã€ã‚‚ã£ã¨å®‰å…¨ã§ã™ã€‚ + 最近ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯ Digest + èªè¨¼ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„るよã†ã§ã™ã€‚

    + +

    AuthName + ディレクティブã§ã¯ã€èªè¨¼ã«ä½¿ã† Realm (訳注: 領域) + を設定ã—ã¾ã™ã€‚Realm ã¯å¤§ãã分ã‘ã¦äºŒã¤ã®æ©Ÿèƒ½ã‚’æä¾›ã—ã¾ã™ã€‚ + 一ã¤ç›®ã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒãƒ‘スワードダイアログボックス㮠+ 一部ã¨ã—ã¦ãƒ¦ãƒ¼ã‚¶ã«ã“ã®æƒ…報をよãæç¤ºã™ã‚‹ã€ã¨ã„ã†ã‚‚ã®ã§ã™ã€‚ + 二ã¤ç›®ã«ã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒä¸Žãˆã‚‰ã‚ŒãŸèªè¨¼é ˜åŸŸã«å¯¾ã—ã¦ã©ã®ãƒ‘スワードを + é€ä¿¡ã™ã‚Œã°è‰¯ã„ã®ã‹ã‚’決定ã™ã‚‹ãŸã‚ã«ä½¿ã‚れるã€ã¨ã„ã†æ©Ÿèƒ½ã§ã™ã€‚

    + +

    例ãˆã°ã€"Restricted Files" 領域中㧠+ 一度èªè¨¼ã•れれã°ã€åŒä¸€ã‚µãƒ¼ãƒä¸Šã§ "Restricted Files" + Realm ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•れãŸã©ã‚“ãªé ˜åŸŸã§ã‚‚ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯ + 自動的ã«åŒã˜ãƒ‘スワードを使ãŠã†ã¨è©¦ã¿ã¾ã™ã€‚ + ã“ã®ãŠã‹ã’ã§ã€è¤‡æ•°ã®åˆ¶é™é ˜åŸŸã«åŒã˜ realm を共有ã•ã›ã¦ã€ + ユーザãŒãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã‚’ä½•åº¦ã‚‚è¦æ±‚ã•れる事態を + 防ãã“ã¨ãŒã§ãã¾ã™ã€‚ã‚‚ã¡ã‚ã‚“ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ä¸Šã®ç†ç”±ã‹ã‚‰ã€ + サーãƒã®ãƒ›ã‚¹ãƒˆåãŒå¤‰ã‚れã°ã„ã¤ã§ã‚‚å¿…ãšã€ + クライアントã¯å†ã³ãƒ‘スワードを尋ã­ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚

    + +

    AuthBasicProvider + ã¯ãƒ‡ãƒ•ォルト値㌠file ãªã®ã§ã€ä»Šå›žã®å ´åˆã¯ç„¡ãã¦ã‚‚æ§‹ã„ã¾ã›ã‚“。 + mod_authn_dbm ã‚„ mod_authn_dbd + ã¨ã„ã£ãŸä»–ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’使ã†å ´åˆã«ã¯å¿…è¦ã«ãªã‚Šã¾ã™ã€‚ +

    + +

    AuthUserFile + ディレクティブ㯠htpasswd ã§ä½œã£ãŸ + パスワードファイルã¸ã®ãƒ‘スを設定ã—ã¾ã™ã€‚ + ユーザ数ãŒå¤šã„å ´åˆã¯ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆæ¯Žã®ãƒ¦ãƒ¼ã‚¶ã®èªè¨¼ã®ãŸã‚ã® + ãƒ—ãƒ¬ãƒ¼ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®æŽ¢ç´¢ãŒéžå¸¸ã«é…ããªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ + Apache ã§ã¯ãƒ¦ãƒ¼ã‚¶æƒ…報を高速ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ•ァイル㫠+ ä¿ç®¡ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + mod_authn_dbm モジュール㌠+ AuthDBMUserFile + ディレクティブをæä¾›ã—ã¾ã™ã€‚ã“れらã®ãƒ•ァイル㯠dbmmanage + プログラムã§ä½œæˆã—ãŸã‚Šæ“作ã—ãŸã‚Šã§ãã¾ã™ã€‚ + Apache + モジュールデータベース中ã«ã‚るサードパーティー製㮠+ モジュールã§ã€ãã®ä»–多ãã®ã‚¿ã‚¤ãƒ—ã®èªè¨¼ã‚ªãƒ—ション㌠+ 利用å¯èƒ½ã§ã™ã€‚

    + +

    最後ã«ã€Require + ディレクティブãŒã€ã‚µãƒ¼ãƒã®ã“ã®é ˜åŸŸã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãるユーザを + 指定ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ã€ãƒ—ãƒ­ã‚»ã‚¹ã®æ‰¿èªéƒ¨åˆ†ã‚’æä¾›ã—ã¾ã™ã€‚ + 次ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§ã¯ã€Require + ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã®æ§˜ã€…ãªç”¨æ³•ã«ã¤ã„ã¦è¿°ã¹ã¾ã™ã€‚

    +
    top
    +
    +

    +複数ã®äººãŒå…¥ã‚Œã‚‹ã‚ˆã†ã«ã™ã‚‹

    +

    上記ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã¯ã€ãŸã ä¸€äºº (具体的ã«ã¯ãƒ¦ãƒ¼ã‚¶å + rbowen ã®èª°ã‹) ãŒãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã« + 入れるよã†ã«ã—ã¾ã™ã€‚多ãã®å ´åˆã¯ã€è¤‡æ•°ã®äººãŒ + 入れるよã†ã«ã—ãŸã„ã§ã—ょã†ã€‚ã“ã“ã§ + AuthGroupFile + ã®ç™»å ´ã§ã™ã€‚

    + +

    ã‚‚ã—複数ã®äººãŒå…¥ã‚Œã‚‹ã‚ˆã†ã«ã—ãŸã„ã®ã§ã‚れã°ã€ + グループã«å±žã™ã‚‹ãƒ¦ãƒ¼ã‚¶ã®ä¸€è¦§ã®å…¥ã£ã¦ã„ã‚‹ã€ã‚°ãƒ«ãƒ¼ãƒ—åã®ã¤ã„㟠+ グループファイルを作る必è¦ãŒã‚りã¾ã™ã€‚ã“ã®ãƒ•ァイル㮠+ 書å¼ã¯ãã‚ã‚ã¦å˜ç´”ã§ã€ãŠå¥½ã¿ã®ã‚¨ãƒ‡ã‚£ã‚¿ã§ç”Ÿæˆã§ãã¾ã™ã€‚ + ファイルã®ä¸­èº«ã¯æ¬¡ã®ã‚ˆã†ãªã‚‚ã®ã§ã™ã€‚

    + +

    + GroupName: rbowen dpitts sungo rshersey +

    + +

    一行ã«ã‚¹ãƒšãƒ¼ã‚¹åŒºåˆ‡ã‚Šã§ã€ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‰€å±žã™ã‚‹ãƒ¡ãƒ³ãƒãƒ¼ã® + 一覧をãªã‚‰ã¹ã‚‹ã ã‘ã§ã™ã€‚

    + +

    æ—¢ã«å­˜åœ¨ã™ã‚‹ãƒ‘スワードファイルã«ãƒ¦ãƒ¼ã‚¶ã‚’加ãˆã‚‹å ´åˆã¯ã€ + 次ã®ã‚ˆã†ã«ã‚¿ã‚¤ãƒ—ã—ã¦ãã ã•ã„。

    + +

    + htpasswd /usr/local/apache/passwd/passwords dpitts +

    + +

    以å‰ã¨åŒã˜å¿œç­”ãŒè¿”ã•れã¾ã™ãŒã€æ–°ã—ã„ファイルを + 作るã®ã§ã¯ãªãã€æ—¢ã«ã‚るファイルã«è¿½åŠ ã•れã¦ã„ã¾ã™ã€‚ + (æ–°ã—ã„パスワードファイルを作るã«ã¯ -c + を使ã„ã¾ã™ã€‚)

    + +

    ã“ã“ã§æ¬¡ã®ã‚ˆã†ã«ã—㦠.htaccess ファイルを + 修正ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚

    + +

    + AuthType Basic
    + AuthName "By Invitation Only"
    + # Optional line:
    + AuthBasicProvider file
    + AuthUserFile /usr/local/apache/passwd/passwords
    + AuthGroupFile /usr/local/apache/passwd/groups
    + Require group GroupName +

    + +

    ã“れã§ã€ã‚°ãƒ«ãƒ¼ãƒ— GroupName ã«ãƒªã‚¹ãƒˆã•れã¦ã„ã¦ã€ + password ファイルã«ã‚¨ãƒ³ãƒˆãƒªãŒã‚る人ã¯ã€ + æ­£ã—ã„パスワードをタイプã™ã‚Œã°å…¥ã‚‹ã“ã¨ãŒã§ãã‚‹ã§ã—ょã†ã€‚

    + +

    ã‚‚ã£ã¨ç‰¹å®šã›ãšã«è¤‡æ•°ã®ãƒ¦ãƒ¼ã‚¶ãŒå…¥ã‚Œã‚‹ã‚ˆã†ã«ã™ã‚‹ã€ + ã‚‚ã†ä¸€ã¤ã®æ–¹æ³•ãŒã‚りã¾ã™ã€‚グループファイルを作るã®ã§ã¯ãªã〠+ 次ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–を使ãˆã°ã§ãã¾ã™ã€‚

    + +

    + Require valid-user +

    + +

    require user rbowen 行ã§ãªãã€ä¸Šè¨˜ã‚’使ã†ã¨ã€ + パスワードファイルã«ãƒªã‚¹ãƒˆã•れã¦ã„る人ã§ã‚れã°èª°ã§ã‚‚ + 許å¯ã•れã¾ã™ã€‚ + å˜ã«ãƒ‘スワードファイルをグループ毎ã«åˆ†ã‘ã¦ãŠãã“ã¨ã§ã€ + グループã®ã‚ˆã†ãªæŒ¯ã‚‹èˆžã„ã‚’ã•ã›ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + ã“ã®ã‚¢ãƒ—ローãƒã®åˆ©ç‚¹ã¯ã€Apache ã¯äºŒã¤ã§ã¯ãªã〠+ ãŸã ä¸€ã¤ã®ãƒ•ァイルã ã‘を検査ã™ã‚Œã°ã‚ˆã„ã¨ã„ã†ç‚¹ã§ã™ã€‚ + 欠点ã¯ã€ãŸãã•ã‚“ã®ãƒ‘スワードファイルを管ç†ã—ã¦ã€ãã®ä¸­ã‹ã‚‰ + AuthUserFile + ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã«æ­£ã—ã„ファイルをå‚ç…§ã•ã›ãªã‘れã°ãªã‚‰ãªã„点ã§ã™ã€‚

    +
    top
    +
    +

    èµ·ã“りãˆã‚‹å•題

    +

    Basic èªè¨¼ãŒæŒ‡å®šã•れã¦ã„ã‚‹å ´åˆã¯ã€ + サーãƒã«ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’リクエストã™ã‚‹åº¦ã« + ユーザåã¨ãƒ‘スワードを検査ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 + ã“れã¯åŒã˜ãƒšãƒ¼ã‚¸ã€ãƒšãƒ¼ã‚¸ã«ã‚ã‚‹å…¨ã¦ã®ç”»åƒã‚’ + リロードã™ã‚‹å ´åˆã§ã‚ã£ã¦ã‚‚該当ã—ã¾ã™ + (ã‚‚ã—ç”»åƒã‚‚ä¿è­·ã•れãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‹ã‚‰æ¥ã‚‹ã®ã§ã‚れã°) 。 + 予想ã•れる通りã€ã“れã¯å‹•作を多少é…ãã—ã¾ã™ã€‚ + é…ããªã‚‹ç¨‹åº¦ã¯ãƒ‘スワードファイルã®å¤§ãã•ã¨æ¯”例ã—ã¾ã™ãŒã€ + ã“れã¯ã€ãƒ•ァイルを開ã„ã¦ã‚ãªãŸã®åå‰ã‚’発見ã™ã‚‹ã¾ã§ + ユーザåã®ãƒªã‚¹ãƒˆã‚’読ã¾ãªã‘れã°ãªã‚‰ãªã„ã‹ã‚‰ã§ã™ã€‚ + ãã—ã¦ã€ãƒšãƒ¼ã‚¸ãŒãƒ­ãƒ¼ãƒ‰ã•れる度ã«ã“れを行ã‚ãªã‘れ㰠+ ãªã‚Šã¾ã›ã‚“。

    + +

    çµè«–ã¨ã—ã¦ã¯ã€ä¸€ã¤ã®ãƒ‘スワードファイルã«ç½®ãã“ã¨ã®ã§ãã‚‹ + ユーザ数ã«ã¯å®Ÿè³ªçš„ãªé™ç•ŒãŒã‚りã¾ã™ã€‚ + ã“ã®é™ç•Œã¯ã‚µãƒ¼ãƒãƒžã‚·ãƒ³ã®æ€§èƒ½ã«ä¾å­˜ã—ã¦å¤‰ã‚りã¾ã™ãŒã€ + 数百ã®ã‚¨ãƒ³ãƒˆãƒªã‚’è¶ŠãˆãŸã‚ãŸã‚Šã‹ã‚‰é€Ÿåº¦ä½Žä¸‹ãŒè¦‹ã‚‰ã‚Œã‚‹ã¨äºˆæœŸã•れã¦ã„ã¾ã™ã€‚ + ãã®æ™‚ã¯ä»–ã®èªè¨¼æ–¹æ³•を考慮ã«å…¥ã‚ŒãŸæ–¹ãŒè‰¯ã„ã§ã—ょã†ã€‚

    +
    top
    +
    +

    パスワードã®ä¿å­˜å½¢å¼ã‚’変ãˆã‚‹

    + +

    プレーンテキストã§ãƒ‘スワードをä¿å­˜ã™ã‚‹æ–¹æ³•ã«ã¯ä¸Šè¨˜ã®å•題ãŒã‚り〠+ データベースã®ã‚ˆã†ãªåˆ¥ã®å ´æ‰€ã«ãƒ‘スワードをä¿å­˜ã—ãŸã„ã¨æ€ã† + ã‹ã‚‚ã—れã¾ã›ã‚“。

    + +

    mod_authn_dbm 㨠mod_authn_dbd + を使ã†ã¨ã€ãれãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ + AuthBasicSource + ã§ file ã®ä»£ã‚りã«ã€dbm ã‚ã‚‹ã„㯠dbd + ã‚’æ ¼ç´å½¢å¼ã¨ã—ã¦é¸ã¹ã¾ã™ã€‚

    + +

    テキストファイルã®ä»£ã‚り㫠dbm ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã™ã‚‹å ´åˆã¯ã€ãŸã¨ãˆã°æ¬¡ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚

    + +

    + <Directory /www/docs/private>
    + AuthName "Private"
    + AuthType Basic
    + AuthBasicProvider dbm
    + AuthDBMUserFile /www/passwords/passwd.dbm
    + Require valid-user
    + </Directory> +

    + +

    ã“ã®ä»–ã®ã‚ªãƒ—ションも存在ã—ã¾ã™ã€‚詳細ã«é–¢ã—ã¦ã¯ + mod_authn_dbm ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’ã”覧ãã ã•ã„。

    +
    top
    +
    +

    複数ã®ãƒ—ロãƒã‚¤ãƒ€ã‚’使用ã™ã‚‹

    + +

    èªè¨¼æ‰¿èªã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ã«åŸºã¥ã„ã¦ã„ã‚‹æ–°ã—ã„プロãƒã‚¤ãƒ€ã‚’使ã†ã¨ã€ + èªè¨¼æ‰¿èªã®æ–¹æ³•ã‚’ã²ã¨ã¤ã«ç¸›ã‚‹å¿…è¦ãŒãªããªã‚Šã¾ã™ã€‚ + ã„ãã¤ã‚‚ã®ãƒ—ロãƒã‚¤ãƒ€ã‚’組ã¿åˆã‚ã›ã¦ã€è‡ªåˆ†ã®æœ›ã¿ã®æŒ™å‹•ã«ã§ãã¾ã™ã€‚ + 次ã®ä¾‹ã§ã¯ file èªè¨¼ãƒ—ロãƒã‚¤ãƒ€ã¨ ldap èªè¨¼ãƒ—ロãƒã‚¤ãƒ€ã‚’ + 組ã¿åˆã‚ã›ã¦ã„ã¾ã™ã€‚

    + +

    + <Directory /www/docs/private>
    + AuthName "Private"
    + AuthType Basic
    + AuthBasicProvider file ldap
    + AuthUserFile /usr/local/apache/passwd/passwords
    + AuthLDAPURL ldap://ldaphost/o=yourorg
    + Require valid-user +

    + +

    ã“ã®ä¾‹ã§ã¯ã€ã¾ãš file プロãƒã‚¤ãƒ€ãŒãƒ¦ãƒ¼ã‚¶èªè¨¼ã‚’試ã¿ã¾ã™ã€‚ + èªè¨¼ã§ããªã‹ã£ãŸå ´åˆã«ã¯ã€ldap プロãƒã‚¤ãƒ€ãŒå‘¼ã³å‡ºã•れã¾ã™ã€‚ + 組織ã§è¤‡æ•°ã®èªè¨¼æ ¼ç´æ–¹æ³•を使ã£ã¦ã„ã‚‹éš›ãªã©ã«ã€ + ã“ã®æ–¹æ³•を使ã£ã¦èªè¨¼ã®ã‚¹ã‚³ãƒ¼ãƒ—を拡大ã§ãã¾ã™ã€‚ + ã‚‚ã†ã²ã¨ã¤ã®ã‚·ãƒŠãƒªã‚ªã¯ã€ã²ã¨ã¤ã®èªè¨¼ã‚¿ã‚¤ãƒ—ã¨ç•°ãªã‚‹æ‰¿èªã‚’ + 組ã¿åˆã‚ã›ã‚‹æ–¹æ³•ã§ã—ょã†ã€‚ãŸã¨ãˆã°ã€ãƒ‘スワードファイルã§èªè¨¼ã—ã¦ã€ + ldap ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§æ‰¿èªã‚’行ã†ã¨ã„ã£ãŸå ´åˆã§ã™ã€‚

    + +

    èªè¨¼ãƒ—ロãƒã‚¤ãƒ€ã‚’複数実装ã§ãるよã†ã«ã€æ‰¿èªæ–¹æ³•も複数使用ã§ãã¾ã™ã€‚ + ã“ã®ä¾‹ã§ã¯ file グループ承èªã¨ ldap グループ承èªã‚’使ã£ã¦ã„ã¾ã™ã€‚

    + +

    + <Directory /www/docs/private>
    + AuthName "Private"
    + AuthType Basic
    + AuthBasicProvider file
    + AuthUserFile /usr/local/apache/passwd/passwords
    + AuthLDAPURL ldap://ldaphost/o=yourorg + AuthGroupFile /usr/local/apache/passwd/groups
    + Require group GroupName
    + Require ldap-group cn=mygroup,o=yourorg +

    + +

    承èªã‚’より細ã‹ã制御ã—ãŸã„å ´åˆã¯ã€ + <SatisfyAll> 㨠+ <SatisfyOne> + ディレクティブを使ã£ã¦ AND/OR ãƒ­ã‚¸ãƒƒã‚¯ã§æŒ‡å®šã—ã€è¨­å®šãƒ•ァイル㧠+ 承èªã®å‡¦ç†é †ç•ªã®åˆ¶å¾¡ãŒã§ãるよã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ + ã“れらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã‚’ã©ã®ã‚ˆã†ã«ä½¿ãˆã‚‹ã‹ã€ç¶²ç¾…ã—ãŸä¾‹ã‚’ã”覧ãã ã•ã„。

    + +
    top
    +
    +

    å˜ç´”ãªæ‰¿èªã®ãã®å…ˆ

    + +

    承èªã®æ–¹æ³•ã¯ã€ã²ã¨ã¤ã®ãƒ‡ãƒ¼ã‚¿ã‚½ãƒ¼ã‚¹ã‚’見ã¦ä¸€å›žã ã‘ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã®ã¨æ¯”ã¹ã¦ã€ + ãšã£ã¨å¤šå½©ãªé©ç”¨æ–¹æ³•ãŒã§ãã¾ã™ã€‚ + 承èªå‡¦ç†ã®é©ç”¨é †åºã‚„制御ã€é¸æŠžãŒã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚

    + +

    AND/OR ロジックã®é©ç”¨ã¨é †åºä»˜ã‘

    +

    承èªãŒã©ã®ã‚ˆã†ãªé †åºã§é©ç”¨ã•れã¦ã„ã‚‹ã‹ã€ã¾ãŸã€ãれをã©ã®ã‚ˆã†ã«åˆ¶å¾¡ã™ã‚‹ã‹ã¯ã€ + ã“れã¾ã§æ··ä¹±ã‚’æ‹›ã„ã¦ã„ã¾ã—ãŸã€‚ + Apache 2.2 ã§ã¯ãƒ—ロãƒã‚¤ãƒ€ãƒ™ãƒ¼ã‚¹ã®èªè¨¼ãƒ¡ã‚«ãƒ‹ã‚ºãƒ ãŒå°Žå…¥ã•れ〠+ 承èªå‡¦ç†ã‹ã‚‰èªè¨¼å‡¦ç†ã¨ã‚µãƒãƒ¼ãƒˆæ©Ÿèƒ½ã¨ãŒåˆ‡ã‚Šåˆ†ã‘られã¾ã—ãŸã€‚ + ã“れã«ã‚ˆã‚‹ã²ã¨ã¤ã®åŠ¹æžœã¨ã—ã¦ã€ + èªè¨¼ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®ãƒ­ãƒ¼ãƒ‰é †ã‚„モジュール自体ã®é †åºã«ä¾å­˜ã™ã‚‹ã“ã¨ãªã〠+ 指定ã—ãŸé †ç•ªã§èªè¨¼ãƒ—ロãƒã‚¤ãƒ€ãŒå‘¼ã³å‡ºã›ã‚‹ã‚ˆã†ã€ + 設定ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ + ã“ã®ãƒ—ロãƒã‚¤ãƒ€ãƒ¡ã‚«ãƒ‹ã‚ºãƒ ã¯æ‰¿èªå‡¦ç†ã§ã‚‚å°Žå…¥ã•れã¦ã„ã¾ã™ã€‚ + ã¤ã¾ã‚Šã€Require + ディレクティブã¯å˜ã«ã©ã®æ‰¿èªæ‰‹æ³•ãŒä½¿ã‚れるã‹ã‚’指定ã™ã‚‹ã ã‘ã§ã¯ãªã〠+ ãれらã®å‘¼ã³å‡ºã—é †åºã‚‚指定ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ + è¤‡æ•°ã®æ‰¿èªæ‰‹æ³•ãŒã‚ã‚‹ã¨ãã€ãã®å‘¼ã³å‡ºã—é †ã¯ã€è¨­å®šãƒ•ァイル㮠+ Require ディレクティブ中㧠+ ç¾ã‚ŒãŸé †åºã¨åŒã˜ã«ãªã‚Šã¾ã™ã€‚

    + +

    追加ã§å°Žå…¥ã•れ㟠+ <SatisfyAll>, + <SatisfyOne> + ディレクティブを使ã£ã¦ã€æ‰¿èªæ‰‹æ³•ãŒã„ã¤å‘¼ã³å‡ºã•れã€ã‚¢ã‚¯ã‚»ã‚¹ãŒè¨±å¯ã•れãŸéš›ã« + ã©ã®æ‰‹ç¶šããŒé©ç”¨ã•ã‚Œã‚‹ã‹æŒ‡å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ãŸã¨ãˆã°ã€æ¬¡ã®æ‰¿èªãƒ–ロックã®ãƒ­ã‚¸ãƒƒã‚¯ã‚’見ã¦ã¿ã¾ã—ょã†:

    + +

    + # if ((user == "John") ||
    + #    ((Group == "admin")
    + #     && (ldap-group <ldap-object> contains auth'ed_user)
    + #     && ((ldap-attribute dept == "sales")
    + #         || (file-group contains auth'ed_user))))
    + # then
    + #   auth_granted
    + # else
    + #   auth_denied
    + #
    + <Directory /www/mydocs>
    + + Authname ...
    + AuthBasicProvider ...
    + ...
    + Require user John
    + <SatisfyAll>
    + + Require Group admins
    + Require ldap-group cn=mygroup,o=foo
    + <SatisfyOne>
    + + Require ldap-attribute dept="sales"
    + Require file-group
    +
    + </SatisfyOne>
    +
    + </SatisfyAll>
    +
    + </Directory> +

    + +

    デフォルトã§ã¯ Require + ディレクティブ㯠OR æ“作ã¨ã—ã¦æ‰±ã‚れã¾ã™ã€‚ã¤ã¾ã‚Šã€ã‚‚ã—æŒ‡å®šã—ãŸæ‰¿èªæ‰‹æ³•ã® + ã²ã¨ã¤ã§ã‚‚åˆæ ¼ã™ã‚Œã°ã€æ‰¿èªã•れã¾ã™ã€‚ + Require ディレクティブã®ã‚»ãƒƒãƒˆã‚’ + ã²ã¨ã¤ã® <SatisfyAll> + ブロックã§å›²ã‚€ã¨AND æ“作ã¨ãªã‚Šã€å…¨ã¦ã®æ‰¿èªæ‰‹æ³•ã§åˆæ ¼ã—ãªã‘れã°è¨±å¯ã•れã¾ã›ã‚“。

    + + + +

    アクセス制御ã«ãŠã‘ã‚‹ Require 㨠Reject ã®ä½¿ã„æ–¹

    +

    ユーザåã¨ãƒ‘スワードã«ã‚ˆã‚‹èªè¨¼ã¯å…¨ä½“ã®ä¸€éƒ¨åˆ†ã§ã—ã‹ã‚りã¾ã›ã‚“。 + 誰ãŒã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ããŸã‹ã¨ã„ã£ãŸæƒ…å ±ä»¥å¤–ã®æ¡ä»¶ã‚’使ã„ãŸã„〠+ ã¨ã‚ˆãæ€ã†ã“ã¨ã§ã—ょã†ã€‚ + ãŸã¨ãˆã°ã€ã©ã“ã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ãã¦ã„ã‚‹ã‹ã€ã¨ã„ã£ãŸå…·åˆã§ã™ã€‚

    + +

    承èªãƒ—ロãƒã‚¤ãƒ€ all, + env, + host, + ip + を使ã†ã¨ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã—ã¦ãã¦ã„るマシンã®ãƒ›ã‚¹ãƒˆåã‚„ IP アドレス + ã¨ã„ã£ãŸã€ãƒ›ã‚¹ãƒˆãƒ™ãƒ¼ã‚¹ã§ã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ãŒã§ãã¾ã™ã€‚

    + +

    ã“れらプロãƒã‚¤ãƒ€ã®æ‰±ã„㯠+ Require ã‚„ + Reject ã§ + 指定ã•れã¾ã™ã€‚ã“れらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã¯æ‰¿èªãƒ—ロãƒã‚¤ãƒ€ã‚’登録ã—〠+ リクエスト処ç†ã®æ‰¿èªæ®µéšŽã§å‘¼ã³å‡ºã•れã¾ã™ã€‚ãŸã¨ãˆã°:

    + +

    + Require ip address +

    + +

    ã“ã“ã§ã€address 㯠IP アドレス (ã‚ã‚‹ã„㯠IP アドレス㮠+ 一部) ã‹ :

    + +

    + Require host domain_name +

    + +

    ã“ã“ã§ domain_name 㯠FQDN (ã‚ã‚‹ã„ã¯ãƒ‰ãƒ¡ã‚¤ãƒ³åã®ä¸€éƒ¨) + ã§ã€å¿…è¦ã§ã‚れã°è¤‡æ•°ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚„ドメインåを書ãã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    ãŸã¨ãˆã°ã€ã‚¹ãƒ‘ムメッセージをé€ä¿¡ã—ã¦ãる誰ã‹ã‚’æ‹’å¦ã—ãŸã„å ´åˆã€ + 次ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ :

    + +

    + Reject ip 10.252.46.165 +

    + +

    ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ãŒæœ‰åйãªç¯„囲ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«å¯¾ã—ã¦ã¯ã€ + ãã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ãã¦ã‚‚見るã“ã¨ãŒã§ãã¾ã›ã‚“。 + ã‚‚ã—マシンåãŒã‚ã‹ã£ã¦ã„㦠IP アドレスよりもãã¡ã‚‰ã§ + 指定ã—ãŸã„ã®ã§ã‚れã°ã€ãã®ãƒžã‚·ãƒ³åãŒä½¿ãˆã¾ã™ã€‚

    + +

    + Reject host host.example.com +

    + +

    ã¾ãŸã€ç‰¹å®šã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã‹ã‚‰ã®ã‚¢ã‚¯ã‚»ã‚¹å…¨ã¦ã‚’ブロックã—ãŸã„å ´åˆã¯ã€ + IP アドレスã®ä¸€éƒ¨ã‚„ã€ãƒ‰ãƒ¡ã‚¤ãƒ³åãŒæŒ‡å®šã§ãã¾ã™ :

    + +

    + <SatisfyAll>
    + + Reject ip 192.168.205
    + Reject host phishers.example.com moreidiots.example
    Reject host ke
    +
    + </SatisfyAll> +

    + +

    Reject ディレクティブを + <SatisfyAll> ブロックã®ä¸­ã§ä½¿ã†ã¨ã€ + 許å¯ã—ãŸã„グループã«ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ãŒã§ãるよã†ã«ç¢ºèªã§ãã¾ã™ã€‚

    + +

    上記ã®ä¾‹ã§ã¯ <SatisfyAll> + を使ã£ã¦ã€ã‚¢ã‚¯ã‚»ã‚¹ã«åˆæ ¼ã™ã‚‹å‰æ®µéšŽã§ã€å…¨ã¦ã® + Reject ディレクティブ㌠+ 満ãŸã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ã„ã¾ã™ã€‚

    + + + +

    アクセス制御ã®å¾Œæ–¹äº’æ›æ€§

    +

    èªè¨¼ãƒ—ロãƒã‚¤ãƒ€ãƒ™ãƒ¼ã‚¹ã®æ©Ÿæ§‹ãŒã‚ã‚‹ãŸã‚ã€ä»¥å‰ä½¿ç”¨ã•れã¦ã„ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ– + Order, + Allow, + Deny, + Satisfy + ã¯å¿…è¦ãªããªã‚Šã¾ã—ãŸã€‚ + ã¨ã¯ã„ã†ã‚‚ã®ã®ã€å¤ã„設定ファイルã§ã®å¾Œæ–¹äº’æ›æ€§ã‚’æä¾›ã™ã‚‹ãŸã‚〠+ ã“れらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–㯠mod_access_compat モジュールã«ç§»ã•れã¾ã—ãŸã€‚

    + +

    ã“れらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã®æŠ±ãˆã¦ã„ãŸå•題ã®ã²ã¨ã¤ã«ã€æ‰¿èªã®è¨­å®šè¡Œã¨ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã®è¨­å®šè¡Œã® + 関係ãŒã¨ã¦ã‚‚ã‚ã„ã¾ã„ã ã£ãŸã“ã¨ãŒæŒ™ã’られã¾ã™ã€‚ + Satisfy ディレクティブ㯠+ リクエスト処ç†ä¸­ã§ãれ自身を呼ã³å‡ºã™ã“ã¨ã«ã‚ˆã£ã¦ã€ã“れら㮠2 ã¤ã®å‡¦ç†æ®µéšŽã‚’çµã³ã¤ã‘よã†ã¨ã—ã¾ã™ã€‚ + ç¾åœ¨ã¯ã€ã“れらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–㯠mod_access_compat ã«ç§»å‹•ã—〠+ æ–°ã—ã„èªè¨¼ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã¨å¤ã„アクセス制御ディレクティブを混ãœã¦ä½¿ã†ã“ã¨ã¯ + 難ã—ããªã£ã¦ã„ã¾ã™ã€‚ã“ã®å•題ã®ãŸã‚ã€mod_authz_default モジュールを + ロードã™ã‚‹ã“ã¨ãŒã¨ã¦ã‚‚é‡è¦ã§ã€å¿…é ˆã«ãªã£ã¦ã„ã¾ã™ã€‚ + mod_authz_default モジュールã®ä¸»ãªç›®çš„ã¯ã€ã©ã®æ‰¿èªãƒ—ロãƒã‚¤ãƒ€ã§ + 処ç†ã•れãªã‹ã£ãŸæ‰¿èªãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’å—ã‘ã‚‹ã“ã¨ã«ã‚りã¾ã™ã€‚ + ã—ã‹ã—ã€å¤ã„アクセス制御ディレクティブãŒç”¨ã„られãŸå ´åˆã«ã¯ã€ + ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã¨æ‰¿èªã‚’çµã³ã¤ã‘ã¦ã€ã™ã¹ã¦ã®å‡¦ç†æ®µéšŽã®å‡ºåŠ›çµæžœã‚’見ã¦ã‚¢ã‚¯ã‚»ã‚¹ã«åˆæ ¼ã™ã‚‹ã‹ã‚’決ã‚ã¦ã„ã¾ã™ã€‚ + ã§ã™ã‹ã‚‰ã€å¤ã„ディレクティブãŒã†ã¾ã動作ã—ãªã„å ´åˆã¯ã€ + mod_authz_default ãŒãƒ­ãƒ¼ãƒ‰ã•れã¦ã„ãªã„ã‹ã‚‰ã‹ã‚‚ã—れãªã„〠+ ã¨ç–‘ã£ã¦ã¿ã¦ãã ã•ã„。

    + + + +
    top
    +
    +

    追加情報

    +

    ã“れら全ã¦ãŒã©ã®ã‚ˆã†ã«å‹•作ã™ã‚‹ã‹ã«ã¤ã„㦠+ ã‚‚ã£ã¨å¤šãã®æƒ…å ±ãŒæ›¸ã‹ã‚Œã¦ã„ã‚‹ mod_auth_basic 㨠+ mod_authz_host + ã®æ–‡æ›¸ã‚‚読むã¨ã‚ˆã„ã§ã—ょã†ã€‚ + <AuthnProviderAlias> + ディレクティブを使ã†ã¨ã€ç‰¹å®šã®èªè¨¼è¨­å®šãŒç°¡å˜ã«æ›¸ã‘るよã†ã«ãªã‚Šã¾ã™ã€‚

    + +

    ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã®æ–¹æ³•も〠+ 関連ã™ã‚‹ãƒˆãƒ”ックãŒãŸãã•ん記載ã•れã¦ã„ã¾ã™ã®ã§ã€ã”覧ãã ã•ã„。

    + +
    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/auth.html.ko.euc-kr b/docs/manual/howto/auth.html.ko.euc-kr new file mode 100644 index 0000000..d2462e7 --- /dev/null +++ b/docs/manual/howto/auth.html.ko.euc-kr @@ -0,0 +1,355 @@ + + + + + +ÀÎÁõ(Authentication), ±ÇÇѺο©(Authorization), +Á¢±ÙÁ¦¾î(Access Control) - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    ÀÎÁõ(Authentication), ±ÇÇѺο©(Authorization), +Á¢±ÙÁ¦¾î(Access Control)

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + +

    ÀÎÁõ(authentication)Àº ÀÚ½ÅÀÌ ´©±¸¶ó°í ÁÖÀåÇÏ´Â »ç¶÷À» + È®ÀÎÇÏ´Â ÀýÂ÷ÀÌ´Ù. ±ÇÇѺο©(authorization)´Â °¡°í ½ÍÀº °÷À¸·Î + °¡µµ·Ï ȤÀº ¿øÇÏ´Â Á¤º¸¸¦ ¾òµµ·Ï Çã¿ëÇÏ´Â °úÁ¤ÀÌ´Ù.

    +
    + +
    top
    +
    top
    +
    +

    ¼Ò°³

    +

    ´ç½ÅÀÇ À¥»çÀÌÆ®¿¡ ÀÖ´Â Á¤º¸°¡ ¼Ò¼öÀÇ »ç¶÷µé¸¸ÀÇ ºñ¹ÐÀ̰ųª + À̵鸸À» À§ÇÑ Á¤º¸¶ó¸é, ÀÌ ±Û¿¡¼­ ¼³¸íÇÏ´Â ±â¹ýÀ» »ç¿ëÇÏ¿© + ´ç½ÅÀÌ º¸±æ ¿øÇÏ´Â »ç¶÷¸¸ ÆäÀÌÁö¸¦ º¸µµ·Ï ÇÒ ¼ö ÀÖ´Ù.

    + +

    ÀÌ ±ÛÀº À¥»çÀÌÆ®ÀÇ ÀϺθ¦ º¸È£ÇϱâÀ§ÇØ ¸¹Àº »ç¶÷µéÀÌ + »ç¿ëÇÏ´Â "Ç¥ÁØÀûÀÎ" ¹æ¹ýÀ» ´Ù·é´Ù.

    +
    top
    +
    +

    ±âº» Áö½Ä

    +

    ÀÌ ±Û¿¡¼­ ´Ù·ç´Â Áö½Ã¾î´Â ¼­¹öÀÇ ÁÖ¼³Á¤ÆÄÀÏ(ÀϹÝÀûÀ¸·Î + <Directory> + ¼½¼Ç)À̳ª µð·ºÅ丮º° ¼³Á¤ÆÄÀÏ(.htaccess ÆÄÀÏ)¿¡¼­ + »ç¿ëÇÑ´Ù.

    + +

    .htaccess ÆÄÀÏÀ» »ç¿ëÇÏ·Á¸é ÀÌ ÆÄÀÏ¿¡ ÀÖ´Â + ÀÎÁõ Áö½Ã¾î¸¦ Çã¿ëÇϵµ·Ï ¼­¹ö¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù. À̸¦ À§ÇØ + µð·ºÅ丮º° ¼³Á¤ÆÄÀÏ¿¡ ¾î¶² Áö½Ã¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö¸¦ °áÁ¤ÇÏ´Â + AllowOverride Áö½Ã¾î¸¦ + »ç¿ëÇÑ´Ù.

    + +

    ¿©±â¼­´Â ÀÎÁõÀ» ´Ù·ç±â ¶§¹®¿¡, ´ÙÀ½°ú °°Àº + AllowOverride Áö½Ã¾î°¡ ÇÊ¿äÇÏ´Ù.

    + +

    + AllowOverride AuthConfig +

    + +

    ȤÀº Áö½Ã¾î¸¦ Á÷Á¢ ¼­¹ö ÁÖ¼³Á¤ÆÄÀÏ¿¡ Àû´Â´Ù¸é, ±× ÆÄÀÏ¿¡ + ¾²±â ±ÇÇÑÀÌ ¹°·Ð ÀÖ¾î¾ß ÇÑ´Ù.

    + +

    ±×¸®°í º¸È£ÇÒ ÆÄÀÏÀÌ ¾îµðÀÖ´ÂÁö ¾Ë±âÀ§ÇØ ¼­¹öÀÇ µð·ºÅ丮 + ±¸Á¶¿¡ ´ëÇØ Á¶±Ý ¾Ë¾Æ¾ßÇÑ´Ù. ÀÌ ÀÏÀº ¾î·ÆÁö¾Ê°í, Àû´çÇÑ + ¶§¿¡ ÀÚ¼¼È÷ ¼³¸íÇÒ °ÍÀÌ´Ù.

    +
    top
    +
    +

    ±âº»ÀûÀÎ ¼³Á¤Çϱâ

    +

    ÀÌÁ¦ ¼­¹öÀÇ µð·ºÅ丮¸¦ ¾ÏÈ£·Î º¸È£ÇÏ´Â ±âº»ÀûÀÎ ¹æ¹ýÀ» + ¼³¸íÇÑ´Ù.

    + +

    ¸ÕÀú ¾ÏÈ£ÆÄÀÏÀ» ¸¸µé¾î¾ß ÇÑ´Ù. ÀÌ ÆÄÀÏÀº À¥¿¡¼­ Á¢±ÙÇÒ + ¼ö ¾ø´Â °÷¿¡ ÀÖ¾î¾ß ÇÑ´Ù. ´Ù¸¥»ç¶÷ÀÌ ¾ÏÈ£ÆÄÀÏÀ» ´Ù¿î·ÎµåÇÏÁö + ¸øÇϰÔÇϱâ À§Çؼ­´Ù. ¿¹¸¦ µé¾î, ¹®¼­µéÀÌ + /usr/local/apache/htdocs¿¡ ÀÖ´Ù¸é ¾ÏÈ£ÆÄÀÏ(µé)Àº + /usr/local/apache/passwd¿¡ µÐ´Ù.

    + +

    ¾ÆÆÄÄ¡¿¡ Æ÷ÇÔµÈ htpasswd µµ±¸¸¦ »ç¿ëÇÏ¿© + ¾ÏÈ£ÆÄÀÏÀ» ¸¸µç´Ù. ÀÌ ÇÁ·Î±×·¥Àº ¾ÆÆÄÄ¡¸¦ ¼³Ä¡ÇÑ °÷ÀÇ + bin µð·ºÅ丮¿¡ ÀÖ´Ù. ÆÄÀÏÀ» ¸¸µé·Á¸é ´ÙÀ½°ú + °°ÀÌ ÀÔ·ÂÇÑ´Ù.

    + +

    + htpasswd -c /usr/local/apache/passwd/passwords rbowen +

    + +

    htpasswd´Â ¾ÏÈ£¸¦ ¹°¾îº¸°í, È®ÀÎÀ» À§ÇØ + ¾ÏÈ£¸¦ ´Ù½Ã ÀÔ·ÂÇ϶ó°í ¿äûÇÑ´Ù.

    + +

    + # htpasswd -c /usr/local/apache/passwd/passwords rbowen
    + New password: mypassword
    + Re-type new password: mypassword
    + Adding password for user rbowen +

    + +

    ¹°·Ð htpasswdÀÌ ½ÇÇàÆÄÀÏ °æ·Î¿¡ ¾ø´Ù¸é + ½ÇÇàÆÄÀÏÀÇ Àüü °æ·Î¸¦ ÀÔ·ÂÇØ¾ß ÇÑ´Ù. ³»°¡ »ç¿ëÇÏ´Â ¼­¹ö¿¡¼­´Â + /usr/local/apache/bin/htpasswd¿¡ ½ÇÇàÆÄÀÏÀÌ + ÀÖ´Ù.

    + +

    ´ÙÀ½À¸·Î ¼­¹ö°¡ ¾ÏÈ£¸¦ ¿äûÇϵµ·Ï ¼³Á¤Çϰí, ¼­¹ö¿¡°Ô + ¾î¶² »ç¿ëÀÚÀÇ Á¢±ÙÀ» Çã¿ëÇÒÁö ¾Ë·ÁÁà¾ß ÇÑ´Ù. + httpd.conf¸¦ ÆíÁýÇϰųª .htaccess + ÆÄÀÏÀ» »ç¿ëÇÏ¿© ¼³Á¤ÇÑ´Ù. ¿¹¸¦ µé¾î, + /usr/local/apache/htdocs/secret µð·ºÅ丮¸¦ + º¸È£ÇÏ·Á¸é, ¾Æ·¡ Áö½Ã¾î¸¦ + /usr/local/apache/htdocs/secret/.htaccess ÆÄÀÏÀ̳ª + httpd.confÀÇ <Directory + /usr/local/apache/apache/htdocs/secret> ¼½¼Ç¿¡ Àû¾î¾ß + ÇÑ´Ù.

    + +

    + AuthType Basic
    + AuthName "Restricted Files"
    + AuthUserFile /usr/local/apache/passwd/passwords
    + Require user rbowen +

    + +

    Áö½Ã¾î¸¦ Çϳª¾¿ »ìÆìº¸ÀÚ. AuthType Áö½Ã¾î´Â »ç¿ëÀÚ¸¦ ÀÎÁõÇÒ + ¹æ¹ýÀ» ¼±ÅÃÇÑ´Ù. °¡Àå ÀϹÝÀûÀÎ ¹æ¹ýÀº BasicÀ¸·Î, + mod_auth_basicÀÌ ±¸ÇöÇÑ´Ù. ±×·¯³ª Basic + ÀÎÁõÀº ºê¶ó¿ìÀú°¡ ¼­¹ö·Î ¾ÏÈ£¸¦ ¾ÏȣȭÇÏÁö ¾Ê°í º¸³½´Ù. + ±×·¯¹Ç·Î ±â¹Ð ÀڷḦ º¸È£ÇϱâÀ§ÇØ ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏ¸é ¾ÈµÈ´Ù. + ¾ÆÆÄÄ¡´Â AuthType Digest¶ó´Â ÀÎÁõ ¹æ¹ýµµ Áö¿øÇÑ´Ù. + ÀÌ ¹æ¹ýÀº mod_auth_digest°¡ ±¸ÇöÇϸç, ¸Å¿ì + ¾ÈÀüÇÏ´Ù. °¡Àå Ãֱ٠Ŭ¶óÀÌ¾ðÆ®µé¸¸ÀÌ Digest ÀÎÁõÀ» Áö¿øÇÑ´Ù°í + ÇÑ´Ù.

    + +

    AuthName Áö½Ã¾î´Â + ÀÎÁõ¿¡ »ç¿ëÇÒ ¿µ¿ª(realm)À» ÁöÁ¤ÇÑ´Ù. ¿µ¿ªÀº + µÎ°¡Áö ¿ªÇÒÀ» ÇÑ´Ù. ù¹øÂ°´Â Ŭ¶óÀÌ¾ðÆ®°¡ º¸Åë ÀÌ Á¤º¸¸¦ + ¾ÏÈ£ ´ëȭâ¿¡ º¸¿©ÁØ´Ù. µÎ¹øÂ°´Â ¿µ¿ª Á¤º¸¸¦ »ç¿ëÇÏ¿© + Ŭ¶óÀÌ¾ðÆ®°¡ ƯÁ¤ ÀÎÁõ±¸¿ª¿¡ ¾î¶² ¾ÏÈ£¸¦ º¸³¾Áö °áÁ¤ÇÑ´Ù.

    + +

    ¿¹¸¦ µé¾î, ÀÏ´Ü Å¬¶óÀÌ¾ðÆ®°¡ "Restricted Files" + ¿µ¿ª¿¡ ÀÎÁõÀÌ ¼º°øÇÏ¿´´Ù¸é, Ŭ¶óÀÌ¾ðÆ®´Â ÀÚµ¿À¸·Î °°Àº ¼­¹ö¿¡¼­ + "Restricted Files" ¿µ¿ªÀ¸·Î Ç¥½ÃµÈ ±¸¿ª¿¡ ´ëÇØ + µ¿ÀÏÇÑ ¾ÏÈ£¸¦ ½ÃµµÇÑ´Ù. ±×·¡¼­ ¿©·¯ Á¦ÇÑ ±¸¿ªÀÌ °°Àº ¿µ¿ªÀ» + °øÀ¯ÇÏ¸é »ç¿ëÀÚ°¡ ¿©·¯¹ø ¾ÏÈ£¸¦ ÀÔ·ÂÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ¹°·Ð + º¸¾È»ó ÀÌÀ¯·Î Ŭ¶óÀÌ¾ðÆ®´Â ¼­¹öÀÇ È£½ºÆ®¸íÀÌ ´Ù¸£¸é Ç×»ó + »õ·Î ¾ÏÈ£¸¦ ¹°¾îº»´Ù.

    + +

    AuthUserFile + Áö½Ã¾î´Â ¿ì¸®°¡ ¹æ±Ý htpasswd·Î ¸¸µç ¾ÏÈ£ÆÄÀÏÀÇ + °æ·Î¸¦ ¼³Á¤ÇÑ´Ù. »ç¿ëÀÚ°¡ ¸¹´Ù¸é ¿äû¸¶´Ù ¸Å¹ø »ç¿ëÀÚ¸¦ + ÀÎÁõÇϱâÀ§ÇØ ÀÏ¹Ý ¹®¼­ÆÄÀÏÀ» °Ë»öÇϴµ¥ ½Ã°£ÀÌ »ó´çÈ÷ ¸¹ÀÌ + °É¸± ¼ö ÀÖ´Ù. ¾ÆÆÄÄ¡´Â ºü¸¥ µ¥ÀÌŸº£À̽º ÆÄÀÏ¿¡ »ç¿ëÀÚ Á¤º¸¸¦ + ÀúÀåÇÒ ¼ö ÀÖ´Ù. mod_authn_dbm ¸ðµâÀº AuthDBMUserFile Áö½Ã¾î¸¦ + Á¦°øÇÑ´Ù. dbmmanage + ÇÁ·Î±×·¥À» »ç¿ëÇÏ¿© ¾ÏÈ£ÆÄÀÏÀ» ¸¸µé°í ´Ù·é´Ù. ¾ÆÆÄÄ¡ ¸ðµâ + µ¥ÀÌŸº£À̽º¿¡´Â ¿©·¯ ´Ù¸¥ ÀÎÁõ ¹æ½ÄÀ» Á¦°øÇÏ´Â Á¦»ïÀÚ°¡ + ¸¸µç ¸ðµâµéÀÌ ÀÖ´Ù.

    + +

    ¸¶Áö¸·À¸·Î Require + Áö½Ã¾î´Â ¼­¹öÀÇ Æ¯Á¤ ¿µ¿ª¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â »ç¿ëÀÚ¸¦ ÁöÁ¤ÇÏ¿© + ±ÇÇѺο©¸¦ ÇÑ´Ù. ´ÙÀ½ ÀýÀº require Áö½Ã¾î¸¦ + »ç¿ëÇÏ´Â ´Ù¾çÇÑ ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.

    +
    top
    +
    +

    ¿©·¯¸íÀ» µé¿©º¸³»±â

    +

    À§ÀÇ Áö½Ã¾î´Â µð·ºÅ丮·Î (»ç¿ëÀÚ¸íÀÌ rbowenÀÎ) + ÇÑ »ç¶÷¸¸À» µé¿©º¸³½´Ù. ´ëºÎºÐÀÇ °æ¿ì ¿©·¯ »ç¶÷À» µé¿©º¸³»°í + ½ÍÀ» °ÍÀÌ´Ù. ÀÌÁ¦ AuthGroupFileÀ» + »ç¿ëÇÒ ¶§´Ù.

    + +

    ¿©·¯ »ç¶÷À» µé¿©º¸³»°í ½Í´Ù¸é ±×·ì¸í°ú ±× ±×·ì¿¡ ¾î¶² + »ç¿ëÀÚµéÀÌ ÀÖ´ÂÁö ¾Ë·ÁÁÖ´Â ±×·ìÆÄÀÏÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ ÆÄÀÏÀÇ + Çü½ÄÀº ¸Å¿ì °£´ÜÇÏ¿©, ¾Æ¹« ÆíÁý±â·Î³ª ¸¸µé ¼ö ÀÖ´Ù. ÆÄÀϳ»¿ëÀº + ´ÙÀ½°ú °°´Ù.

    + +

    + GroupName: rbowen dpitts sungo rshersey +

    + +

    ±×³É °ø¹éÀ¸·Î ±¸ºÐÇÑ ±ä ±×·ì ±¸¼º¿ø ¸ñ·ÏÀÏ »ÓÀÌ´Ù.

    + +

    ±âÁ¸ÀÇ ¾ÏÈ£ÆÄÀÏ¿¡ »ç¿ëÀÚ¸¦ Ãß°¡ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù

    + +

    + htpasswd /usr/local/apache/passwd/passwords dpitts +

    + +

    Àü°ú °°Áö¸¸, »õ·Î ÆÄÀÏÀ» ¸¸µéÁö ¾Ê°í ±âÁ¸ ÆÄÀÏ¿¡ »ç¿ëÀÚ¸¦ + Ãß°¡ÇÑ´Ù. (-c ¿É¼ÇÀº »õ·Î ¾ÏÈ£ÆÄÀÏÀ» ¸¸µç´Ù).

    + +

    ÀÌÁ¦ .htaccess ÆÄÀÏÀ» ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

    + +

    + AuthType Basic
    + AuthName "By Invitation Only"
    + AuthUserFile /usr/local/apache/passwd/passwords
    + AuthGroupFile /usr/local/apache/passwd/groups
    + Require group GroupName +

    + +

    ±×·¯¸é GroupName ±×·ì¿¡ ¼ÓÇϸç + password ÆÄÀÏ¿¡ Ç׸ñÀÌ ÀÖ´Â »ç¿ëÀÚ°¡ ¿Ã¹Ù¸¥ + ¾ÏÈ£¸¦ ÀÔ·ÂÇϸé Á¢±ÙÀ» Çã¿ëÇÑ´Ù.

    + +

    ¿©·¯ ÀÏ¹Ý »ç¿ëÀÚ¸¦ µé¿©º¸³»´Â ´Ù¸¥ ¹æ¹ýÀÌ ÀÖ´Ù. ±×·ìÆÄÀÏÀ» + ¸¸µé ÇÊ¿ä¾øÀÌ ´ÙÀ½ Áö½Ã¾î¸¦ »ç¿ëÇϱ⸸ ÇÏ¸é µÈ´Ù.

    + +

    + Require valid-user +

    + +

    Require user rbowen ´ë½Å ÀÌ Áö½Ã¾î¸¦ »ç¿ëÇϸé + ¾ÏÈ£ÆÄÀÏ¿¡ ÀÖ´Â ´©±¸¶óµµ ¿Ã¹Ù¸¥ ¾ÏÈ£¸¦ ÀÔ·ÂÇϱ⸸ Çϸé Á¢±ÙÀ» + Çã¿ëÇÑ´Ù. ±×·ìº°·Î ´Ù¸¥ ¾ÏÈ£ÆÄÀÏÀ» »ç¿ëÇÏ¿© ±×·ì°ú ºñ½ÁÇÑ + È¿°ú¸¦ ¾òÀ» ¼öµµ ÀÖ´Ù. ÀÌ °æ¿ì ¾ÆÆÄÄ¡°¡ ÆÄÀÏ µÎ°³(¾ÏÈ£ÆÄÀϰú + ±×·ìÆÄÀÏ)°¡ ¾Æ´Ñ ÆÄÀÏ ÇѰ³(¾ÏÈ£ÆÄÀÏ)¸¸ °Ë»çÇÏ¸é µÈ´Ù´Â °ÍÀÌ + ÀåÁ¡ÀÌ´Ù. ±×·¯³ª ¿©·¯ ¾ÏÈ£ÆÄÀÏÀ» °ü¸®ÇØ¾ß Çϰí, AuthUserFile Áö½Ã¾î¿¡ + Á¤È®ÇÑ ¾ÏÈ£ÆÄÀÏÀ» ÁöÁ¤ÇØ¾ß ÇÏ´Â °ÍÀº ´ÜÁ¡ÀÌ´Ù.

    +
    top
    +
    +

    ¹ß»ýÇÒ ¼ö ÀÖ´Â ¹®Á¦Á¡

    +

    Basic ÀÎÁõ ¹æ½ÄÀº ¼­¹ö¿¡¼­ ¹®¼­¸¦ ¿äûÇÒ ¶§¸¶´Ù »ç¿ëÀÚ¸í°ú + ¾ÏÈ£¸¦ È®ÀÎÇÑ´Ù. ½ÉÁö¾î °°Àº ÆäÀÌÁö¸¦ »õ·Î °íħÇÒ ¶§µµ ÆäÀÌÁö¿Í + (±×¸²ÀÌ ¾ÏÈ£·Î º¸È£ÇÏ´Â µð·ºÅ丮¿¡ ÀÖ´Â °æ¿ì) ÆäÀÌÁö¿¡ ÀÖ´Â + ¸ðµç ±×¸²¿¡ ´ëÇØ ´Ù½Ã È®ÀÎÇÑ´Ù. ÁüÀÛÇϵíÀÌ ¼Óµµ°¡ Á¶±Ý ´À·ÁÁø´Ù. + ¾ÏÈ£ÆÄÀÏÀ» ¿­¾î¼­ »ç¿ëÀÚ¸íÀ» ãÀ» ¶§±îÁö »ç¿ëÀÚ ¸ñ·ÏÀ» »ìÆìºÁ¾ß + Çϱ⶧¹®¿¡ ¾ÏÈ£ÆÄÀÏ Å©±â°¡ Ä¿Áú ¼ö·Ï ´õ ´À·ÁÁø´Ù. ±×¸®°í + ÀÌ ÀÛ¾÷À» ÆäÀÌÁö¸¦ ¿äûÇÒ ¶§¸¶´Ù ÁøÇàÇÑ´Ù.

    + +

    ±×·¡¼­ Çö½ÇÀûÀ¸·Î ÇÑ ¾ÏÈ£ÆÄÀÏ¿¡ ÀúÀåÇÒ ¼ö ÀÖ´Â »ç¿ëÀÚ¼ö¿¡´Â + ÇѰ谡 ÀÖ´Ù. ÀÌ ÇѰè´Â »ç¿ëÇÏ´Â ¼­¹öÀÇ ¼º´É¿¡ µû¶ó ´Ù¸£Áö¸¸, + Ç׸ñÀÌ ¼ö¹é°³°¡ ³Ñ´Â´Ù¸é ´À·ÁÁø´Ù°í »ý°¢ÇÏ°í ´Ù¸¥ ÀÎÁõ ¹æ¹ýÀ» + °í·ÁÇØ¾ß ÇÑ´Ù.

    +
    top
    +
    +

    ´Ù¸¥ ¹æ¹ýµµ °¡´ÉÇѰ¡?

    +

    »ç¿ëÀÚ¸í°ú ¾ÏÈ£¸¦ »ç¿ëÇÑ ÀÎÁõÀÌ ´Ù°¡ ¾Æ´Ï´Ù. Á¾Á¾ Á¢¼ÓÇÑ + Àå¼Ò¿Í °°Àº ´Ù¸¥ Á¤º¸¸¦ °¡Áö°í »ç¿ëÀÚ¸¦ µé¿©º¸³»°í ½ÍÀ» + ¶§°¡ ÀÖ´Ù.

    + +

    Allow¿Í + Deny Áö½Ã¾î´Â + ¹®¼­¸¦ ¿äûÇÑ ÄÄÇ»ÅÍÀÇ È£½ºÆ®¸í ȤÀº È£½ºÆ® ÁÖ¼Ò¸¦ °¡Áö°í + Á¢±ÙÀ» Çã¿ëÇϰųª °ÅºÎÇÑ´Ù. Order Áö½Ã¾î´Â ÀÌ µÎ + Áö½Ã¾î¿Í °°ÀÌ »ç¿ëÇÏ¿©, ¾ÆÆÄÄ¡¿¡°Ô ¾î¶² ¼ø¼­·Î ±ÔÄ¢À» Àû¿ëÇÒÁö + ¾Ë¸°´Ù.

    + +

    À̵é Áö½Ã¾î »ç¿ë¹ýÀº ´ÙÀ½°ú °°´Ù.

    + +

    + Allow from address +

    + +

    ¿©±â¼­ address´Â IP ÁÖ¼Ò(ȤÀº IP ÁÖ¼Ò ÀϺÎ)³ª + ¿ÏÀüÇÑ µµ¸ÞÀθí(ȤÀº µµ¸ÞÀθí ÀϺÎ)ÀÌ´Ù. ¿øÇÑ´Ù¸é ¿©·¯ ÁÖ¼Ò³ª + µµ¸ÞÀθíÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    ¿¹¸¦ µé¾î, ´©±º°¡°¡ °Ô½ÃÆÇ¿¡ ±¤°í¸¦ ¿Ã¸®°í ÀÖ´Ù¸é ´ÙÀ½°ú + °°ÀÌ Á¢±ÙÀ» ¸·À» ¼ö ÀÖ´Ù.

    + +

    + Deny from 205.252.46.165 +

    + +

    ±× ÁÖ¼Ò¿¡¼­ µé¾î¿À´Â ¹æ¹®ÀÚ´Â ÀÌ Áö½Ã¾î°¡ º¸È£ÇÏ´Â ÆäÀÌÁö¸¦ + º¼ ¼ö ¾ø´Ù. IP ÁÖ¼Ò ´ë½Å ´ÙÀ½°ú °°ÀÌ ÄÄÇ»Å͸íÀ» »ç¿ëÇÒ ¼öµµ + ÀÖ´Ù.

    + +

    + Deny from host.example.com +

    + +

    ¶Ç, Àüü µµ¸ÞÀÎÀÇ Á¢±ÙÀ» ¸·À¸·Á¸é ÁÖ¼Ò³ª µµ¸ÞÀθíÀÇ ÀϺθ¦ + »ç¿ëÇÑ´Ù.

    + +

    + Deny from 192.101.205
    + Deny from cyberthugs.com moreidiots.com
    + Deny from ke +

    + +

    Order¸¦ + Deny¿Í Allow Áö½Ã¾î¿Í °°ÀÌ + »ç¿ëÇÏ¿© ½ÇÁ¦·Î ¿øÇÏ´Â ´ë»óÀ» ¸·À» ¼ö ÀÖ´Ù.

    + +

    + Order deny,allow
    + Deny from all
    + Allow from dev.example.com +

    + +

    Allow + Áö½Ã¾î¸¸ »ç¿ëÇϸé, ÇØ´ç È£½ºÆ®ÀÇ »ç¿ëÀÚ¸¦ Çã¿ëÇÏ°í °Å±â¿¡ + Ãß°¡·Î ¸ðµç »ç¶÷À» Çã¿ëÇϹǷΠ¿øÇÏ´Â °á°ú¸¦ ¾òÁö ¸øÇÑ´Ù. + ´ç½ÅÀº ƯÁ¤ »ç¶÷¸¸ Çã¿ëÇÏ±æ ¿øÇÑ´Ù.

    +
    top
    +
    +

    ´õ ¸¹Àº Á¤º¸

    +

    mod_auth_basic°ú + mod_authz_host ¹®¼­¿¡ Á¢±ÙÁ¦¾î°¡ µ¿ÀÛÇÏ´Â + ¹æ¹ý¿¡ ´ëÇÑ ´õ ¸¹Àº Á¤º¸°¡ ÀÖ´Ù.

    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/auth.html.tr.utf8 b/docs/manual/howto/auth.html.tr.utf8 new file mode 100644 index 0000000..a36fbc0 --- /dev/null +++ b/docs/manual/howto/auth.html.tr.utf8 @@ -0,0 +1,639 @@ + + + + + +Kimlik Doğrulama ve Yetkilendirme - Apache HTTP Sunucusu Sürüm 2.4 + + + + + + + +
    <-
    +

    Kimlik DoÄŸrulama ve Yetkilendirme

    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Kimlik Doğrulama istediğiniz kişileri teyid etme işlemidir. + Yetkilendirme ise kişilerin nereye gireceklerine ve hangi bilgiye + ulaşacaklarına müsaade edilmesi işlemidir.

    + +

    Genel erişim denetimi için Erişim Denetimi + Nasıl belgesine bakınız.

    +
    + +
    top
    +
    +

    İlgili modüller ve Yönergeler

    + +

    Kimlik Doğrulama ve yetkilendirme işlemi ile ilgili üç tür modül + vardır. Genellikle her bir gruptan en az bir modül seçeceksiniz.

    + + + +

    Bu modüllere ek olarak, mod_authn_core ve + mod_authz_core modülleri bulunur. Bu modüller + yetkilendirme modüllerinin çekirdeğini oluşturan temel yönergeleri + gerçekler.

    + +

    mod_authnz_ldap modülü kimlik doğrulama ve + yetkilendirme işlemlerinin ikisini birden gerçekleştirir. + mod_authz_host modülü bu işlemleri sunucu adına, IP + adresine ve isteğin karekteristiğine bağlı olarak gerçekleştirir. + Ancak kimlik doğrulama sisteminin bir parçası değildir. + mod_access ile geriye uyumluluk için + mod_access_compat diye bir modül daha vardır.

    + +

    Muhtemelen göz atmak isteyeceğiniz Erişim + Denetimi nasıl belgesi, sunucuya erişimlerin çeşitli yollarından + bahsetmektedir.

    +
    top
    +
    +

    GiriÅŸ

    +

    Sitenizde sadece küçük bir grup insana hitap eden ya da hassas + bilgileriniz varsa, bu makaledeki teknikleri kullanarak dilediğiniz + kişilerin sadece dilediğiniz sayfaları görüntülemesini + sağlayabilirsiniz.

    + +

    Bu makale sitenizin bazı parçalarını korumak için kullanacağınız + "standart" yolları içermektedir.

    + +

    Bilginize:

    +

    Eğer bilgileriniz gerçekten gizliliğe ihtiyaç duyuyorsa kimlik + doğrulamasına ilaveten mod_ssl modülünü de + kullanabilirsiniz.

    +
    + +
    top
    +
    +

    Ön gereksinimler

    + +

    Bu makalede bahsi geçen yönergeler ya ana sunucu yapılandırma + dosyasında (genellikle <Directory> bölümünde) ya da dizin içi + yapılandırma dosyalarında (.htaccess dosyaları) + bulunmak zorundadır.

    + +

    Eğer .htaccess dosyalarını kullanmayı + tasarlıyorsanız, kimlik doğrulama yönergelerine bu dosyaların içine + koymaya izin veren sunucu yapılandırmasına ihtiyacınız olacaktır. + Bunun için, dizin içi yapılandırma dosyalarının içine hangi + yönergelerin konacağını belirleyen AllowOverride yönergesi kullanılır.

    + +

    Kimlik doğrulamadan sözettiğimize göre, aşağıda gösterilen + şekilde bir AllowOverride yönergesine ihtiyacınız olacaktır:

    + +
    AllowOverride AuthConfig
    + + +

    Yönergeleri doğrudan ana sunucunun yapılandırma dosyasına + koyacaksanız bu dosyaya yazma izniniz olmalıdır.

    + +

    Bazı dosyaların nerede saklandığını bilmek için sunucunun dizin + yapısı hakkında biraz bilgi sahibi olmanız gerekmektedir. Bu çok da + zor olmamakla birlikte bu noktaya gelindiğinde konuyu + netleştireceğiz.

    + +

    Ayrıca mod_authn_core ve + mod_authz_core modülleri ya httpd + çalıştırılabilirinin içinde derlenmiş olmalı ya da + httpd.conf yapılandırma dosyası ile yüklenmelidir. Bu + iki modül HTTP sunucusunda kimlik doğrulama ve yetkilendirme + kullanımı ve yapılandırması için büyük öneme sahip temel yönergeleri + ve işlevselliği sağlar.

    + +
    top
    +
    +

    Çalışmaya Başlama

    +

    Burada, sunucu üzerindeki bir dizini parolayla korumak için + gereken temel bilgiler verilecektir.

    + +

    İlk olarak bir parola dosyası oluşturmalısınız. Bunu nasıl + yapacağınız, özellikle, seçtiğiniz kimlik doğrulayıcıya göre + değişiklik gösterir. Bunun üzerinde ileride daha fazla duracağız. + Başlangıç için parolaları bir metin dosyasında tutacağız.

    + +

    Bu dosya belge kök dizini altında olmamalıdır. Böylece başkaları + parola dosyasını indiremezler. Örneğin belgeleriniz + /usr/local/apache/htdocs üzerinden sunuluyorsa parola + dosyanızı /usr/local/apache/passwd dizininde + tutabilirsiniz.

    + +

    Dosyayı oluşturmak için Apache ile gelen + htpasswd uygulamasını kullanacağız. Bu uygulama + Apache'nin kurulumunda belirtilen bin dizininde + bulunur. Eğer Apache'yi üçüncü parti paketlerden kurduysanız, + çalıştırılabilir dosyaların bulunduğu yollar üzerinde olmalıdır.

    + +

    Bir dosya oluşturmak için şunları yazın:

    + +

    + htpasswd -c /usr/local/apache/passwd/passwords umut +

    + +

    htpasswd size parola soracaktır arkasından da + teyit etmek için parolayı tekrar girmenizi isteyecektir:

    + +

    + # htpasswd -c /usr/local/apache/passwd/passwords umut
    + New password: parolam
    + Re-type new password: parolam
    + Adding password for user umut +

    + +

    Eğer htpasswd normal yollar üzerinde değilse + çalıştırmak için dosyanın bulunduğu tam yeri belirtmeniz + gerekecektir. Dosyanın öntanımlı kurulum yeri: + /usr/local/apache2/bin/htpasswd

    + +

    Bundan sonra, sunucuyu, parola sorması için ve kimlerin erişim + izni olacağını belirlemek için yapılandıracaksınız. Bu işlemi + httpd.confdosyasını düzenleyerek ya da bir + .htaccess dosyası kullanarak yapabilirsiniz. Örneğin, + /usr/local/apache/htdocs/secret dizinini korumayı + amaçlıyorsanız, şu yönergeleri kullanabilirsiniz. Bu yönergeleri + /usr/local/apache/htdocs/secret/.htaccess dosyası içine + veya httpd.conf içindeki <Directory + "/usr/local/apache/htdocs/secret"> bölümüne koyabilirsiniz.

    + +
    AuthType Basic
    +AuthName "Gizli Dosyalar"
    +# (Aşağıdaki satırın kullanımı isteğe bağlıdır)
    +AuthBasicProvider file
    +AuthUserFile "/usr/local/apache/passwd/passwords"
    +Require user umut
    + + +

    Bu yönergeleri tek tek inceleyelim. + AuthType yönergesi + kullanıcının kimliğini doğrulamakta kullanılacak yöntemi seçer. En + çok kullanılan yöntem Basic'tir ve bu yöntem + mod_auth_basic modülüyle gerçeklenmiştir. Temel + (Basic) kimlik doğrulamasıyla gönderilen parolanın + şifrelenmeyeceğini unutmayın. Bu yöntem, bu sebepten dolayı + mod_ssl eşliğinde kullanılmadığı sürece yüksek + hassasiyete sahip bilgiler için kullanılmamalıdır. Apache bir başka + kimlik doğrulama yöntemini daha destekler: AuthType + Digest. Bu yöntem mod_auth_digest tarafından + gerçeklenmişti ve çok daha güvenli olacağı düşünülmüştü. Bu artık + geçerliliğini yitirdiğinden bağlantının bundan böyle + mod_ssl ile şifrelenmesi gerekmektedir.

    + +

    AuthName yönergesi + ile kimlik doğrulamada kullanılacak Saha da + belirtilebilir. Saha kullanımının, başlıca iki işlevi vardır. + Birincisi, istemci sıklıkla bu bilgiyi kullanıcıya parola diyalog + kutusunun bir parçası olarak sunar. İkincisi, belirtilen kimlik + doğrulamalı alan için gönderilecek parolayı belirlerken istemci + tarafından kullanılır.

    + +

    Örneğin, bir istemcinin "Gizli Dosyalar" alanında + kimliği doğrulanmış olsun. Aynı sunucu üzerinde "Gizli + Dosyalar" Sahası olarak belirlenmiş alanlarda aynı parola + özdevinimli olarak yinelenecektir. Böylece parola bir kere girilerek + aynı Sahayı paylaşan çok sayıda kısıtlanmış alana ulaşırken oluşacak + gecikmeden kullanıcı korunmuş olur. Güvenlik gerekçelerinden dolayı, + her sunucu adı değiştirilişinde istemcinin parolayı yeniden sorması + gerekir.

    + +

    AuthBasicProvider + yönergesinin öntanımlı değeri file olduğundan, bu + durumda, bu yönergenin kullanımı isteğe bağlıdır. Ancak, eğer kimlik + doğrulaması için mod_authn_dbm ya da + mod_authn_dbd gibi farklı bir kaynak seçecekseniz + bu yönergeyi kullanmanız gerekecektir.

    + +

    AuthUserFile + yönergesi htpasswd ile oluşturduğumuz parola + dosyasının yerini belirtmek için kullanılır. Eğer çok sayıda + kullanıcınız varsa her bir kullanıcıyı her kimlik doğrulama isteği + için kimlik bilgilerini bir metin dosyasında aramak gayet yavaş + olacaktır. Apache, kullanıcı bilgilerini hızlı bir veritabanı + dosyasında depolama özelliğine de sahiptir. Bu amaçla, + mod_authn_dbm modülünün + AuthDBMUserFile + yönergesi kullanılabilir. Bu dosyalar dbmmanage ve + htdbm programı ile oluşturulabilir ve değiştirilebilir. + Üçüncü parti modüllerinde çok sayıda + başka kimlik doğrulama türü de vardır.

    + +

    Son olarak Require + yönergesi, sunucunun bu bölgesine erişimine izin verilen + kullanıcıları ayarlama işleminin kimlik doğrulamasıyla ilgili + kısmını sağlar. Bir sonraki bölümde Require yönergesini kullanmanın + çeşitli yoları üzerinde duracağız.

    +
    top
    +
    +

    Birden çok kişiye izin vermek

    + +

    Yukarıdaki yönergelerle bir dizinde sadece bir kişiye + (umut adlı kullanıcıya) izin verir. Çoğunlukla birden + çok kişiye izin verilmesi istenir. Bu durumda AuthGroupFile yönergesi + devreye girer.

    + +

    Eğer birden çok kişiye izin vermek istiyorsanız içinde kullanıcı + isimlerinin olduğu bir grup dosyası oluşturmalısınız. Bu dosyanın + biçemi gayet basittir ve bunu herhangi bir metin düzenleyici ile + oluşturabilirsiniz. Bu dosyanın içeriği aşağıdaki gibi + görünecektir:

    + +

    + GroupName: umut samet engin kubilay +

    + +

    Dosya, sadece, boşluklarla birbirinden ayrılmış gurup üyelerinin + isimlerinden oluşan uzun bir liste içerir.

    + +

    Varolan parola dosyasına bir kullanıcı eklemek için şunu + yazın:

    + +

    + htpasswd /usr/local/apache/passwd/passwords birey +

    + +

    Evvelce almış olduğunuz yanıtı yine alacaksınız ama bu sefer yeni + bir dosya oluşturulmak yerine var olan bir dosyaya eklenecektir. + (Yeni bir parola dosyası oluşturmak için -c seçeneği + kullanılır).

    + +

    Şimdi, .htaccess dosyanızı veya + <Directory> bölümünüzü + aşağıda görüldüğü şekilde değiştirebilirsiniz:

    + +
    AuthType Basic
    +AuthName "Davete Binaen"
    +# Satır isteğe bağlıdır:
    +AuthBasicProvider file
    +AuthUserFile "/usr/local/apache/passwd/passwords"
    +AuthGroupFile "/usr/local/apache/passwd/groups"
    +Require group Grupismi
    + + +

    Artık, Grupismi gurubunda listelenmiş ve + password dosyasında kaydı olan kişiye, parolayı doğru + yazdığı takdirde izin verilecektir.

    + +

    Çoklu kullanıcıya izin veren biraz daha az kullanılan başka bir + yol daha mevcuttur. Bir gurup dosyası oluşturmaktansa, şu yönergeyi + kullanabilirsiniz:

    + +
    Require valid-user
    + + +

    Require user umut satırı ile parola dosyasında + listelenmiş ve parolayı doğru olarak giren herhangi bir kişiye izin + vermektense, her grup için ayrı bir parola dosyası tutarak grup + davranışını taklit edebilirsiniz.

    + +
    top
    +
    +

    Olası Sorunlar

    +

    Temel kimlik doğrulama yolu belirtildiği için, sunucuya + yaptığınız her belge istediğinde kullanıcı adınızın ve parolanızın + doğrulanması gerekir. Hatta aynı sayfayı yeniden yüklerken ya da + sayfadaki her bir resim için bu yapılmalıdır (şayet korunmakta olan + bir dizinden geliyorsa). Bu işlem hızı azaltacaktır. Yavaşlama + miktarı parola dosyanızın büyüklüğü ile orantılı olacaktır, çünkü bu + işlem sırasında dosya açılacak ve kullanıcıların arasında isminiz + bulunana kadar liste aşağı doğru taranacaktır. Bu işlem sayfa her + yüklenişinde tekrar edilecektir.

    + +

    Buradan çıkacak sonuç, bir parola dosyasına konulan kullanıcı + sayısında bir üst sınır olması gerekliliğidir. Bu sınır sunucunuzun + başarımına bağlı olarak değişiklik gösterir. Bir kaç yüz kayıtın + üstünde giriş yaptığınızda hız düşüşünü gözlemlebilirsiniz İşte bu + anda kimlik doğrulama için başka bir yöntem aramaya başlarsınız.

    + +
    top
    +
    +

    Diğer parola depolama yöntemleri

    + +

    Parolaları basit bir metin dosyasında depolamak yukarıda + bahsedilen sorunlara yol açtığından parolaları başka bir yerde + depolamayı düşünebilirsiniz; örneğin bir veritabanında.

    + +

    mod_authn_dbm ve mod_authn_dbd + modülleri bunu mümkün kılan iki modüldür. Depolama yönemi olarak + AuthBasicProvider file yerine, dbm + veya dbd kullanabilirsiniz.

    + +

    Bir metin dosyası yerine bir dbm dosyası kullanım örneği:

    + +
    <Directory "/www/docs/private">
    +    AuthName "Private"
    +    AuthType Basic
    +    AuthBasicProvider dbm
    +    AuthDBMUserFile "/www/passwords/passwd.dbm"
    +    Require valid-user
    +</Directory>
    + + +

    Başka seçenekler de mümkündür. Ayrınılar için + mod_authn_dbm belgesine başvurun.

    + +
    top
    +
    +

    Birden çok tedarikçi kullanmak

    + +

    Kimlik doğrulama ve yetkilendirme mimarisine dayalı yeni + tedarikçiyi kullanarak tek bir yetkilendirme ya da kimlik doğrulama + yöntemine kilitlenip kalmayacaksınız. Aslında birden çok tedarikçi + ihtiyacınıza cevap vermek için bir arada kullanılabilir. Aşağıdaki + örnekte dosya ve LDAP tabanlı kimlik doğrulama tedarikçileri bir + arada kullanılmıştır.

    + +
    <Directory "/www/docs/private">
    +    AuthName "Private"
    +    AuthType Basic
    +    AuthBasicProvider file ldap
    +    AuthUserFile "/usr/local/apache/passwd/passwords"
    +    AuthLDAPURL ldap://ldaphost/o=yourorg
    +    Require valid-user
    +</Directory>
    + + +

    Bu örnekte dosya tedarikçisi, ilk olarak kullanıcının kimliğini + doğrulamaya teşebbüs edecektir. Kullanıcının kimliği + doğrulanamıyorsa LDAP tedarikçisi çağırılır. Eğer kurumunuz birden + çok kimlik doğrulama tedarikçisini yürürlüğe koyuyorsa bu, kimlik + doğrulama faaliyet alanının genişletilmesini sağlar. Diğer kimlik + kanıtlama ve yetkilendirme senaryoları tek bir kimlik doğrulaması + ile birden fazla yetkilendirme türüne izin verebilir.

    + +

    Çok sayıda kimlik doğrulama tedarikçisi uygulamaya konulabileceği + gibi, çok sayıda yetkilendirme yöntemi de kullanılabilir. Bu örnekte + dosya için hem dosyalı hem de LDAP grup kimlik doğrulaması + kullanılmıştır.

    + +
    <Directory "/www/docs/private">
    +    AuthName "Private"
    +    AuthType Basic
    +    AuthBasicProvider file
    +    AuthUserFile "/usr/local/apache/passwd/passwords"
    +    AuthLDAPURL ldap://ldaphost/o=yourorg
    +    AuthGroupFile "/usr/local/apache/passwd/groups"
    +    Require group GroupName
    +    Require ldap-group cn=mygroup,o=yourorg
    +</Directory>
    + + +

    Kimlik doğrulama konusunu biraz daha genişletirsek, <RequireAll> ve + <RequireAny> gibi yetkilendirme taşıyıcısı + yönergelerle hangi iznin hangi sırayla uygulanacağını + belirlenebilir. Yetkilendirme Taşıyıcıları bölümünde bunun bir uygulama + örneğini görebilirsiniz.

    + +
    top
    +
    +

    Yetkilendirmenin biraz ötesi

    +

    Tek bir veri deposundan yapılacak tek bir sınamadan çok daha + esnek kimlik doğrulaması yapılabilir. Sıralama, mantık ve hangi + kimlik doğrulamasının kullanılacağını seçmek mümkündür.

    + +

    Mantık ve sıralamanın uygulanması

    + +

    Yetkilendirmenin hangi sırayla uygulanacağı ve nasıl + denetleneceği geçmişte biraz gizemli bir konuydu. Apache 2.2'de, + tedarikçi tabanlı kimlik doğrulamasının devreye girmesiyle asıl + kimlik doğrulama işlemini yetkilendirme ve destek işlevselliğinden + ayırmak mümkün oldu. Bunun faydalarından birisi de kimlik + doğrulama tedarikçilerinin yapılandırılabilmesi ve auth modülünün + kendi yükleme sırasından bağımsız olarak özel bir sırayla + çağrılabilmesidir. Bu tedarikçi tabanlı mekanizmanın aynısı + yetkilendirmeye de getirilmiştir. Bunun anlamı Require yönergesinde hangi + izin yönteminin kullanılması gerektiğinin belirtmesinin yanında + hangi sırayla çağırılacaklarının da belirlenebildiğidir. Çok + sayıda yetkilendirme yöntemi kullanıldığında, bunlar, Require yönergelerinin + yapılandırma dosyasında göründükleri sıra ile çağırılır.

    + +

    <RequireAll> ve <RequireAny> gibi yetkilendirme + taşıyıcısı yönergelerin devreye girmesiyle yetkilendirme + yöntemlerinin ne zaman çağırılacağı ve çağırıldığında ve erişime + izin verirken hangi kuralların uygulanacağı konusunda denetim + yapılandırmanın eline geçmektedir. Karmaşık yetkilendime mantığını + ifade etmek için kullanılan bir örneği görmek için + Yetkilendirme + Taşıyıcıları bölümüne bakınız.

    + +

    Öntanımlı olarak tüm + Require yönergeleri, <RequireAny> + taşıyıcı yönergesinin içine konur. Başka bir deyişle eğer + belirtilen kimlik doğrulama yöntemlerinden herhangi biri başarılı + olursa yetkilendirme de sağlanmış olur.

    + + + +

    Erişim denetimi için yetkilendirme tedarikçilerinin + kullanımı

    + +

    Kullanıcı adı ve parolasına göre kimlik doğrulama hikayenin + sadece bir bölümüdür. Sıklıkla insanlara kim olduklarına göre + değil birşeylere dayanarak izin vermek istersiniz. Örneğin nereden + geldikleri gibi.

    + +

    all, env, host ve + ip gibi yetkilendirme tedarikçileri ile, bir belgenin + istendiği makinenin IP adresi veya konak ismi gibi bazı özelliklerine + dayalı olarak erişime izin verip vermeyeceğinizi belirtebilirsiniz.

    + +

    Bu tedarikçilerin kullanımı Require yönergesinde açıklanmıştır. Bu yönergeler, + isteklerin işlenmesi sırasında yetkilendirme aşamasında + çağırılacak yetkilendirme tedarikçilerini kayda geçirir. Örneğin: +

    + +
    Require ip adres
    +      
    + + +

    Burada, adres bir IP adresidir (veya kısmi bir IP + addresidir)

    + +
    Require host alan_adı
    +      
    + + +

    Burada, alan_adı bir tam nitelikli alan adıdır + (ya da kısmi alan adıdır); gerekirse çok sayıda alan adı veya IP + adresi de belirtilebilir.

    + +

    Örneğin, yorum alanını gereksiz iletilerle dolduran birini uzak + tutmak istediğinizi varsayalım. Bu kişiyi uzak tutmak için şunları + yapabilirsiniz:

    + +
    <RequireAll>
    +    Require all granted
    +    Require not ip 10.252.46.165
    +</RequireAll>
    + + +

    Bu adresden gelen ziyaretçiler bu yönergedeki içeriği + göremeyeceklerdir. Bunun yerine, elinizde IP adresi değil de + makine adı varsa şunu kullanabilirsiniz:

    + +
    <RequireAll>
    +    Require all granted
    +    Require not host host.example.com
    +</RequireAll>
    + + +

    Eğer alan adının tamanıdan gelecek olan bütün erişimleri + engellemek isterseniz adresin ya da alan adının bir parçasını + belirtin:

    + +
    <RequireAll>
    +    Require all granted
    +    Require not ip 192.168.205
    +    Require not host phishers.example.com moreidiots.example
    +    Require not host ke
    +</RequireAll>
    + + +

    <RequireAll> yönergesini çok sayıda + <Require> yönergesi ile birlikte kullanarak, + sadece not ile olumsuzlanan tüm koşulları gerçekleyen + bağlantılara erişim verilir. Başka bir deyişle, olumsuzlanan koşulları + gerçeklemeyen bağlantıların erişimi engellenir.

    + + + +

    EriÅŸim denetimi ve geriye uyumluluk

    + +

    Kimlik doğrulama için tedarik tabanlı mekanizma kullanımının + yan etkilerinden birisi, + Order, + Allow, + Deny ve + Satisfy erişim + denetim yönergelerine artık ihtiyaç duyulmamasıdır. Ancak eski + yapılandırmalarla uyumluluğu sağlamak için bu yönergeler + mod_access_compat modülüne taşınmıştır.

    + +

    Note

    +

    mod_access_compat ile sağlanan yönergelerin + kullanımı artık önerilmemekte, mod_authz_host + modülündeki yönergeler önerilmektedir. Order, Allow veya Deny ile + Require gibi daha yeni + olanlarının yenilerle karışık kullanımı teknik olarak mümkünse de + önerilmemektedir. mod_access_compat modülü, 2.4 + yükseltmesini kolaylaştırmak için sadece eski yönergeleri içeren + yapılandırmaları desteklemek üzere oluşturulmuştur. Daha ayrıntılı + bilgi için yükseltme belgesine bakınız. +

    +
    + + +
    top
    +
    +

    Kimlik DoÄŸrulama ArabelleÄŸi

    +

    Zaman zaman kimlik doğrulama ağınızda veya sağlayıcı(ları)nızda kabul + edilemez yükler oluşturur. Bu çoğunlukla mod_authn_dbd + (veya üçüncü parti/özel sağlayıcıların) kullanıcılarını etkiler. Bununla + ilgilenmek için httpd 2.3/2.4, kimlik bilgilerini arabelleklemek ve özgün + sağlayıcıların yüklerini azaltmak için yeni bir arabellekleme sağlayıcısı + olarak mod_authn_socache modülü ile gelmektedir.

    +

    Bu, bazı kullanıcılar için önemli bir başarım artışı sağlayabilir.

    +
    top
    +
    +

    Daha fazla bilgi

    +

    Daha fazla bilgi için mod_auth_basic ve + mod_authz_host modüllerinin belgelerine bakınız. + AuthnProviderAlias + yönergesi ile bazı yapılandırmalarınızı basitleştirebilirsiniz.

    + +

    Apache tarafından desteklenen şifrelerle ilgili bilgi için Parola Biçemleri + belgesine bakınız.

    + +

    Erişim Denetimi nasıl belgesinden de + bazı bilgiler edinebilirsiniz.

    +
    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Yorumlar

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/cgi.html b/docs/manual/howto/cgi.html new file mode 100644 index 0000000..81f1cfc --- /dev/null +++ b/docs/manual/howto/cgi.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: cgi.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: cgi.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: cgi.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: cgi.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: cgi.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/docs/manual/howto/cgi.html.en b/docs/manual/howto/cgi.html.en new file mode 100644 index 0000000..23be6f5 --- /dev/null +++ b/docs/manual/howto/cgi.html.en @@ -0,0 +1,601 @@ + + + + + +Apache Tutorial: Dynamic Content with CGI - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Apache Tutorial: Dynamic Content with CGI

    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko 

    +
    +
    + +
    top
    +
    +

    Introduction

    + + + + +

    The CGI (Common Gateway Interface) defines a way for a web + server to interact with external content-generating programs, + which are often referred to as CGI programs or CGI scripts. It + is a simple way to put dynamic content on + your web site, using whatever programming language you're most + familiar with. This document will be an introduction to setting + up CGI on your Apache web server, and getting started writing + CGI programs.

    +
    top
    +
    +

    Configuring Apache to permit CGI

    + + +

    In order to get your CGI programs to work properly, you'll + need to have Apache configured to permit CGI execution. There + are several ways to do this.

    + +
    Note: If Apache has been built with shared module + support you need to ensure that the module is loaded; in your + httpd.conf you need to make sure the + LoadModule + directive has not been commented out. A correctly configured directive + may look like this: + +
    LoadModule cgid_module modules/mod_cgid.so
    + + + + On Windows, or using a non-threaded MPM like prefork, A correctly + configured directive may look like this: + +
    LoadModule cgi_module modules/mod_cgi.so
    +
    + + +

    ScriptAlias

    + + +

    The + ScriptAlias + + directive tells Apache that a particular directory is set + aside for CGI programs. Apache will assume that every file in + this directory is a CGI program, and will attempt to execute + it, when that particular resource is requested by a + client.

    + +

    The ScriptAlias + directive looks like:

    + +
    ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"
    + + +

    The example shown is from your default httpd.conf + configuration file, if you installed Apache in the default + location. The ScriptAlias + directive is much like the Alias directive, which defines a URL prefix that + is to mapped to a particular directory. Alias + and ScriptAlias are usually used for + directories that are outside of the DocumentRoot directory. The difference between + Alias and ScriptAlias + is that ScriptAlias has the added meaning + that everything under that URL prefix will be considered a CGI + program. So, the example above tells Apache that any request for a + resource beginning with /cgi-bin/ should be served from + the directory /usr/local/apache2/cgi-bin/, and should be + treated as a CGI program.

    + +

    For example, if the URL + http://www.example.com/cgi-bin/test.pl + is requested, Apache will attempt to execute the file + /usr/local/apache2/cgi-bin/test.pl + and return the output. Of course, the file will have to + exist, and be executable, and return output in a particular + way, or Apache will return an error message.

    + + +

    CGI outside of ScriptAlias directories

    + + +

    CGI programs are often restricted to ScriptAlias'ed directories for security reasons. + In this way, administrators can tightly control who is allowed to + use CGI programs. However, if the proper security precautions are + taken, there is no reason why CGI programs cannot be run from + arbitrary directories. For example, you may wish to let users + have web content in their home directories with the + UserDir directive. + If they want to have their own CGI programs, but don't have access to + the main cgi-bin directory, they will need to be able to + run CGI programs elsewhere.

    + +

    There are two steps to allowing CGI execution in an arbitrary + directory. First, the cgi-script handler must be + activated using the AddHandler or SetHandler directive. Second, + ExecCGI must be specified in the Options directive.

    + + +

    Explicitly using Options to permit CGI execution

    + + +

    You could explicitly use the Options directive, inside your main server configuration + file, to specify that CGI execution was permitted in a particular + directory:

    + +
    <Directory "/usr/local/apache2/htdocs/somedir">
    +    Options +ExecCGI
    +</Directory>
    + + +

    The above directive tells Apache to permit the execution + of CGI files. You will also need to tell the server what + files are CGI files. The following AddHandler directive tells the server to treat all + files with the cgi or pl extension as CGI + programs:

    + +
    AddHandler cgi-script .cgi .pl
    + + + +

    .htaccess files

    + + +

    The .htaccess tutorial + shows how to activate CGI programs if you do not have + access to httpd.conf.

    + + +

    User Directories

    + + +

    To allow CGI program execution for any file ending in + .cgi in users' directories, you can use the + following configuration.

    + +
    <Directory "/home/*/public_html">
    +    Options +ExecCGI
    +    AddHandler cgi-script .cgi
    +</Directory>
    + + +

    If you wish designate a cgi-bin subdirectory of + a user's directory where everything will be treated as a CGI + program, you can use the following.

    + +
    <Directory "/home/*/public_html/cgi-bin">
    +    Options ExecCGI
    +    SetHandler cgi-script
    +</Directory>
    + + + + +
    top
    +
    +

    Writing a CGI program

    + + +

    There are two main differences between ``regular'' + programming, and CGI programming.

    + +

    First, all output from your CGI program must be preceded by + a MIME-type header. This is HTTP header that tells the client + what sort of content it is receiving. Most of the time, this + will look like:

    + +

    + Content-type: text/html +

    + +

    Secondly, your output needs to be in HTML, or some other + format that a browser will be able to display. Most of the + time, this will be HTML, but occasionally you might write a CGI + program that outputs a gif image, or other non-HTML + content.

    + +

    Apart from those two things, writing a CGI program will look + a lot like any other program that you might write.

    + +

    Your first CGI program

    + + +

    The following is an example CGI program that prints one + line to your browser. Type in the following, save it to a + file called first.pl, and put it in your + cgi-bin directory.

    + +
    #!/usr/bin/perl
    +print "Content-type: text/html\n\n";
    +print "Hello, World.";
    + + +

    Even if you are not familiar with Perl, you should be able + to see what is happening here. The first line tells Apache + (or whatever shell you happen to be running under) that this + program can be executed by feeding the file to the + interpreter found at the location /usr/bin/perl. + The second line prints the content-type declaration we + talked about, followed by two carriage-return newline pairs. + This puts a blank line after the header, to indicate the end + of the HTTP headers, and the beginning of the body. The third + line prints the string "Hello, World.". And that's the end + of it.

    + +

    If you open your favorite browser and tell it to get the + address

    + +

    + http://www.example.com/cgi-bin/first.pl +

    + +

    or wherever you put your file, you will see the one line + Hello, World. appear in your browser window. + It's not very exciting, but once you get that working, you'll + have a good chance of getting just about anything working.

    + +
    top
    +
    +

    But it's still not working!

    + + +

    There are four basic things that you may see in your browser + when you try to access your CGI program from the web:

    + +
    +
    The output of your CGI program
    +
    Great! That means everything worked fine. If the output is correct, + but the browser is not processing it correctly, make sure you have the + correct Content-Type set in your CGI program.
    + +
    The source code of your CGI program or a "POST Method Not + Allowed" message
    +
    That means that you have not properly configured Apache + to process your CGI program. Reread the section on + configuring + Apache and try to find what you missed.
    + +
    A message starting with "Forbidden"
    +
    That means that there is a permissions problem. Check the + Apache error log and the section below on + file permissions.
    + +
    A message saying "Internal Server Error"
    +
    If you check the + Apache error log, you will probably + find that it says "Premature end of + script headers", possibly along with an error message + generated by your CGI program. In this case, you will want to + check each of the below sections to see what might be + preventing your CGI program from emitting the proper HTTP + headers.
    +
    + +

    File permissions

    + + +

    Remember that the server does not run as you. That is, + when the server starts up, it is running with the permissions + of an unprivileged user - usually nobody, or + www - and so it will need extra permissions to + execute files that are owned by you. Usually, the way to give + a file sufficient permissions to be executed by nobody + is to give everyone execute permission on the file:

    + +

    + chmod a+x first.pl +

    + +

    Also, if your program reads from, or writes to, any other + files, those files will need to have the correct permissions + to permit this.

    + + + +

    Path information and environment

    + + +

    When you run a program from your command line, you have + certain information that is passed to the shell without you + thinking about it. For example, you have a PATH, + which tells the shell where it can look for files that you + reference.

    + +

    When a program runs through the web server as a CGI program, + it may not have the same PATH. Any programs that you + invoke in your CGI program (like sendmail, for + example) will need to be specified by a full path, so that the + shell can find them when it attempts to execute your CGI + program.

    + +

    A common manifestation of this is the path to the script + interpreter (often perl) indicated in the first + line of your CGI program, which will look something like:

    + +
    #!/usr/bin/perl
    + + +

    Make sure that this is in fact the path to the + interpreter.

    +
    + When editing CGI scripts on Windows, end-of-line characters may be + appended to the interpreter path. Ensure that files are then + transferred to the server in ASCII mode. Failure to do so may + result in "Command not found" warnings from the OS, due to the + unrecognized end-of-line character being interpreted as a part of + the interpreter filename. +
    + + +

    Missing environment variables

    + + +

    If your CGI program depends on non-standard environment variables, you will need to + assure that those variables are passed by Apache.

    + +

    When you miss HTTP headers from the environment, make + sure they are formatted according to + RFC 2616, + section 4.2: Header names must start with a letter, + followed only by letters, numbers or hyphen. Any header + violating this rule will be dropped silently.

    + + + +

    Program errors

    + + +

    Most of the time when a CGI program fails, it's because of + a problem with the program itself. This is particularly true + once you get the hang of this CGI stuff, and no longer make + the above two mistakes. The first thing to do is to make + sure that your program runs from the command line before + testing it via the web server. For example, try:

    + +

    + cd /usr/local/apache2/cgi-bin
    + ./first.pl +

    + +

    (Do not call the perl interpreter. The shell + and Apache should find the interpreter using the path information on the first line of + the script.)

    + +

    The first thing you see written by your program should be + a set of HTTP headers, including the Content-Type, + followed by a blank line. If you see anything else, Apache will + return the Premature end of script headers error if + you try to run it through the server. See Writing a CGI program above for more + details.

    + + +

    Error logs

    + + +

    The error logs are your friend. Anything that goes wrong + generates message in the error log. You should always look + there first. If the place where you are hosting your web site + does not permit you access to the error log, you should + probably host your site somewhere else. Learn to read the + error logs, and you'll find that almost all of your problems + are quickly identified, and quickly solved.

    + + +

    Suexec

    + + +

    The suexec support program + allows CGI programs to be run under different user permissions, + depending on which virtual host or user home directory they are + located in. Suexec has very strict permission checking, and any + failure in that checking will result in your CGI programs + failing with Premature end of script headers.

    + +

    To check if you are using suexec, run apachectl + -V and check for the location of SUEXEC_BIN. + If Apache finds an suexec binary there on startup, + suexec will be activated.

    + +

    Unless you fully understand suexec, you should not be using it. + To disable suexec, simply remove (or rename) the suexec + binary pointed to by SUEXEC_BIN and then restart the + server. If, after reading about suexec, + you still wish to use it, then run suexec -V to find + the location of the suexec log file, and use that log file to + find what policy you are violating.

    + +
    top
    +
    +

    What's going on behind the scenes?

    + + +

    As you become more advanced in CGI programming, it will + become useful to understand more about what's happening behind + the scenes. Specifically, how the browser and server + communicate with one another. Because although it's all very + well to write a program that prints "Hello, World.", it's not + particularly useful.

    + +

    Environment variables

    + + +

    Environment variables are values that float around you as + you use your computer. They are useful things like your path + (where the computer searches for the actual file + implementing a command when you type it), your username, your + terminal type, and so on. For a full list of your normal, + every day environment variables, type + env at a command prompt.

    + +

    During the CGI transaction, the server and the browser + also set environment variables, so that they can communicate + with one another. These are things like the browser type + (Netscape, IE, Lynx), the server type (Apache, IIS, WebSite), + the name of the CGI program that is being run, and so on.

    + +

    These variables are available to the CGI programmer, and + are half of the story of the client-server communication. The + complete list of required variables is at + Common Gateway + Interface RFC.

    + +

    This simple Perl CGI program will display all of the + environment variables that are being passed around. Two + similar programs are included in the + cgi-bin + + directory of the Apache distribution. Note that some + variables are required, while others are optional, so you may + see some variables listed that were not in the official list. + In addition, Apache provides many different ways for you to + add your own environment variables + to the basic ones provided by default.

    + +
    #!/usr/bin/perl
    +use strict;
    +use warnings;
    +
    +print "Content-type: text/html\n\n";
    +foreach my $key (keys %ENV) {
    +    print "$key --> $ENV{$key}<br>";
    +}
    + + + +

    STDIN and STDOUT

    + + +

    Other communication between the server and the client + happens over standard input (STDIN) and standard + output (STDOUT). In normal everyday context, + STDIN means the keyboard, or a file that a + program is given to act on, and STDOUT + usually means the console or screen.

    + +

    When you POST a web form to a CGI program, + the data in that form is bundled up into a special format + and gets delivered to your CGI program over STDIN. + The program then can process that data as though it was + coming in from the keyboard, or from a file

    + +

    The "special format" is very simple. A field name and + its value are joined together with an equals (=) sign, and + pairs of values are joined together with an ampersand + (&). Inconvenient characters like spaces, ampersands, and + equals signs, are converted into their hex equivalent so that + they don't gum up the works. The whole data string might look + something like:

    + +

    + name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey +

    + +

    You'll sometimes also see this type of string appended to + a URL. When that is done, the server puts that string + into the environment variable called + QUERY_STRING. That's called a GET + request. Your HTML form specifies whether a GET + or a POST is used to deliver the data, by setting the + METHOD attribute in the FORM tag.

    + +

    Your program is then responsible for splitting that string + up into useful information. Fortunately, there are libraries + and modules available to help you process this data, as well + as handle other of the aspects of your CGI program.

    + +
    top
    +
    +

    CGI modules/libraries

    + + +

    When you write CGI programs, you should consider using a + code library, or module, to do most of the grunt work for you. + This leads to fewer errors, and faster development.

    + +

    If you're writing CGI programs in Perl, modules are + available on CPAN. The most + popular module for this purpose is CGI.pm. You might + also consider CGI::Lite, which implements a minimal + set of functionality, which is all you need in most programs.

    + +

    If you're writing CGI programs in C, there are a variety of + options. One of these is the CGIC library, from + https://web.mit.edu/wwwdev/www/cgic.html.

    +
    top
    +
    +

    For more information

    + + +

    The current CGI specification is available in the + Common Gateway + Interface RFC.

    + +

    When you post a question about a CGI problem that you're + having, whether to a mailing list, or to a newsgroup, make sure + you provide enough information about what happened, what you + expected to happen, and how what actually happened was + different, what server you're running, what language your CGI + program was in, and, if possible, the offending code. This will + make finding your problem much simpler.

    + +

    Note that questions about CGI problems should never + be posted to the Apache bug database unless you are sure you + have found a problem in the Apache source code.

    +
    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/cgi.html.es b/docs/manual/howto/cgi.html.es new file mode 100644 index 0000000..398d7f6 --- /dev/null +++ b/docs/manual/howto/cgi.html.es @@ -0,0 +1,619 @@ + + + + + +Tutorial de Apache: Contenido Dinámico con CGI - Servidor HTTP Apache Versión 2.4 + + + + + + + +
    <-
    +

    Tutorial de Apache: Contenido Dinámico con CGI

    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko 

    +
    +
    Esta traducción podría estar + obsoleta. Consulte la versión en inglés de la + documentación para comprobar si se han producido cambios + recientemente.
    +
    + +
    top
    +
    +

    Introducción

    + + + +

    CGI (Common Gateway Interface) es un método por el cual + un servidor web puede interactuar con programas externos de + generación de contenido, a ellos nos referimos comúnmente como + programas CGI o scripts CGI. Es el método más común y sencillo de + mostrar contenido dinámico en su sitio web. Este documento es una + introducción para configurar CGI en su servidor web Apache, y de + iniciación para escribir programas CGI.

    +
    top
    +
    +

    Configurando Apache para permitir CGI

    + + +

    Para conseguir que sus programas CGI funcionen correctamente, + deberá configurar Apache para que permita la ejecución de CGI. Hay + distintas formas de hacerlo.

    + +
    Nota: Si Apache ha sido compilado con soporte + de módulos compartidos, necesitará que el módulo de CGI esté cargado; + en su httpd.conf tiene que asegurarse de que la directiva + LoadModule + no ha sido comentada. Una directiva configurada correctamente sería así: + +
    LoadModule cgid_module modules/mod_cgid.so
    + + + En Windows, o si usa un mpm que no es multihilo, como prefork, una + directiva configurada correctamente podría definirse así: + +
    LoadModule cgi_module modules/mod_cgi.so
    +
    + +

    ScriptAlias

    + + +

    La directiva + ScriptAlias + indica a Apache que un directorio se ha configurado específicamente + para programas CGI. Apache asumirá que cada fichero en este + directorio es un programa CGI, e intentará ejecutarlos cuando un + cliente solicita este recurso.

    + +

    La directiva + ScriptAlias se puede + definir así:

    + +
    ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"
    + + +

    El ejemplo que se muestra es de un archivo de configuración + httpd.conf por defecto si usted instaló Apache + en la ubicación por defecto. La directiva + ScriptAlias es muy + parecida a la directiva Alias, + ésta define un prefijo de URL que se enlaza a un directorio + en particular. Alias y + ScriptAlias se usan generalmente para + directorios que se encuentran fuera del directorio + DocumentRoot. La diferencia + entre Alias y ScriptAlias + es que en ScriptAlias cualquier elemento + debajo de ese prefijo de URL será considerado un programa CGI. Así, + el ejemplo de más arriba le indica a Apache que + cualquier solicitud para un recurso que comience con + /cgi-bin/ debería servirse desde el directorio + /usr/local/apache2/cgi-bin/, y debería tratarse como un + programa CGI.

    + +

    Por ejemplo, si se solicita la URL + http://www.example.com/cgi-bin/test.pl, + Apache intentará ejecutar el archivo + /usr/local/apache2/cgi-bin/test.pl y dar + el resultado. Por supuesto el archivo debe existir y ser ejecutable, + y dar el resultado de una manera específica o Apache devolverá + un mensaje de error.

    + + +

    CGI fuera de directorios ScriptAlias

    + + +

    Los programas CGI habitualmente se restringen a los directorios de + ScriptAlias por razones de + seguridad. De esta manera, los administradores pueden controlar de una + manera más segura quien puede ejecutar programas CGI. Aun así, si no + se toman suficientes precauciones, no hay ninguna razón por la que + programas CGI no se puedan ejecutar desde directorios seleccionados de + manera arbitraria. Por ejemplo, quizás quiera permitir que usuarios del + sistema tengan contenido web en sus directorios home con la directiva + UserDir. Si quieren + tener sus propios programas CGI, pero no tienen acceso al directorio + principal cgi-bin, necesitarán ser capaces de + ejecutar sus scripts CGI en algún otro sitio.

    + +

    Hay dos pasos a seguir para permitir la ejecución CGI en directorios + seleccionados de manera arbitraria. Primero, el handler + cgi-script debe estar activado usando la directiva + AddHandler o la directiva + SetHandler. Segundo, el parámetro + ExecCGI debe estar definido en la directiva + Options.

    + + +

    Usando Options de manera explícita para permitir ejecución de + CGI

    + + +

    Puede usar la directiva + Options, en el archivo de + configuración principal para especificar que se permite la ejecución + de CGI en un directorio en particular:

    + +
    <Directory "/usr/local/apache2/htdocs/somedir">
    +    Options +ExecCGI
    +</Directory>
    + + +

    Esta directiva de aquí arriba le indica a Apache que debe + permitir la ejecución de archivos CGI. También necesitará indicarle + al servidor que los archivos son archivos CGI. La directiva + AddHandler le indica al + servidor que debe tratar a todos los archivos con la extensión + cgi o pl como programas CGI:

    + +
    AddHandler cgi-script .cgi .pl
    + + + +

    Ficheros .htaccess

    + + +

    El tutorial .htaccess + enseña como activar programas CGI si no tienes acceso a + httpd.conf.

    + + +

    Directorios de Usuario

    + + +

    Para permitir la ejecución de programas CGI para cualquier + archivo que acabe en .cgi en directorios de usuario, + puedes usar la siguiente configuración:

    + +
    <Directory "/home/*/public_html">
    +    Options +ExecCGI
    +    AddHandler cgi-script .cgi
    +</Directory>
    + + +

    Si quiere designar un subdirectorio cgi-bin dentro + de un directorio de usuario en el que todos los ficheros serán + tratados como un programa CGI, puede usar lo siguiente:

    + +
    <Directory "/home/*/public_html/cgi-bin">
    +    Options ExecCGI
    +    SetHandler cgi-script
    +</Directory>
    + + +
    top
    +
    +

    Escribiendo un programa CGI

    + + +

    Hay dos diferencias principales entre programación ``regular'' y + programación en CGI.

    + +

    Primera, el resultado al completo de tu programa CGI debe estar + precedido de una cabecera MIME-type. Esta + cabecera HTTP le indica al cliente que tipo de contenido está + recibiendo. La mayor parte de las veces, ésto será algo como:

    + +

    + Content-type: text/html +

    + +

    Segunda, el resultado debe estar en formato HTML, o cualquier + otro formato que su navegador sea capaz de mostrar. La mayor + parte de las veces, será HTML, pero otras escribirá un programa + CGI que devuelve una imagen gif, u otro contenido no-HTML.

    + +

    Aparte de estas dos cosas, escribir un programa en CGI se + parecerá bastante a cualquier otro programa que vaya a escribir. +

    + + +

    Su primer programa CGI

    + + +

    A continuación podrá ver un ejemplo de programa CGI que muestra + una línea de texto en su navegador. Escriba lo siguiente, + guárdelo en un archivo con el nombre first.pl, y + póngalo en su directorio cgi-bin.

    + +
    #!/usr/bin/perl
    +print "Content-type: text/html\n\n";
    +print "Hola, Mundo.";
    + + +

    Incluso si Perl no le resulta familiar, podrá ver lo que está + ocurriendo aquí. La primera línea le dice a Apache (o a + cualquier shell en la que se esté ejecutando) que este programa + puede ejecutarse con el intérprete en la ubicación + /usr/bin/perl. La segunda línea imprime la + declaración de Content-Type que mencionamos antes, seguida de + dos pares de retornos de carro. Esto pone una línea en blanco + después de la cabecera para indicar el final de las cabeceras + HTTP, y el comienzo del cuerpo del contenido. La tercera + imprime la cadena de caracteres "Hola, Mundo.". Y ese es el + final del programa.

    + +

    Si lo abre con su navegador favorito y le dice que solicite la + dirección

    + +

    + http://www.example.com/cgi-bin/first.pl +

    + +

    o donde quiera que pusiera el archivo, verá una línea + Hola, Mundo. aparecerán la ventana del navegador. No es + muy emocionante, pero una vez que consiga que funcione podrá hacer + lo mismo con casi cualquier programa.

    + +
    top
    +
    +

    ¡Pero todavía no funciona!

    + + +

    Hay 4 cosas básicas que puede llegar a ver en su navegador cuando + intenta acceder a un programa CGI desde la web:

    + +
    +
    El resultado del programa CGI
    +
    ¡Genial! Esto indica que todo funcionó correctamente. Si el + resultado es correcto, pero el navegador no lo procesa + correctamente, asegúrese de que tiene especificado + correctamente el Content-Type en su programa + CGI.
    + +
    El código fuente de su programa CGI o un mensaje del tipo + "POST Method Not Allowed".
    + +
    Eso significa que no ha configurado Apache de manera + apropiada para interpretar su programa CGI. Relea la sección + de Configurando Apache e intente + encontrar qué le falta.
    + +
    Un mensaje que empieza con "Forbidden"
    +
    Eso significa que hay un problema de permisos. Compruebe el + Log de Errores de Apache y la + sección de más abajo de Permisos de + Fichero.
    + +
    Un mensaje indicando "Internal Server Error"
    +
    Si comprueba el Log de errores de + Apache, probablemente encontrará que indica "Premature + end of script headers", posiblemente acompañado de otro + mensaje de error generado por su programa CGI. En este caso, + querrá comprobar cada una de las secciones de más adelante + para ver qué impide que su programa CGI genere las cabeceras + HTTP adecuadas.
    +
    + +

    Permisos de Fichero

    + + +

    Recuerde que el servidor no se ejecuta con su usuario. Es decir, + cuando el servidor arranca, está funcionando con un usuario sin + privilegios, generalmente el usuario nobody, o + www-data, así que necesitará permisos extra para + ejecutar los archivos de los que usted es dueño. Generalmente, + el método para dar permisos suficientes para que se pueda + ejecutar con nobody es dar permisos de ejecución a + todo el mundo en el fichero:

    + +

    + chmod a+x first.pl +

    + +

    Además, si su programa lee desde o escribe a cualquier otro/s + archivo/s, esos archivos necesitarán tener los permisos correctos + para permitir esas acciones.

    + + + +

    Información de Ruta y Entorno

    + + +

    Cuando ejecuta un programa desde la línea de comandos, usted tiene + cierta información que se le pasa a la shell sin que usted se + percate de ello. Por ejemplo, usted tiene un PATH, + que le indica a la shell dónde debe buscar archivos a los que usted + hace referencia.

    + +

    Cuando un programa se ejecuta a través del servidor web como un + programa CGI, puede que no tenga el mismo PATH. + Cualquier programa que invoque desde su programa CGI (como por + ejemplo sendmail) necesitará que se le indique la + ruta absoluta, así la shell puede encontrarlos cuando intenta + ejecutar su programa CGI.

    + +

    Una manifestación común de esto es la ruta del intérprete del + script (a menudo perl) indicado en la primera línea + de su programa CGI, que parecerá algo como:

    + +
    #!/usr/bin/perl
    + + +

    Asegúrese de que éste es de hecho el path de su intérprete.

    +
    + Cuando edita scripts CGI en Windows, los caracteres de retorno de + carro podrían añadirse a la línea donde se especifica el intérprete. + Asegúrese de que los archivos se transfieren al servidor en modo + ASCII. Fallar en esto puede acabar con avisos del tipo "Command not + found" del Sistema Operativo, debido a que éste no reconoce los + caracteres de final de línea interpretados como parte del nombre + de fichero del intérprete. +
    + + +

    Faltan Variables de Entorno

    + + +

    Si su programa CGI depende de variables de entorno no estándar, necesitará + asegurarse de que Apache pasa esas variables.

    + +

    Cuando no encuentra ciertas cabeceras HTTP del entorno, asegúrese + de que están formateadas según el + RFC 2616, + sección 4.2: Nombres de Cabeceras deben empezar con una letra, + seguida solo de letras, números o guión. Cualquier cabecera + que no cumpla esta regla será ignorada de manera silenciosa.

    + + + +

    Errores de Programa

    + + +

    La mayor parte de las veces cuando un programa CGI falla, es por un + problema en el programa mismo. Esto ocurre generalmente cuando se + maneja bien con "esto del CGI", y ya no comete los dos errores + mencionados más arriba. Lo primero que hay que hacer es asegurarse + de que su programa se ejecuta correctamente en línea de comandos + antes de probarlo a través del servidor web. Por ejemplo, + intente:

    + +

    + cd /usr/local/apache2/cgi-bin
    + ./first.pl +

    + +

    (No llame al intérprete de perl. La consola y Apache + tienen que poder encontrar el intérprete usando línea + línea de información en la primera + línea del script.)

    + +

    Lo primero que debe ver escrito por su programa es un conjunto de + cabeceras HTTP, incluyendo el Content-Type, + seguido de una línea en blanco. Si ve alguna otra cosa, Apache + devolverá el error Premature end of script headers si + intenta lanzar el script en el servidor web. Vea + Escribiendo un programa CGI más arriba para + más detalle.

    + + +

    Log de Errores

    + + +

    El log de errores es su amigo. Cualquier cosa que vaya mal generará + un mensaje en el log de errores. Debería mirar siempre ahí primero. + Si el lugar donde está alojando su sitio web no permite que acceda + al log de errores, probablemente debería alojarlo en otro sitio. + Aprenda a leer el log de errores y se dará cuenta de que enseguida + averiguará el motivo del error y lo solucionará rápidamente.

    + + +

    Suexec

    + + +

    El programa de soporte suexec permite + que programas CGI se ejecuten con permisos de usuario distintos, + dependiendo del virtualhost o el directorio home donde se + encuentren. Suexec tiene una comprobación de permisos muy estricta, + y cualquier fallo en esa comprobación dará como resultado un error + con el mensaje Premature end of script headers.

    + +

    Para comprobar si está usando Suexec, ejecute + apachectl -V y compruebe la ubicación de + SUEXEC_BIN. Si Apache encuentra un binario + suexec al arrancar, suexec se activará.

    + +

    A menos que comprenda suxec perfectamente, no debería usarlo. + Para desactivar suexec, basta con eliminar el binario + suexec al que apunta SUEXEC_BIN y + reiniciar el servidor. Si después de leer sobre + suexec todavía quiere usarlo, entonces + ejecute suexec -V para encontrar la ubicación del + fichero log de suexec, y use ese log para encontrar que política no + está cumpliendo.

    + +
    top
    +
    +

    ¿Qué ocurre entre bastidores?

    + + +

    En cuanto tenga conocimiento avanzado de programación CGI, le será + útil comprender más de lo que ocurre entre bastidores. + Específicamente, cómo el navegador y el servidor se comunican el uno + con el otro. Porque aunque esté muy bien escribir un programa que + diga "Hola, Mundo.", no tiene una gran utilidad.

    + +

    Variables de Entorno

    + + +

    Las variables de entorno son valores que están ahí cuando + usa el ordenador. Son cosas útiles como el path (donde su ordenador + busca el archivo específico que se lanza cuando usted escribe un + comando), su nombre de usuario, el tipo de terminal que usa, etc. + Para una lista completa de la variables de entorno normales que se + se usan en su día a día escriba env en la línea de + comandos.

    + +

    Durante la transacción CGI, el servidor y el navegador también + configuran variables de entorno, y así pueden comunicarse entre + ellos. Cosas como el tipo de navegador (Netscape, IE, Lynx), el tipo + de servidor (Apache, IIS, WebSite), el nombre del programa CGI que + se está ejecutando, etc.

    + +

    Estas variables están disponibles para el programador de CGI, y son + la mitad de la historia de la comunicación cliente-servidor. La + lista completa de las variables necesarias se encuentra en + el RFC de Common Gateway + Interface.

    + +

    Este sencillo programa CGI en Perl mostrará todas las variables + de entorno que se están pasando entre el cliente y el navegador. Dos + programas similares están incluidos en el directorio + cgi-bin de la distribución de Apache. Tenga en cuenta + que algunas variables son necesarias mientras que otras son + opcionales, así que es posible que vea algunas variables que no + están en la lista oficial. Adicionalmente, Apache aporta distintas + maneras diferentes para que pueda + añadir sus variables de entorno a las + básicas que se proveen por defecto.

    + +
    #!/usr/bin/perl
    +use strict;
    +use warnings;
    +
    +print "Content-type: text/html\n\n";
    +          
    +foreach my $key (keys %ENV) {
    +    print "$key --> $ENV{$key}<br>";
    +}
    + + + +

    STDIN y STDOUT

    + + +

    Otra comunicación entre el servidor y el cliente ocurre en la + entrada estándar (STDIN) y la salida estándar + (STDOUT). En el contexto normal de cada día, + STDIN es la entrada con el teclado, o un fichero que se + le da a un programa para que actúe sobre él, y STDOUT + generalmente es la consola o la pantalla.

    + +

    Cuando hace POST con un formulario de web a un programa + CGI, los datos en ese formulario se empaquetan en un formato especial + que se entrega a su programa CGI en el STDIN. + Entonces el programa puede procesar la información como si le llegara + desde el teclado, o desde un fichero.

    + +

    El "formato especial" es muy sencillo. Un nombre de campo y su + valor se asocian juntos con el signo igual (=), y pares de valores + se asocian juntos con el ampersand ó et en español (&). + Caracteres inconvenientes como los espacios, ampersands y signos de + igual, se convierten en su equivalente hexadecimal para no impidan + el funcionamiento correcto del programa. La cadena de datos al + completo será algo como:

    + +

    + name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey +

    + +

    A veces tendrá este tipo de cadena de caracteres al final de una + URL. Cuando esto ocurre, el servidor pone esa cadena en una variable + de entorno que se llama QUERY_STRING. Esto se llama + solicitud GET. Su formulario HTML especifica si se usa + un GET o un POST para entregar la + información, configurando el atributo METHOD en la + etiqueta FORM.

    + +

    Su programa es el responsable de convertir esa cadena de + caracteres en información útil. Afortunadamente, hay librerías y + módulos disponibles que ayudan a procesar la información, así como a + gestionar los distintos aspectos de su programa CGI.

    + +
    top
    +
    +

    Módulos/librerías CGI

    + + +

    Cuando escribe programas CGI, debería considerar usar una librería de + código, o módulo, para hacer todo el trabajo más arduo por usted. + Esto lleva a tener menos errores y un desarrollo de código más + rápido.

    + +

    Si está escribiendo un programa CGI en Perl, existen módulos + disponibles en CPAN. El módulo más + conocido para este propósito es CGI.pm. Quizás quiera + considerar CGI::Lite, que implementa una funcionalidad + mínima, que es todo lo que se necesita en la mayoría de los programas.

    + +

    Si está escribiendo programas CGI en C, hay varidad de opciones. Una + de estas es la librería CGIC, de + http://www.boutell.com/cgic/. +

    +
    top
    +
    +

    Para más información

    + + +

    La especificación actual de CGI está disponible en el + RFC de Common Gateway + Interface.

    + +

    Cuando envíe una pregunta sobre un problema de CGI, o bien a una + lista de correo, o a un grupo de noticias, asegúrese de que facilita suficiente + información de lo que ha ocurrido, de lo que espera que ocurra, y de + lo que está ocurriendo en su lugar que es diferente, el servidor que + está ejecutando, en qué lenguaje CGI está hecho su programa, y si es + posible, el código que falla. Esto hará encontrar el problema mucho más + fácil.

    + +

    Tenga en cuenta que las preguntas sobre problemas CGI + nunca deberían enviarse a la base de datos de bugs de + bugs de Apache a menos que esté seguro de haber encontrado un + problema en el código fuente de Apache.

    +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko 

    +
    top

    Comentarios

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/cgi.html.fr.utf8 b/docs/manual/howto/cgi.html.fr.utf8 new file mode 100644 index 0000000..bb28050 --- /dev/null +++ b/docs/manual/howto/cgi.html.fr.utf8 @@ -0,0 +1,643 @@ + + + + + +Tutoriel Apache : Contenu dynamique basé sur CGI - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Tutoriel Apache : Contenu dynamique basé sur CGI

    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko 

    +
    +
    + +
    top
    +
    +

    Introduction

    + + + + +

    CGI (Common Gateway Interface) définit une méthode d'interaction + entre un serveur web et des programmes générateurs de contenu + externes, plus souvent appelés programmes CGI ou scripts CGI. + Il s'agit d'une méthode simple pour ajouter du contenu dynamique à votre site + web en utilisant votre langage de programmation préféré. + Ce document est une introduction à la configuration de CGI sur votre + serveur web Apache, et une initiation à l'écriture de programmes + CGI.

    +
    top
    +
    +

    Configurer Apache pour autoriser CGI

    + + +

    Apache doit être configuré pour permettre l'exécution des + programmes CGI, pour que vos programmes CGI puissent fonctionner + correctement. Il existe plusieurs méthodes pour y parvenir.

    + +
    Note: si Apache a été compilé avec le support + des modules partagés (DSO), vous devez vous assurer que le module CGI est + chargé ; vous devez pour cela vérifier que la directive LoadModule correspondante n'a pas été + commentée dans votre httpd.conf. Une directive correcte + doit ressembler à ceci : + +
    LoadModule cgid_module modules/mod_cgid.so
    + + + + Sous Windows, ou si l'on utilise un module MPM non-threadé comme prefork, + une directive correctement configurée sera du style : + +
    LoadModule cgi_module modules/mod_cgi.so
    +
    + + +

    ScriptAlias

    + + +

    La directive ScriptAlias indique à Apache qu'un + répertoire particulier est dédié aux programmes CGI. Apache + considérera que tout fichier situé dans ce répertoire est un + programme CGI, et tentera de l'exécuter lorsque cette ressource + fera l'objet d'une requête client.

    + +

    La directive ScriptAlias se présente comme suit + :

    + +
    ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"
    + + +

    Cet exemple est tiré de votre fichier de configuration + httpd.conf par défaut, si vous avez installé Apache + dans son répertoire par défaut. La directive ScriptAlias est similaire à la + directive Alias, qui + définit à quel répertoire particulier doit correspondre un préfixe + d'URL. Alias et + ScriptAlias sont généralement utilisés pour + accéder à des répertoires situés en dehors du répertoire défini + par la directive DocumentRoot. La différence entre + Alias et ScriptAlias + réside dans le fait que ScriptAlias indique + en plus que tout ce qui se trouve sous le préfixe d'URL doit être + considéré comme un programme CGI. Ainsi, l'exemple ci-dessus + indique à Apache que toute requête pour une ressource commençant + par /cgi-bin/ doit être servie depuis le répertoire + /usr/local/apache2/cgi-bin/, et doit être traitée en + tant que programme CGI.

    + +

    Par exemple, si une requête pour l'URL + http://www.example.com/cgi-bin/test.pl est + effectuée, Apache tentera d'exécuter le fichier + /usr/local/apache2/cgi-bin/test.pl et en renverra la + sortie. Bien entendu, le fichier doit exister, être exécutable, et + retourner sa sortie d'une manière particulière, sinon Apache + renverra un message d'erreur.

    + + +

    CGI en dehors des répertoires ScripAlias

    + + +

    Pour des raisons de sécurité, la localisation des programmes + CGI est souvent restreinte aux + répertoires définis par ScriptAlias. De cette manière, les administrateurs + peuvent contrôler précisément qui est autorisé à utiliser les + programmes CGI. Cependant, si les précautions adéquates quant à + la sécurité sont prises, il n'y a aucune raison pour que les + programmes CGI ne puissent pas être exécutés depuis d'autres + répertoires. Par exemple, vous pouvez autoriser les utilisateurs à + enregistrer des contenus web dans leurs répertoires home à l'aide + de la directive UserDir. S'ils veulent mettre en + oeuvre leurs propres programmes CGI, mais n'ont pas l'autorisation + d'accès au répertoire cgi-bin principal, ils devront + être en mesure d'exécuter ces programmes depuis un autre + répertoire.

    + +

    L'autorisation d'exécution des programmes CGI dans un + répertoire arbitraire se fait en deux étapes. En premier lieu, le + gestionnaire cgi-script doit être activé à l'aide + d'une directive AddHandler ou SetHandler. En second lieu, + ExecCGI doit être spécifié dans la directive Options.

    + + +

    Utilisation d'options explicites pour permettre l'exécution + des programmes CGI

    + + +

    Vous pouvez utiliser de manière explicite la directive + Options dans le fichier de + configuration de votre serveur principal, pour indiquer que + l'exécution des programmes CGI est permise depuis un répertoire + particulier :

    + +
    <Directory "/usr/local/apache2/htdocs/somedir">
    +    Options +ExecCGI
    +</Directory>
    + + +

    La directive ci-dessus indique à Apache qu'il doit permettre + l'exécution des fichiers CGI. Vous devez aussi indiquer au serveur + quels fichiers sont des fichiers CGI. La directive AddHandler suivante indique au + serveur qu'il doit traiter tous les fichiers possédant une + extension cgi ou pl en tant que + programmes CGI :

    + +
    AddHandler cgi-script .cgi .pl
    + + + +

    Fichiers .htaccess

    + + +

    Le tutoriel + .htaccess montre comment activer les programmes + CGI si vous n'avez pas accès au + fichier httpd.conf.

    + + +

    Répertoires utilisateurs

    + + +

    Pour permettre l'exécution en tant que programme CGI de tout + fichier possédant l'extension .cgi et situé dans un + répertoire utilisateur, vous pouvez utiliser la configuration + suivante :

    + +
    <Directory "/home/*/public_html">
    +    Options +ExecCGI
    +    AddHandler cgi-script .cgi
    +</Directory>
    + + +

    Pour indiquer un sous-répertoire cgi-bin d'un + répertoire utilisateur où tout fichier sera traité en tant que + programme CGI, vous pouvez utiliser ceci :

    + +
    <Directory "/home/*/public_html/cgi-bin">
    +    Options ExecCGI
    +    SetHandler cgi-script
    +</Directory>
    + + + + +
    top
    +
    +

    Ecrire un programme CGI

    + + +

    Il y a deux différences principales entre la programmation + "standard" et la programmation CGI.

    + +

    En premier lieu, toute sortie de votre programme CGI doit être + précédée d'un en-tête MIME-type. Il s'agit d'un + en-tête HTTP qui indique au client quel type de contenu il reçoit. + La plupart du temps, il se présente comme suit :

    + +

    + Content-type: text/html +

    + +

    En second lieu, votre sortie doit être en HTML, ou tout autre + format qu'un navigateur est en mesure d'afficher. La plupart du + temps, il s'agira de HTML, mais occasionnellement, vous pouvez être + amené à écrire un programme CGI qui renvoie une image gif, ou un + autre type de contenu non-HTML.

    + +

    A part ces deux différences, un programme CGI ressemblera à tout + autre programme que vous pourriez être amené à écrire.

    + +

    Votre premier programme CGI

    + + +

    L'exemple suivant est un exemple de programme CGI qui permet + d'afficher une ligne de caractères dans votre navigateur. Ecrivez + ce qui suit, enregistrez le dans un fichier nommé + premier.pl, et placez le dans votre répertoire + cgi-bin.

    + +
    #!/usr/bin/perl
    +print "Content-type: text/html\n\n";
    +print "Hello, World.";
    + + +

    Même si Perl ne vous est pas familier, vous devriez être + capable de comprendre le fonctionnement de ce programme. La + première ligne indique à Apache (ou à toute interface à partir de + laquelle le programme s'exécute) que ce programme peut être + exécuté en fournissant son fichier à l'interpréteur + /usr/bin/perl. La seconde ligne affiche la + déclaration du type de contenu considéré, suivie de deux paires + "Retour chariot - Nouvelle ligne". Ceci a pour effet d'insérer une + ligne vide après l'en-tête pour marquer la fin des en-têtes HTTP, + et le début du corps du document. La troisième ligne affiche la + chaîne de caractères "Bonjour tout le monde . . .". Et c'est tout + ce dont vous avez besoin.

    + +

    Si vous ouvrez votre navigateur favori et lui indiquez + l'adresse

    + +

    + http://www.example.com/cgi-bin/premier.pl +

    + +

    ou toute autre URL correspondant à votre programme CGI, Vous + verrez la ligne Bonjour tout le monde . . . + s'afficher dans la fenêtre de votre navigateur. Ce n'est pas + extraordinaire, mais si vous y êtes parvenu, vous avez de bonnes + chances d'y parvenir pour tout autre programme plus + sophistiqué.

    + +
    top
    +
    +

    Mais ça ne marche toujours pas !

    + + +

    Vous devriez voir au moins une des quatre sorties suivantes dans + votre navigateur lorsque vous essayez d'accéder à votre programme + CGI depuis le web :

    + +
    +
    Le flux de sortie de votre programme CGI
    +
    Impeccable ! Cela signifie que tout fonctionne correctement. + Si la sortie est correcte mais n'est pas traitée correctement par + le navigateur, assurez-vous d'avoir défini + Content-Type de manière appropriée dans votre + programme CGI.
    + +
    Le code source de votre programme CGI ou un message "POST + Method Not Allowed"
    +
    Cela signifie que vous n'avez pas configuré Apache de manière + à ce qu'il puisse traiter votre programme CGI. Relisez la section + sur la configuration d'Apache, et + essayez de trouver votre erreur.
    + +
    Un message commençant par "Forbidden"
    +
    Ce type de message est révélateur d'un problème de + droits. Consultez le journal des erreurs + d'Apache et la section ci-dessous sur les droits des fichiers.
    + +
    Un message contenant "Internal Server Error"
    +
    Si vous consultez le journal des erreurs + d'Apache, vous y trouverez probablement des messages du type + "Premature end of script headers" (Fin prématurée des en-têtes de + script), éventuellement accompagnés d'un message d'erreur généré + par votre programme CGI. Dans ce cas, il va vous falloir lire + chacune des sections ci-dessous pour déterminer ce qui empêche + votre programme CGI de générer les en-têtes appropriés.
    +
    + +

    Droits des fichiers

    + + +

    Souvenez-vous que le serveur ne s'exécute pas sous votre nom. + En d'autres termes, lorsque le serveur a démarré, il s'exécute + avec les droits d'un utilisateur non privilégié - en général + nobody, ou www - et en conséquence, il + aura besoin de droits supplémentaires pour pouvoir exécuter des + fichiers dont vous êtes le propriétaire. En général, pour qu'un + fichier ait des droits suffisants pour être exécutable par + nobody, il suffit de lui attribuer des droits + d'exécution pour tout le monde :

    + +

    + chmod a+x premier.pl +

    + +

    En outre, si votre programme doit pouvoir accéder en lecture + et/ou écriture à d'autres fichiers, ces derniers devront avoir les + droits appropriés.

    + + + +

    Chemin des exécutables (PATH) et variables + d'environnement

    + + +

    Lorsque vous lancez un programme depuis la ligne de commande, + certaines informations sont passées au shell sans que vous vous en + doutiez. Par exemple, la variable PATH indique au + shell où il doit rechercher les exécutables auxquels vous faites + référence.

    + +

    Lorsqu'un programme s'exécute depuis le serveur web en tant que + programme CGI, sa variable PATH n'aura peut-être pas + la même valeur. Tout programme que vous invoquez dans votre + programme CGI ( comme par exemple sendmail) devra + être spécifié par son chemin complet, de façon à ce que le shell + puisse le trouver lorsqu'il tentera d'exécuter votre programme + CGI.

    + +

    Un exemple typique de spécification de programme est le chemin + vers l'interpréteur de script (souvent perl) que l'on + trouve à la première ligne de votre programme CGI et qui va + ressembler à ceci :

    + +
    #!/usr/bin/perl
    + + +

    Assurez-vous qu'il s'agit bien du chemin correct vers + l'interpréteur.

    + +
    + Lors de l'édition de scripts CGI sous Windows, il se peut que des + caractères de fin de ligne soient ajoutés au chemin de + l'interpréteur. Assurez-vous donc que les fichiers sont bien + transmis au serveur en mode ASCII. Dans le cas contraire, l'OS + pourra envoyer des avertissements "Command not found" à cause des + caractères de fin de ligne non reconnus car considérés comme + faisant partie du nom de fichier de l'interpréteur. +
    + + + +

    Variables d'environnement manquantes

    + + +

    Si votre programme CGI dépend de variables + d'environnement non standards, vous devrez vous assurez que + ces variables lui sont bien transmises par Apache.

    + +

    Lorsque des en-têtes HTTP ne sont pas transmis à + l'environnement, assurez-vous qu'ils sont bien formatés selon la + RFC 2616, section + 4.2 : les noms d'en-têtes doivent commencer par une lettre, + elle-même suivie de lettres, chiffres ou traits d'union. Tout + en-tête dont le nom viole cette règle sera ignoré.

    + + + +

    Erreurs inhérentes au programme

    + + +

    La plupart des échecs dans l'exécution d'un programme CGI + proviennent du programme lui-même. Ceci est particulièrement vrai + lorsque ce satané programme CGI se bloque, alors que vous avez + appris à ne plus commettre les deux erreurs précédentes. La + première chose à faire est de vous assurer que votre programme + s'exécute depuis la ligne de commande, avant de le tester à partir + du serveur web. Par exemple, essayez :

    + +

    + cd /usr/local/apache2/cgi-bin
    + ./premier.pl +

    + +

    (N'invoquez pas l'interpréteur perl. Le shell et + Apache doivent être capable de le déterminer à partir de l'information sur le chemin située sur + la première ligne du script.)

    + +

    La première chose que vous devriez voir affichée par votre + programme est un ensemble d'en-têtes HTTP, comprenant entre autres + le Content-Type, et suivi d'une ligne vide. Si vous + voyez quoi que ce soit d'autre, Apache renverra l'erreur + Premature end of script headers si vous tentez + d'exécuter le programme depuis le serveur. Voir Ecriture d'un programme CGI ci-dessus pour + plus de détails.

    + + +

    Journalisation des erreurs

    + + +

    Les journaux d'erreurs sont vos amis. Toute anomalie de + fonctionnement est consignée dans le journal des erreurs et c'est + ici que vous devez regarder en premier en cas de problème. Si + l'hébergeur de votre site ne vous donne pas accès au journal des + erreurs, vous avez tout intérêt à vous tourner vers quelqu'un + d'autre. Apprenez à déchiffrer les journaux d'erreurs, et vous + vous apercevrez que la plupart des problèmes seront rapidement + identifiés . . . et résolus.

    + + +

    Suexec

    + + +

    Le programme suexec permet + d'exécuter les programmes CGI avec des droits différents selon le + serveur virtuel ou le répertoire utilisateur dans lequel ils + se situent. Suexec effectue une vérification des droits très + stricte, et toute anomalie détectée au cours de cette vérification + entraînera un echec d'exécution de votre programme CGI avec + affichage de l'erreur Premature end of script + headers.

    + +

    Pour savoir si vous pouvez utiliser suexec, tapez la commande + apachectl -V, et regardez le chemin indiqué par + SUEXEC_BIN. Si au démarrage d'Apache, ce dernier + trouve un exécutable suexec dans ce chemin, + suexec sera activé.

    + +

    Si vous ne maîtrisez pas le fonctionnement de suexec, il vous + est déconseillé de l'utiliser. Pour désactiver suexec, supprimer + simplement (ou renommez) l'exécutable suexec + pointé par SUEXEC_BIN et redémarrez le serveur. Si + après une lecture de suexec, vous + décidez quand-même de l'utiliser, tapez la commande suexec + -V pour voir où se situe le journal de suexec, et utilisez + ce dernier pour déterminer quelles règles vous violez + éventuellement.

    + +
    top
    +
    +

    Que se passe-t-il en coulisse

    + + +

    Lorsque vos compétences en programmation CGI seront plus + poussées, il s'avérera intéressant pour vous de mieux comprendre ce + qui se passe en coulisse, et en particulier la manière dont le + navigateur et le serveur dialoguent entre eux. En effet, bien qu'il + soit tout à fait louable d'écrire un programme qui affiche "Bonjour + tout le monde . . .", cela ne sert pas à grand chose.

    + +

    Variables d'environnement

    + + +

    Les variables d'environnement sont des valeurs qui gravitent + autour de vous lorsque vous utilisez votre ordinateur. Elles sont + très utiles, à l'instar de votre chemin par défaut (où votre + ordinateur va rechercher le fichier physique correspondant à la + commande que vous avez tapée), votre nom d'utilisateur, le type de + votre terminal, etc... Pour obtenir une liste complète des + variables d'environnement standards que vous utilisez tous les + jours, tapez env dans votre interpréteur + de commandes.

    + +

    Au cours de la transaction CGI, le serveur et le navigateur + définissent aussi des variables d'environnement, de façon à ce + qu'ils puissent communiquer entre eux. Ces variables définissent + entre autre le type de navigateur (Netscape, IE, Lynx), le type de + serveur (Apache, IIS, WebSite), le nom du programme CGI en cours + d'exécution, etc...

    + +

    Ces variables sont à la disposition du programmeur CGI, et + elles constituent 50% de la communication client-serveur. La liste + complète des variables requises se trouve à + Common Gateway + Interface RFC.

    + +

    Ce programme CGI basique en Perl permet d'afficher toutes les + variables d'environnement qui sont échangées. Deux programmes + similaires sont fournis avec la distribution d'Apache et situés + dans le répertoire cgi-bin. + Notez que certaines variables sont + obligatoires, alors que d'autres sont optionnelles, si bien que + vous verrez s'afficher certaines variables qui ne font pas partie + de la liste officielle. De plus, Apache vous propose de nombreuses + méthodes pour ajouter vos propres + variables d'environnement aux variables de base fournies par + défaut.

    + +
    #!/usr/bin/perl
    +use strict;
    +use warnings;
    +
    +print "Content-type: text/html\n\n";
    +foreach my $key (keys %ENV) {
    +    print "$key --> $ENV{$key}<br>";
    +}
    + + + +

    STDIN et STDOUT

    + + +

    L'entrée standard (STDIN) et la sortie standard + (STDOUT) constituent d'autres voies de communication + entre le client et le serveur. Dans un contexte normal, + STDIN correspond au clavier, ou à un fichier fourni + au programme à des fins de traitement, et STDOUT à la + console ou à l'écran.

    + +

    Lorsque vous transmettez un formulaire web à un programme CGI + par la méthode POST, les données de ce formulaire + sont transcrites dans un format spécial et transmises à votre + programme CGI via STDIN. Le programme peut alors les + traiter comme si elles provenaient du clavier ou d'un + fichier.

    + +

    Ce "format spécial" est très simple. Un nom de champ et sa + valeur sont reliés entre eux par un signe "égal" (=), et chacune + de ces paires nom champ/valeur est séparée de la suivante par un + "et" commercial (&). Les caractères + spéciaux comme les espaces, les "et" commerciaux, et les signes + "égal" sont convertis en leur équivalent hexadécimal pour éviter + qu'ils ne gâchent le travail. La chaîne contenant les données doit + ressembler à ceci :

    + +

    + name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey +

    + +

    Vous verrez aussi parfois une chaîne de ce type accolée à une + URL. Dans ce cas, le serveur enregistre cette chaîne dans la + variable d'environnement appelée QUERY_STRING. On a + alors affaire à une requête de type GET. Votre + formulaire HTML indique laquelle des méthodes GET ou + POST est utilisée pour transmettre les données, en + définissant l'attribut METHOD au niveau de la balise + FORM.

    + +

    Votre programme est ensuite chargé d'extraire les informations + utiles de cette chaîne. Heureusement, des bibliothèques et des + modules sont à votre disposition pour vous aider à traiter ces + données, et à gérer les différents aspects de votre programme + CGI.

    + +
    top
    +
    +

    Bibliothèques et modules CGI

    + + +

    Pour écrire un programme CGI, il vous est conseillé d'utiliser + une bibliothèque de code, ou un module, qui effectueront une grande + partie du travail de base pour vous. Ceci vous permettra de diminuer + le nombre d'erreurs et d'accélérer le développement.

    + +

    Si vous écrivez des programmes CGI en Perl, des modules sont à + votre disposition à CPAN. A ce + sujet, le module le plus populaire est CGI.pm. Vous + pouvez aussi essayer CGI::Lite, qui implémente les + fonctionnalités strictement nécessaires, mais suffisantes pour + la majorité des programmes.

    + +

    Si vous écrivez des programmes CGI en C, vous disposez de nombreuses + options. L'une d'elles est la bibliothèque CGIC de https://web.mit.edu/wwwdev/www/cgic.html.

    +
    top
    +
    +

    Pour plus d'informations

    + + +

    La spécification CGI actuelle est disponible dans la Common Gateway + Interface RFC.

    + +

    Lorsque vous postez une question à propos d'un problème CGI que + vous rencontrez, que ce soit dans une liste de diffusion ou dans un + newsgroup, faites en sorte de fournir suffisamment d'informations + sur le problème rencontré, ce que vous attendiez exactement, et en + quoi ce qui se produit est réellement différent de ce que vous + attendiez, quel serveur vous utilisez, en quel langage votre + programme CGI a été écrit, et, si possible, son code source. Ceci + permettra une résolution plus aisée de votre problème.

    + +

    Notez que les questions à propos de problèmes CGI ne doivent + jamais être postées dans la base de données de + bogues d'Apache, à moins que vous ne soyez sûr d'avoir trouvé un + problème dans le code source d'Apache.

    +
    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/cgi.html.ja.utf8 b/docs/manual/howto/cgi.html.ja.utf8 new file mode 100644 index 0000000..f60bff5 --- /dev/null +++ b/docs/manual/howto/cgi.html.ja.utf8 @@ -0,0 +1,593 @@ + + + + + +Apache Tutorial: CGI ã«ã‚ˆã‚‹å‹•的コンテンツ - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    Apache Tutorial: CGI ã«ã‚ˆã‚‹å‹•的コンテンツ

    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    +
    + +
    top
    +
    +

    ã¯ã˜ã‚ã«

    + + + + +

    CGI (Common Gateway Interface) ã¯ã€ã‚¦ã‚§ãƒ–サーãƒãŒ + コンテンツ生æˆã‚’ã™ã‚‹å¤–部プログラムã¨å”調ã—ã¦å‹•作ã™ã‚‹ãŸã‚ã®æ–¹æ³•ã‚’ + 定義ã—ã¦ã„ã¾ã™ã€‚ãã®ãƒ—ログラムã¯ã—ã°ã—ã° CGI プログラムや + CGI スクリプトã¨å‘¼ã°ã‚Œã¾ã™ã€‚CGI ã¯ã€ã‚¦ã‚§ãƒ–サイトã«å‹•的㪠+ コンテンツを置ããŸã‚ã®æœ€ã‚‚ç°¡å˜ã§ä¸€èˆ¬çš„ãªæ–¹æ³•ã§ã™ã€‚ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ã€ + Apache ウェブサーãƒã§ CGI を設定ã—〠+ CGI プログラムを書ãå§‹ã‚ã‚‹ãŸã‚ã®å…¥é–€æ›¸ã¨ãªã‚‹ã§ã—ょã†ã€‚

    +
    top
    +
    +

    CGI を許å¯ã™ã‚‹ã‚ˆã†ã« Apache を設定ã™ã‚‹

    + + +

    CGI プログラムを正ã—ã動作ã•ã›ã‚‹ã«ã¯ã€CGI を許å¯ã™ã‚‹ã‚ˆã†ã« + Apache ã®è¨­å®šã‚’行ã†å¿…è¦ãŒã‚りã¾ã™ã€‚ + ã“れを行ãªã†ãŸã‚ã®æ–¹æ³•ãŒã„ãã¤ã‹ã‚りã¾ã™ã€‚

    + +
    + 注: Apache ãŒå…±æœ‰ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«æ©Ÿèƒ½ç€ãã§ãƒ“ルドã•れã¦ã„ã‚‹å ´åˆã€ + モジュールãŒãƒ­ãƒ¼ãƒ‰ã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 + ã¤ã¾ã‚Š httpd.conf ã§ + LoadModule + ãŒã‚³ãƒ¡ãƒ³ãƒˆã‚¢ã‚¦ãƒˆã•れã¦ã„ãªã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 + 正常ã«è¨­å®šã•れã¦ã„ã‚Œã°æ¬¡ã®ã‚ˆã†ã«ãªã‚‹ã¯ãšã§ã™: + +

    + LoadModule cgi_module modules/mod_cgi.so +

    + +

    ScriptAlias

    + + +

    ScriptAlias + ディレクティブを使用ã—ã¦ã€ + CGI プログラム用ã®ç‰¹åˆ¥ãªåˆ¥ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’ Apache ã«è¨­å®šã—ã¾ã™ã€‚ + Apache ã¯ã€ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªä¸­ã®å…¨ã¦ã®ãƒ•ァイルを CGI + プログラムã§ã‚ã‚‹ã¨ä»®å®šã—ã¾ã™ã€‚ + ãã—ã¦ã€ã“ã®ç‰¹åˆ¥ãªãƒªã‚½ãƒ¼ã‚¹ãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰è¦æ±‚ã•れるã¨ã€ + ãã®ãƒ—ログラムã®å®Ÿè¡Œã‚’試ã¿ã¾ã™ã€‚

    + +

    ScriptAlias + ディレクティブã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ä½¿ç”¨ã—ã¾ã™:

    + +

    + ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/ +

    + +

    デフォルトä½ç½®ã« Apache をインストールã—ãŸãªã‚‰ã°ã€ + ã“ã®ä¾‹ã¯ãƒ‡ãƒ•ォルト状態㮠httpd.conf + 設定ファイルã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ + ScriptAlias + ディレクティブã¯ã€URL ã®å‰ã«ä»˜åŠ ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’定義ã™ã‚‹ + Alias + ディレクティブã¨ã‹ãªã‚Šä¼¼ã¦ã„ã¾ã™ã€‚ + Alias 㨠ScriptAlias + ã¯é€šå¸¸ã€DocumentRoot + ディレクトリ外ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãŸã‚ã«ä½¿ç”¨ã•れã¾ã™ã€‚ + Alias 㨠ScriptAlias + ã¨ã®å·®ã¯ã€ScriptAlias ãŒæŽ¥é ­è¾žã§å§‹ã¾ã‚‹ã™ã¹ã¦ã® + URL 㯠CGI プログラムã¨ã¿ãªã•れるã¨ã„ã†è¿½åŠ ã®æ„味をå«ã‚“ã§ã„ã‚‹ã“ã¨ã§ã™ã€‚ + 従ã£ã¦ã€ä¸Šè¨˜ã®ä¾‹ã§ã¯ã€/cgi-bin/ + ã§å§‹ã¾ã‚‹ãƒªã‚½ãƒ¼ã‚¹ã¸ã®ã‚らゆるリクエストã«å¯¾ã—ã¦ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª + /usr/local/apache2/cgi-bin/ ã‹ã‚‰æä¾›ã—ã€ãれらを + CGI プログラムã¨ã—ã¦æ‰±ã†ã‚ˆã† Apache ã«ç¤ºã—ã¾ã™ã€‚

    + +

    例ãˆã°ã€URL http://www.example.com/cgi-bin/test.pl + ãŒè¦æ±‚ã•れãŸå ´åˆã€Apache 㯠ファイル + /usr/local/apache2/cgi-bin/test.pl + を実行ã—ã€ãã®å‡ºåŠ›ã‚’è¿”ã™ã“ã¨ã‚’試ã¿ã¾ã™ã€‚ + ã‚‚ã¡ã‚ã‚“ã€ãƒ•ァイルãŒå­˜åœ¨ã—ã€å®Ÿè¡Œå¯èƒ½ã§ã‚ã‚Šã€æ±ºã‚ã‚‰ã‚ŒãŸæ–¹æ³•ã§å‡ºåŠ›ã‚’è¿”ã—ã¾ã™ã€‚ + ãã†ã§ãªã‘れã°ã€Apache ã¯ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’è¿”ã—ã¾ã™ã€‚

    + + +

    ScriptAlias ディレクトリ外㮠CGI

    + + +

    CGI プログラムã¯ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ä¸Šã®ç†ç”±ã‹ã‚‰ + ScriptAlias + ã•れãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«åˆ¶é™ã•れるã“ã¨ãŒã—ã°ã—ã°ã‚りã¾ã™ã€‚ã“ã®æ–¹æ³•ã«ã‚ˆã‚Šã€ + CGI プログラムを使用ã§ãるユーザを管ç†è€…ãŒå޳ã—ã制御ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã—ã‹ã—ãªãŒã‚‰ã€é©åˆ‡ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£äº‹å‰å¯¾ç­–ãŒã¨ã‚‰ã‚Œã‚‹ãªã‚‰ã°ã€CGI + プログラムを任æ„ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§å®Ÿè¡Œã§ããªã„よã†ã«ã™ã‚‹ç†ç”±ã¯ã‚りã¾ã›ã‚“。 + 例ãˆã°ã€ãƒ¦ãƒ¼ã‚¶ã« UserDir + ディレクティブã§å½¼ã‚‰ã®ãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé…下ã«ã‚¦ã‚§ãƒ–コンテンツをæŒãŸã›ãŸã„ã¨ã—ã¾ã™ã€‚ + ã‚‚ã—ã€å½¼ã‚‰ãŒ CGI プログラムをæŒã¤ã“ã¨ã‚’望んã§ã„ã¦ã‚‚ã€ãƒ¡ã‚¤ãƒ³ã® + cgi-bin ディレクトリã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã§ããªã„å ´åˆã€ + CGI プログラムを実行ã™ã‚‹ã“ã¨ãŒã§ãã‚‹ä»–ã®å ´æ‰€ãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚

    + +

    ä»»æ„ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ CGI ã®å®Ÿè¡Œã‚’許å¯ã™ã‚‹ã«ã¯äºŒæ®µéšŽã®è¨­å®šãŒå¿…è¦ã§ã™ã€‚ + ã¾ãšã€AddHandler ã‚„ SetHandler ディレクティブã«ã‚ˆã£ã¦ + cgi-script ãƒãƒ³ãƒ‰ãƒ©ãŒå¯èƒ½ã«ãªã£ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + 次ã«ã€Options ディレクティブ㧠+ ExecCGI ãŒæŒ‡å®šã•れã¦ã„ãªã‘れã°ãªã‚Šã¾ã›ã‚“。

    + + +

    CGI ã®å®Ÿè¡Œã‚’å¯èƒ½ã«ã™ã‚‹ãŸã‚ã« Options を明示的ã«ä½¿ç”¨ã™ã‚‹

    + + +

    サーãƒã®ãƒ¡ã‚¤ãƒ³ã®è¨­å®šãƒ•ァイル中㧠Options + ディレクティブを明示的ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ã§ã€ç‰¹å®šã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé…下㧠+ CGI ã®å®Ÿè¡Œã‚’許å¯ã™ã‚‹ã‚ˆã†ã«æŒ‡å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:

    + +

    + <Directory /usr/local/apache2/htdocs/somedir>
    + + Options +ExecCGI
    +
    + </Directory> +

    + +

    上記ディレクティブã¯ã€CGI ファイルã®å®Ÿè¡Œã‚’å¯èƒ½ã«ã™ã‚‹ã‚ˆã† + Apache ã«ä¼ãˆã¾ã™ã€‚ã¾ãŸã€ã©ã®ãƒ•ァイル㌠CGI ファイルã‹ã‚’ + サーãƒã«ä¼ãˆã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚次㮠+ AddHandler + ディレクティブã®ä¾‹ã§ã¯ã€cgi ã¾ãŸã¯ pl + ã‚’æ‹¡å¼µå­ã«æŒã¤ã™ã¹ã¦ã®ãƒ•ァイルを CGI + プログラムã¨ã—ã¦ã¿ãªã™ã“ã¨ã‚’サーãƒã«ä¼ãˆã¾ã™:

    + +

    + AddHandler cgi-script .cgi .pl +

    + + +

    .htaccess ファイル

    + + +

    .htaccess ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ« + 㯠httpd.conf を変更ã§ããªã„å ´åˆã«ã©ã†ã‚„ã£ã¦ CGI プログラムを + 使ãˆã‚‹ã‚ˆã†ã«ã™ã‚‹ã‹ã‚’説明ã—ã¦ã„ã¾ã™ã€‚

    + + +

    User ディレクトリ

    + + +

    .cgi ã§çµ‚ã‚ã‚‹ã™ã¹ã¦ã®ãƒ•ァイルã«å¯¾ã—㦠CGI プログラム㮠+ 実行を許å¯ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®è¨­å®šã‚’使用ã§ãã¾ã™ã€‚

    + +

    + <Directory /home/*/public_html>
    + + Options +ExecCGI
    + AddHandler cgi-script .cgi
    +
    + </Directory> +

    + +

    ユーザディレクトリ㮠cgi-bin サブディレクトリ㮠+ ã™ã¹ã¦ã®ãƒ•ァイルを CGI プログラムã¨ã—ã¦æŒ‡å®šã—ãŸã„å ´åˆã«ã¯ + 以下ã®ã‚ˆã†ãªã‚‚ã®ã‚’使ã„ã¾ã™ã€‚

    + +

    + <Directory /home/*/public_html/cgi-bin>
    + + Options ExecCGI
    + SetHandler cgi-script
    +
    + </Directory> +

    + + +
    top
    +
    +

    CGI プログラムを書ã

    + + +

    「通常ã®ã€ãƒ—ログラミング㨠CGI + プログラミングã®é–“ã«ã¯ä¸»ã«äºŒã¤ã®é•ã„ãŒã‚りã¾ã™ã€‚

    + +

    一ã¤ã¯ã€CGI プログラムã®ã™ã¹ã¦ã®å‡ºåŠ›ã«ã¯MIME タイプ + ヘッダを付ã‘ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 + ã“れã¯ã©ã®ã‚ˆã†ãªç¨®é¡žã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’å—ã‘å–ã£ã¦ã„ã‚‹ã‹ã‚’クライアントã«ç¤ºã™ + HTTP ヘッダã§ã™ã€‚ã»ã¨ã‚“ã©ã®å ´åˆã§ã¯ã€æ¬¡ã®ã‚ˆã†ã«å‡ºåŠ›ã—ã¾ã™:

    + +

    + Content-type: text/html +

    + +

    ã‚‚ã†ä¸€ã¤ã¯ã€å‡ºåŠ›ã‚’ HTML + ã‹ã€ãƒ–ラウザãŒè¡¨ç¤ºã™ã‚‹ã“ã¨ãŒã§ãる何ã‹ä»–ã®å½¢å¼ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + 大抵ã®å ´åˆã¯ HTML ã§ã—ょã†ãŒã€GIF イメージや他ã®éž HTML + コンテンツを出力ã™ã‚‹ CGI プログラムを書ãã“ã¨ã‚‚ã‚ã‚‹ã§ã—ょã†ã€‚

    + +

    ã“れら二点以外ã§ã¯ã€CGI プログラムを書ãã“ã¨ã¯ã€ + ã‚ãªãŸãŒæ›¸ã„ã¦ã„ã‚‹ä»–ã®ãƒ—ログラムã¨ã‚ˆãä¼¼ã¦ã„ã‚‹ã§ã—ょã†ã€‚

    + +

    最åˆã® CGI プログラム

    + + +

    次ã«ç¤ºã™ã®ã¯ã€ãƒ–ラウザ㫠1 行å°å­—ã™ã‚‹ CGI + プログラムã®ä¾‹ã§ã™ã€‚以下を入力ã—ã€first.pl + ã¨ã„ã†ãƒ•ァイルã«ä¿å­˜ã—ã€ãれを cgi-bin + ディレクトリã«ç½®ã„ã¦ãã ã•ã„。

    + +

    + #!/usr/bin/perl
    + print "Content-type: text/html\n\n";
    + print "Hello, World."; +

    + +

    Perl ã«ç²¾é€šã—ã¦ã„ãªãã¦ã‚‚〠+ 何ãŒèµ·ã“ã‚‹ã‹ã‚’ç†è§£ã™ã‚‹ã“ã¨ã¯ã§ãã‚‹ã§ã—ょã†ã€‚1 行目ã¯ã€ + /usr/bin/perl ã§è¦‹ã¤ã‘られるインタプリタ㫠+ ã“ã®ãƒ•ァイルを供給ã™ã‚‹ã“ã¨ã§ã“ã®ãƒ—ログラムãŒå®Ÿè¡Œã•れるã“ã¨ã‚’ + Apache ã« (シェル上ã§å®Ÿè¡Œã—よã†ã¨ã—ã¦ã„ã‚‹ãªã‚‰ã°ã€ãã®ã‚·ã‚§ãƒ«ã« ) + 示ã—ã¾ã™ã€‚2 行目ã¯ã€å‰è¿°ã—ãŸã¨ãŠã‚Š content-type ã®å®šç¾©ã‚’å°å­—ã—ã¾ã™ã€‚ + ã“れã«ã¯å¾©å¸°æ”¹è¡Œã®äºŒã¤ã®çµ„を後ã«ä»˜åŠ ã—ã¾ã™ã€‚ + ã“れã«ã‚ˆã‚Šã€ãƒ˜ãƒƒãƒ€ã®çµ‚りã«ç©ºè¡ŒãŒç½®ã‹ã‚Œã€HTTP + ヘッダã®çµ‚りã¨ãƒœãƒ‡ã‚£ã®å§‹ã¾ã‚Šã‚’示ã—ã¾ã™ã€‚3 行目ã¯ã€"Hello, World." + ã¨ã„ã†æ–‡å­—列をå°å­—ã—ã€ã“れã§çµ‚りã¨ãªã‚Šã¾ã™ã€‚

    + +

    好ã¿ã®ãƒ–ラウザを開ãã€ã‚¢ãƒ‰ãƒ¬ã‚¹

    + +

    + http://www.example.com/cgi-bin/first.pl +

    + +

    ã‚ã‚‹ã„ã¯ãƒ•ァイルを置ã„ãŸãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’指定ã™ã‚‹ã¨ã€ + Hello, World. + ã¨ã„ㆠ1 行ãŒãƒ–ラウザウィンドã«ç¾ã‚Œã‚‹ã§ã—ょã†ã€‚ + ãれã¯ã‚ã¾ã‚Šã‚¨ã‚­ã‚µã‚¤ãƒ†ã‚£ãƒ³ã‚°ãªã“ã¨ã§ã¯ã‚りã¾ã›ã‚“。 + ã—ã‹ã—ã€ã“れãŒã†ã¾ãå‹•ã‘ã°ã€ + ä»–ã®ã©ã®ã‚ˆã†ãªã‚‚ã®ã§ã‚‚å‹•ã‹ã™ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚

    + +
    top
    +
    +

    ã—ã‹ã—ã€ã¾ã å‹•ã‹ãªã„ !

    + + +

    ウェブã‹ã‚‰ CGI プログラムã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’行ãªã£ãŸã¨ã〠+ ブラウザã§è¦‹ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹å››ã¤ã®åŸºæœ¬çš„ãªã“ã¨ãŒã‚りã¾ã™:

    + +
    +
    CGI プログラムã®å‡ºåŠ›
    +
    素晴らã—ã„ ! ãれã¯ã™ã¹ã¦ãŒã†ã¾ãå‹•ã„ãŸã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ + å‡ºåŠ›ãŒæ­£å¸¸ã ã‘れã©ã‚‚ã€ãƒ–ãƒ©ã‚¦ã‚¶ãŒæ­£å¸¸ã«å‡¦ç†ã—ã¦ãれãªã„å ´åˆã¯ã€ + æ­£ã—ã„ Content-Type ã‚’ CGI プログラム内㧠+ セットã—ãŸã‹ã‚’確èªã—ã¦ãã ã•ã„。
    + +
    CGI プログラムã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã€ã¾ãŸã¯ "POST Method Not Allowed" + ã¨ã„ã†ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸
    +
    ã“れã¯ã€CGI プログラムを処ç†ã§ãるよㆠApache + ã‚’é©åˆ‡ã«è¨­å®šã—ã¦ã„ãªã‹ã£ãŸã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚「CGI を許å¯ã™ã‚‹ã‚ˆã†ã« + Apache を設定ã™ã‚‹ã€ã®ç« ã‚’読ã¿ç›´ã—〠+ ã‚ãªãŸãŒä½•ã‚’é–“é•ãˆãŸã‹ã‚’探ã—ã¦ã¿ã¦ãã ã•ã„。 +
    + +
    メッセージ㌠"Forbidden" ã§å§‹ã¾ã£ã¦ã„ã‚‹
    +
    ã“れã¯ãƒ‘ーミッションã®å•題ã¨ã„ã†ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ + Apache ã®ã‚¨ãƒ©ãƒ¼ãƒ­ã‚°ã¨ã€å¾Œè¿°ã®ã€Œãƒ•ァイルã®ãƒ‘ーミッション〠+ ã®ç« ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„。 +
    + +
    "Internal Server Error" ã¨ã„ã†ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸
    +
    Apache + ã®ã‚¨ãƒ©ãƒ¼ãƒ­ã‚°ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€"Premature end of script headers" + ã¨ã„ã†ãƒ­ã‚°ãŒè¨˜éŒ²ã•れã¦ã„ã‚‹ã¨æ€ã„ã¾ã™ã€‚ãã—ã¦ã€ãŠãらã CGI + プログラムã«ã‚ˆã£ã¦ç”Ÿæˆã•れãŸã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚‚記録ã•れã¦ã„ã‚‹ã§ã—ょã†ã€‚ + ã“ã®å ´åˆã€CGI プログラムãŒé©åˆ‡ãª + HTTP ヘッダを出力ã§ããªã„原因を知るãŸã‚ã«ã€ + 以下ã®å„ç« ã§ãƒã‚§ãƒƒã‚¯ã—ã¦ã¿ã¦ãã ã•ã„。
    +
    + +

    ファイルã®ãƒ‘ーミッション

    + + +

    サーãƒã¯ã‚ãªãŸã®æ¨©é™ã§å®Ÿè¡Œã•れã¦ã„ãªã„ã®ã‚’忘れãªã„よã†ã«ã€‚ + ã¤ã¾ã‚Šã€èµ·å‹•ã™ã‚‹ã¨ãã€ã‚µãƒ¼ãƒã¯ç‰¹æ¨©ã‚’ã‚‚ãŸãªã„ユーザ - 通常 nobody + ã‚„ www ã®æ¨©é™ã§å®Ÿè¡Œã•れã¾ã™ã€‚ã—ãŸãŒã£ã¦ã€ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ + ファイルを実行ã™ã‚‹ã«ã¯åˆ¥ã®ãƒ‘ーミッションãŒå¿…è¦ã¨ãªã‚Šã¾ã™ã€‚ + 通常ã€nobody ãŒå®Ÿè¡Œã™ã‚‹ã®ã«å分ãªãƒ‘ーミッションを与ãˆã‚‹æ–¹æ³•ã¯ã€ + ファイルã«èª°ã§ã‚‚実行å¯èƒ½ã¨ã™ã‚‹ãƒ‘ーミッションを与ãˆã‚‹ã“ã¨ã§ã™:

    + +

    + chmod a+x first.pl +

    + +

    ã¾ãŸã€ã‚‚ã—ã‚ãªãŸã®ãƒ—ログラムãŒä»–ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’èª­ã¿æ›¸ãã™ã‚‹ãªã‚‰ã°ã€ + ãれらã®ãƒ•ァイルã¯ã€ã“れãŒå¯èƒ½ã¨ãªã‚‹æ­£ã—ã„パーミッション + ã‚’æŒã£ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚

    + + + +

    パス情報ã¨ç’°å¢ƒ

    + + +

    コマンドラインã‹ã‚‰ãƒ—ログラムを実行ã™ã‚‹ã¨ã〠+ æ„è­˜ã—ãªãã¦ã‚‚ã‚·ã‚§ãƒ«ã«æ¸¡ã•れる情報ãŒã‚りã¾ã™ã€‚ + 例ãˆã°ã€å‚ç…§ã™ã‚‹ãƒ•ァイルã®ãŸã‚ã«ã©ã“を検索ã—ãŸã‚‰ã‚ˆã„ã‹ã‚’ + シェルã«ä¼ãˆã‚‹ PATH ãŒã‚りã¾ã™ã€‚

    + +

    プログラム㌠CGI プログラムã¨ã—ã¦ã‚¦ã‚§ãƒ–サーãƒã«ã‚ˆã£ã¦å®Ÿè¡Œã•れるã¨ã〠+ ãれã¯åŒã˜ PATH ã§ã¯ãªã„ã‹ã‚‚ã—れã¾ã›ã‚“。 + CGI プログラム内ã§å‘¼ã³å‡ºã™ã‚らゆるプログラム + (例ãˆã°ã€sendmail ã®ã‚ˆã†ãªã‚‚ã®) ã¯ã€ + ãƒ•ãƒ«ãƒ‘ã‚¹ã§æŒ‡å®šã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã§ã—ょã†ã€‚ãれã«ã‚ˆã‚Šã€CGI + プログラムを実行ã—よã†ã¨ã—ãŸã¨ã〠+ シェルã¯ãã®ã‚ˆã†ãªãƒ—ログラムを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    åŒæ§˜ãªã“ã¨ã¯ã€ã‚¹ã‚¯ãƒªãƒ—トã®ã‚¤ãƒ³ã‚¿ãƒ—リタ (ã—ã°ã—ã° perl) + ã¸ã®ãƒ‘スã§ã€CGI プログラム㮠1 è¡Œç›®ã«æ¬¡ã®ã‚ˆã†ã«ç¤ºã•れã¾ã™:

    + +

    + #!/usr/bin/perl +

    + +

    ã“れãŒã‚¤ãƒ³ã‚¿ãƒ¼ãƒ—リタã¸ã®å®Ÿéš›ã®ãƒ‘スã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãŠãã¾ã™ã€‚

    + + +

    ã¾ãŸã€CGI プログラムãŒä»–ã®ç’°å¢ƒå¤‰æ•°ã«ä¾å­˜ã—ã¦ã„ã‚‹å ´åˆã¯ã€ãã®ç’°å¢ƒå¤‰æ•°ãŒ + Apache ã‹ã‚‰æ¸¡ã•れるよã†ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚

    + +

    プログラムエラー

    + + +

    CGI + プログラムãŒå¤±æ•—ã™ã‚‹ã®ã¯å¤§æŠµã€ãƒ—ログラム自身ã«å•題ãŒã‚ã‚‹å ´åˆã§ã™ã€‚ + 一度 CGI ã®ä½¿ã„方をç†è§£ã—ã€å‰è¿°ã®äºŒã¤ã®èª¤ã‚Šã‚’犯ã—ã¦ã„ãªã„ãªã‚‰ã°ã€ + ã¾ãšé–“é•ã„ãªããã†ã§ã—ょã†ã€‚ブラウザを使ã£ã¦ãƒ†ã‚¹ãƒˆã™ã‚‹å‰ã« + ã¾ãšç¢ºèªã™ã‚‹ã“ã¨ã¯ã€ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‹ã‚‰ãƒ—ログラムãŒå®Ÿè¡Œã§ãã‚‹ã“ã¨ã§ã™ã€‚ + 例ãˆã°ã€ä»¥ä¸‹ã‚’実行ã—ã¦ã¿ã¦ãã ã•ã„:

    + +

    + cd /usr/local/apache2/cgi-bin
    + ./first.pl +

    + +

    (perl インタプリタã¯å‘¼ã°ãªã„ã§ãã ã•ã„。 + シェル㨠Apache ãŒã‚¹ã‚¯ãƒªãƒ—ãƒˆã®æœ€åˆã®è¡Œã® パス情報 を使ã£ã¦è¦‹ã¤ã‘ã¾ã™ã€‚)

    + +

    最åˆã«ãƒ—ログラムã‹ã‚‰å‡ºåŠ›ã•れるã®ã¯ Content-Type ã‚’å«ã¿ã€ + 後ã«ç©ºè¡Œã®ç¶šã HTTP ヘッダã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。他ã®ã‚‚ã®ãŒå‡ºåŠ›ã•れã¦ã„ã‚‹ + å ´åˆã¯ã€Apache ã¯ã“ã®ãƒ—ログラムをサーãƒçµŒç”±ã§å®Ÿè¡Œã—よã†ã¨ã—ãŸã¨ãã«ã¯ + Premature end of script headers エラーを出力ã—ã¾ã™ã€‚詳細㯠+ 上記㮠CGI プログラムを書ã を読んã§ãã ã•ã„。

    + + +

    エラーログ

    + + +

    エラーログã¯å‹é”ã§ã™ã€‚ + å…¨ã¦ã®ã†ã¾ãã„ã‹ãªã„ã“ã¨ã¯ã€ã‚¨ãƒ©ãƒ¼ãƒ­ã‚°ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’生æˆã—ã¾ã™ã€‚ + å¿…ãšãれを最åˆã«è¦‹ã‚‹ã¹ãã§ã™ã€‚ + ã‚‚ã—ã€ã‚ãªãŸãŒã‚¦ã‚§ãƒ–サイトを主催ã—ã¦ã„る場所㌠+ エラーログã®å‚照を許ã—ã¦ã„ãªã„ãªã‚‰ã°ã€ãã£ã¨ä»–ã®ã‚µã‚¤ãƒˆã§ä¸»å‚¬ã™ã‚‹ã¹ãã§ã™ã€‚ + エラーログã®èª­ã¿æ–¹ã‚’å­¦ã¶ã“ã¨ã§ã€ã»ã¨ã‚“ã©å…¨ã¦ã®å•題ãŒè¿…速ã«ç¢ºèªã•れ〠+ 迅速ã«è§£æ±ºã•れるã¨ã„ã†ã“ã¨ãŒåˆ†ã‹ã‚‹ã§ã—ょã†ã€‚

    + + +

    Suexec

    + + +

    suexec サãƒãƒ¼ãƒˆãƒ—ログラム㯠+ ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆã‚„ユーザã®ãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å ´æ‰€ã«ä¾ã£ã¦ + CGI プログラムをé•ã†ãƒ¦ãƒ¼ã‚¶æ¨©é™ã®ä¸‹ã§èµ°ã‚‰ã›ã‚‹ã“ã¨ã‚’å¯èƒ½ã«ã—ã¾ã™ã€‚ + Suexec ã®æ¨©é™ã®ãƒã‚§ãƒƒã‚¯ã¯éžå¸¸ã«å޳ã—ãã€ãれを満ãŸã•ãªã„å ´åˆã¯ + CGI プログラム㌠Premature end of script headers エラー㧠+ 実行ã•れã¾ã›ã‚“。

    + +

    suexec を使ã£ã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’調ã¹ãŸã‚ã«ã¯ apachectl + -V を実行ã—ã¦ã€SUEXEC_BIN ã®å ´æ‰€ã‚’調ã¹ã¦ãã ã•ã„。 + Apache ãŒãã“ã« suexec ã®ãƒã‚¤ãƒŠãƒªã‚’発見ã—ãŸå ´åˆã¯ã€suexec ㌠+ 使用ã•れã¾ã™ã€‚

    + +

    suexec を完全ã«ç†è§£ã—ã¦ã„ãªã„é™ã‚Šã€ä½¿ã†ã¹ãã§ã¯ã‚りã¾ã›ã‚“。 + suexec を無効ã«ã™ã‚‹ã«ã¯ã€SUEXEC_BIN ã‹ã‚‰æŒ‡ã•れã¦ã„ã‚‹ + suexec ãƒã‚¤ãƒŠãƒªã‚’削除 (ã‹åå‰ã‚’変更) ã™ã‚‹ã ã‘ã§ã™ã€‚ + suexec を読んã å¾Œã§ã€ã¾ã ãれを + 使ã„ãŸã„ã®ã§ã‚れã°ã€suexec -V を実行ã—㦠suexec ã® + ログファイルã®ä½ç½®ã‚’調ã¹ã€ãã®ãƒ­ã‚°ãƒ•ァイルを使ã£ã¦ãƒãƒªã‚·ãƒ¼é•åã‚’ + 見ã¤ã‘ã¦ãã ã•ã„。

    + +
    top
    +
    +

    è£ã§ä½•ãŒèµ·ã“ã£ã¦ã„ã‚‹ã®ã‹?

    + + +

    CGI プログラミングã«ç¿’熟ã™ã‚‹ã¨ã€ + è£ã§èµ·ã“ã£ã¦ã„ã‚‹ã“ã¨ã«ã¤ã„ã¦æ›´ã«ç†è§£ã™ã‚‹ã“ã¨ã®å½¹ã«ç«‹ã¡ã¾ã™ã€‚ + ブラウザã¨ã‚µãƒ¼ãƒãŒã©ã®ã‚ˆã†ã«ç›¸äº’通信ã™ã‚‹ã‹ã«ã¤ã„ã¦ã¯ç‰¹ã«ãã†ã§ã™ã€‚ + ãªãœãªã‚‰ã€"Hello, World." + ã‚’å°å­—ã™ã‚‹ãƒ—ログラムを書ãã“ã¨ã¯ãŠãŠã„ã«çµæ§‹ã§ã™ãŒã€ + ãれã¯ç‰¹ã«æœ‰ç›Šã§ã¯ã‚りã¾ã›ã‚“。

    + +

    環境変数

    + + +

    環境変数ã¯ã€ + ã‚ãªãŸãŒã‚³ãƒ³ãƒ”ュータを使ã†ã¨ãã«è¾ºã‚Šã«å­˜åœ¨ã—ã¦ã„る値ã§ã™ã€‚ + ãれらã¯ã€ãƒ‘ス + (コマンドをタイプã—ãŸã¨ãã«å®Ÿè¡Œã™ã‚‹å®Ÿéš›ã®ãƒ•ァイルを探ã—出ã™ã¨ã“ã‚)〠+ ユーザåã€ç«¯æœ«åž‹ãªã©ã®ã‚ˆã†ãªä¾¿åˆ©ãªã‚‚ã®ã§ã™ã€‚ + é€šå¸¸ã€æ™®æ®µä½¿ç”¨ã—ã¦ã„る環境変数ã®å®Œå…¨ãªãƒªã‚¹ãƒˆã‚’調ã¹ã‚‹ã«ã¯ã€ + コマンドプロンプト㧠env を入力ã—ã¾ã™ã€‚

    + +

    CGI ã®å‡¦ç†ä¸­ã€ã‚µãƒ¼ãƒã¨ãƒ–ラウザも環境変数を設定ã—〠+ ãれã«ã‚ˆã‚Šç›¸äº’ã«é€šä¿¡ã™ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ + ãã®ç’°å¢ƒå¤‰æ•°ã¯ã€ãƒ–ラウザタイプ (Netscape, IE, Lynx)ã€ã‚µãƒ¼ãƒã‚¿ã‚¤ãƒ— + (Apache, IIS, WebSite)ã€å®Ÿè¡Œã•れã¦ã„ã‚‹ CGI + プログラムã®åå‰ãªã©ã§ã™ã€‚

    + +

    ã“れらã®å¤‰æ•°ã¯ CGI プログラマãŒä½¿ç”¨ã§ãã¾ã™ã€‚ + ãã—ã¦ã€ãれã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¨ã‚µãƒ¼ãƒã®é€šä¿¡ã®è©±ã®åŠåˆ†ã§ã™ã€‚ + å¿…è¦ãªå¤‰æ•°ã®å®Œå…¨ãªãƒªã‚¹ãƒˆã¯ http://hoohoo.ncsa.uiuc.edu/cgi/env.html ã«ã‚りã¾ã™ã€‚

    + +

    以下ã®å˜ç´”㪠Perl CGI + プログラムã¯ã€æ¸¡ã•れる全ã¦ã®ç’°å¢ƒå¤‰æ•°ã‚’表示ã—ã¾ã™ã€‚åŒæ§˜ã®ãƒ—ログラムã¯ã€ + Apache ディストリビューション㮠cgi-bin + ディレクトリã«äºŒã¤å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ + ã„ãã¤ã‹ã®å¤‰æ•°ãŒå¿…é ˆã§ã‚りã€ã„ãã¤ã‹ã¯ä»»æ„ã§ã‚ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。 + ãã—ã¦ã€å…¬å¼ã®ãƒªã‚¹ãƒˆã«ã¯ãªã„ã„ãã¤ã‹ã®å¤‰æ•°ãŒè¡¨ç¤ºã•れã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 + ã•らã«ã€Apache ã¯ãƒ‡ãƒ•ォルトã§ç”¨æ„ã•れã¦ã„る基本的ãªã‚‚ã®ã« + ã‚ãªãŸè‡ªèº«ã®ç’°å¢ƒå¤‰æ•°ã‚’加ãˆã‚‹ãŸã‚ã®ã€ + 多ãã®ç•°ãªã‚‹æ–¹æ³•を用æ„ã—ã¦ã—ã¾ã™ã€‚

    + +

    + #!/usr/bin/perl
    + print "Content-type: text/html\n\n";
    + foreach $key (keys %ENV) {
    + + print "$key --> $ENV{$key}<br>";
    +
    + } +

    + + +

    STDIN 㨠STDOUT

    + + +

    サーãƒã¨ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆé–“ã®ã‚‚ã†ä¸€ã¤ã®é€šä¿¡ã¯ã€æ¨™æº–入力 + (STDIN)ã¨æ¨™æº–出力 (STDOUT) + を通ã˜ã¦è¡Œãªã‚れã¾ã™ã€‚é€šå¸¸ã®æ–‡è„ˆã«ãŠã„ã¦ã€STDIN + ã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚„プログラムãŒå‹•作ã™ã‚‹ãŸã‚ã«ä¸Žãˆã‚‰ã‚Œã‚‹ãƒ•ァイルをæ„味ã—〠+ STDOUT ã¯é€šå¸¸ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¾ãŸã¯ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚’æ„味ã—ã¾ã™ã€‚

    + +

    ウェブフォームã‹ã‚‰ CGI プログラムã¸POST + ã—ãŸã¨ãã€ãƒ•ォームã®ãƒ‡ãƒ¼ã‚¿ã¯ç‰¹åˆ¥ãªãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã§æŸã­ã‚‰ã‚Œã€ + STDIN を通ã—ã¦ã€CGI プログラムã«å¼•ãæ¸¡ã•れã¾ã™ã€‚ + プログラムã¯ãƒ‡ãƒ¼ã‚¿ãŒã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ + ã‚‚ã—ãã¯ãƒ•ァイルã‹ã‚‰æ¥ã¦ã„ãŸã‹ã®ã‚ˆã†ã«å‡¦ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    「特別ãªãƒ•ォーマットã€ã¯ã¨ã¦ã‚‚å˜ç´”ã§ã™ã€‚フィールドåã¨å€¤ã¯ã‚¤ã‚³ãƒ¼ãƒ« + (=) ã§çµã°ã‚Œã¾ã™ã€‚ãã—ã¦å€¤ã®çµ„ã¯ã‚¢ãƒ³ãƒ‘サンド (&) ã§çµã°ã‚Œã¾ã™ã€‚ + スペースã€ã‚¢ãƒ³ãƒ‘サンドã€ã‚¤ã‚³ãƒ¼ãƒ«ã®ã‚ˆã†ãªé¢å€’ãªæ–‡å­—ã¯ã€ + ãれらãŒå‹•作を駄目ã«ã—ãªã„よã†ã«ãã®æ–‡å­—ã«ç›¸å½“ã™ã‚‹ 16 進ã«å¤‰æ›ã•れã¾ã™ã€‚ + 全データ文字列ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™: +

    + +

    + name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey +

    + +

    時々ã€ã“ã®ã‚ˆã†ãªæ–‡å­—列㌠URL + ã«ä»˜åŠ ã•れるã®ã‚’見るã§ã—ょã†ã€‚ãã®å ´åˆã€ã‚µãƒ¼ãƒã¯ + QUERY_STRING ã¨ã„ã†ç’°å¢ƒå¤‰æ•°ã«ãã®æ–‡å­—列を入れã¾ã™ã€‚ãれ㯠+ GET リクエストã¨å‘¼ã°ã‚Œã¾ã™ã€‚ + HTML フォームã§ã¯ã€ãƒ‡ãƒ¼ã‚¿ã‚’渡ã™ãŸã‚ã« GET 㨠+ POST ã®ã©ã¡ã‚‰ã‚’使用ã™ã‚‹ã‹ã‚’ã€FORM ã‚¿ã‚°ã® + METHOD 属性ã®è¨­å®šã§æŒ‡å®šã—ã¾ã™ã€‚

    + +

    CGI プログラムã¯ã€ãã®æ–‡å­—列を役ã«ç«‹ã¤æƒ…å ±ã«åˆ†å‰²ã™ã‚‹è²¬ä»»ãŒã‚りã¾ã™ã€‚ + 幸ã„ã«ã‚‚ã€ãã®ãƒ‡ãƒ¼ã‚¿å‡¦ç†ã‚’助ã‘るライブラリやモジュールãŒå­˜åœ¨ã—ã¾ã™ã€‚ + ã“れらã¯ã€CGI プログラムã®ä»–ã®é¢ã§ã‚‚åŒæ§˜ã«å½¹ã«ç«‹ã¡ã¾ã™ã€‚

    + +
    top
    +
    +

    CGI モジュール/ライブラリ

    + + +

    CGI プログラムを書ãã¨ãã€é¢å€’ãªä»•事ã®å¤§éƒ¨åˆ†ã‚’ã—ã¦ãれる + コードライブラリã¾ãŸã¯ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’使ã†ã“ã¨ã‚’検討ã™ã¹ãã§ã™ã€‚ + ã“れã¯ã‚¨ãƒ©ãƒ¼ã‚’減らã—ã€æ—©ã„開発ã«ã¤ãªãŒã‚Šã¾ã™ã€‚

    + +

    Perl ã§ CGI プログラムを書ã„ã¦ã„ã‚‹ãªã‚‰ã€ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¯ CPAN ã§æä¾›ã•れã¦ã„ã¾ã™ã€‚ + ã“ã®ç›®çš„ã®ãŸã‚ã®æœ€ã‚‚æ™®åŠã—ã¦ã„るモジュール㯠CGI.pm ã§ã™ã€‚ + CGI::Lite も検討ã—ã¾ã—ょã†ã€‚ã“れã¯ã€ã»ã¨ã‚“ã©ã®ãƒ—ログラム + ã«ãŠã„ã¦å¿…è¦ã¨ã™ã‚‹ã™ã¹ã¦ã®æ©Ÿèƒ½ã®æœ€å°ã‚»ãƒƒãƒˆã®å®Ÿè£…ã§ã™ã€‚

    + +

    C ã§ CGI プログラムを書ã„ã¦ã„ã‚‹ãªã‚‰ã€ã„ã‚ã„ã‚㪠+ オプションãŒã‚りã¾ã™ã€‚ã“れらã®å†…ã®ä¸€ã¤ã¯ http://www.boutell.com/cgic/ + ã§æä¾›ã•れã¦ã„ã‚‹ CGIC ライブラリã§ã™ã€‚

    +
    top
    +
    +

    æ›´ãªã‚‹æƒ…å ±

    + + +

    CGI ã«é–¢ã™ã‚‹æƒ…å ±ã¯ã‚¦ã‚§ãƒ–ã§æ•°å¤šãæä¾›ã•れã¦ã„ã¾ã™ã€‚CGI + ã®å•題ã«ã¤ã„ã¦ã¯ Usenet ã® comp.infosystems.www.authoring.cgi ã§ã€ + ä»–ã®ãƒ¦ãƒ¼ã‚¶ã¨è«–è­°ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚HTML Writers Guide ã® + -servers メーリングリストã¯ã€ã‚ãªãŸã®è³ªå•ã«å›žç­”ã—ã¦ãれるå‰å¤§ãªãƒªã‚½ãƒ¼ã‚¹ã§ã™ã€‚ + http://www.hwg.org/lists/hwg-servers/ + ã§æ›´ã«å¤šãを探ã—出ã™ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    ãã—ã¦ã‚‚ã¡ã‚ã‚“ã€ãŠãらã CGI + プログラムã®å‹•作ã«é–¢ã™ã‚‹è©³ç´°ã®å…¨ã¦ãŒè¨˜è¿°ã•れã¦ã„ã‚‹ + CGI ã®ä»•様を読むã¹ãã§ã™ã€‚オリジナルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ + NCSA + ã§ã€ã‚¢ãƒƒãƒ—デートã•れãŸãƒ‰ãƒ©ãƒ•トを + Common Gateway Interface RFC + プロジェクトã§å‚ç…§ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    CGI ã®å•題ã«ã¤ã„ã¦ã€åŠ ã‚ã£ã¦ã„るメーリングリストã¾ãŸã¯ãƒ‹ãƒ¥ãƒ¼ã‚¹ + グループã«è³ªå•ã‚’é€ã‚‹ã¨ãã€èµ·ã“ã£ãŸã‚‚ã®ã€èµ·ã“ã£ã¦ã»ã—ã„ã“ã¨ã€ + 実際ã«èµ·ã“ã£ãŸã“ã¨ãŒã©ã†é•ã†ã‹ã€ä½¿ç”¨ã—ã¦ã„るサーãƒã€ + CGI プログラムを記述ã—ã¦ã„る言語ã«é–¢ã™ã‚‹ååˆ†ãªæƒ…å ±ã¨ã€ + å¯èƒ½ã§ã‚れã°å•題ã®ã‚³ãƒ¼ãƒ‰ã‚’æä¾›ã™ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。 + ãã†ã™ã‚‹ã“ã¨ã§ã€å•題ãŒã‚ˆã‚Šé–“å˜ã«è¦‹ã¤ã‹ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚

    + +

    Apache ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã«ãŠã„ã¦å•題を発見ã—ãŸã“ã¨ã‚’確信ã—ã¦ã„ãªã„é™ã‚Šã€ + CGI ã®å•題ã«é–¢ã™ã‚‹è³ªå•ã‚’ Apache + ãƒã‚°ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«é€ã‚‹ã¹ãã§ãªã„ + ã“ã¨ã«æ³¨ç›®ã—ã¦ãã ã•ã„。

    +
    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/cgi.html.ko.euc-kr b/docs/manual/howto/cgi.html.ko.euc-kr new file mode 100644 index 0000000..0f18b8e --- /dev/null +++ b/docs/manual/howto/cgi.html.ko.euc-kr @@ -0,0 +1,533 @@ + + + + + +¾ÆÆÄÄ¡ ÅõÅ丮¾ó: CGI¸¦ »ç¿ëÇÑ µ¿Àû ÆäÀÌÁö »ý¼º - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡ ÅõÅ丮¾ó: CGI¸¦ »ç¿ëÇÑ µ¿Àû ÆäÀÌÁö »ý¼º

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    +
    + +
    top
    +
    +

    ¼Ò°³

    + + + + +

    CGI (Common Gateway Interface)´Â À¥¼­¹ö°¡ º¸Åë CGI ÇÁ·Î±×·¥ + ȤÀº CGI ½ºÅ©¸³Æ®¶ó°í ºÎ¸£´Â, (À¥ÆäÀÌÁö ³»¿ëÀ» ¸¸µå´Â) ¿ÜºÎ + ÇÁ·Î±×·¥°ú Åë½ÅÇÏ´Â ¹æ¹ýÀ» Á¤ÀÇÇÑ´Ù. À¥»çÀÌÆ®¿¡¼­ µ¿ÀûÀÎ + ÆäÀÌÁö¸¦ ¸¸µå´Â °¡Àå ÈçÇÏ°í °£´ÜÇÑ ¹æ¹ýÀÌ´Ù. ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡ + À¥¼­¹ö¿¡ CGI¸¦ ±¸¼ºÇÏ´Â ¹æ¹ýÀ» ¼Ò°³Çϰí, CGI ÇÁ·Î±×·¥À» + ÀÛ¼ºÇغ»´Ù.

    +
    top
    +
    +

    CGI¸¦ Çã¿ëÇϵµ·Ï ¾ÆÆÄÄ¡ ¼³Á¤Çϱâ

    + + +

    CGI ÇÁ·Î±×·¥ÀÌ ¿Ã¹Ù·Î µ¿ÀÛÇÏ·Á¸é CGI ½ÇÇàÀÌ °¡´ÉÇϵµ·Ï + ¾ÆÆÄÄ¡¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù. ¼³Á¤ÇÏ´Â ¹æ¹ýÀº ¿©·¯°¡Áö´Ù.

    + +

    ScriptAlias

    + + +

    ScriptAlias + Áö½Ã¾î¸¦ »ç¿ëÇÏ¸é ¾ÆÆÄÄ¡´Â ƯÁ¤ µð·ºÅ丮¸¦ CGI ÇÁ·Î±×·¥¿ëÀ¸·Î + µÐ´Ù. ¾ÆÆÄÄ¡´Â ÀÌ µð·ºÅ丮¿¡ ÀÖ´Â ¸ðµç ÆÄÀÏÀÌ CGI + ÇÁ·Î±×·¥À̶ó°í °¡Á¤ÇÏ¿© Ŭ¶óÀÌ¾ðÆ®°¡ ÀÚ¿øÀ» ¿äûÇϸé ÀÚ¿øÀ» + ½ÇÇàÇÏ·Á°í ½ÃµµÇÑ´Ù.

    + +

    ScriptAlias + Áö½Ã¾î´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÑ´Ù.

    + +

    + ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/ +

    + +

    À§ ¿¹Á¦´Â ¾ÆÆÄÄ¡¸¦ ±âº» Àå¼Ò¿¡ ¼³Ä¡ÇÑ °æ¿ì + httpd.conf ¼³Á¤ÆÄÀÏ¿¡ ÀÖ´Â ³»¿ëÀÌ´Ù. ScriptAlias Áö½Ã¾î´Â Alias Áö½Ã¾î¿Í °°ÀÌ URL + ¾ÕºÎºÐÀ» ƯÁ¤ µð·ºÅ丮·Î ´ëÀÀÇÑ´Ù. + Alias¿Í + ScriptAlias´Â º¸Åë DocumentRoot µð·ºÅ丮 ¹Û¿¡ ÀÖ´Â + µð·ºÅ丮¿¡ »ç¿ëÇÑ´Ù. Alias¿Í + ScriptAliasÀÇ Â÷ÀÌÁ¡Àº + ScriptAlias°¡ Ãß°¡·Î URL ¾ÕºÎºÐÀ¸·Î + ½ÃÀÛÇÏ´Â ¸ðµç ÆÄÀÏÀ» CGI ÇÁ·Î±×·¥À¸·Î Ãë±ÞÇÏ´Â Á¡ÀÌ´Ù. + ±×·¡¼­ À§ÀÇ ¼³Á¤Àº ¾ÆÆÄÄ¡¿¡°Ô /cgi-bin/À¸·Î + ½ÃÀÛÇÏ´Â ÀÚ¿øÀ» ¿äûÇϸé + /usr/local/apache2/cgi-bin/ µð·ºÅ丮¿¡¼­ + ã¾Æ¼­ CGI ÇÁ·Î±×·¥À¸·Î ó¸®Ç϶ó°í ¾Ë¸°´Ù.

    + +

    ¿¹¸¦ µé¾î, URL + http://www.example.com/cgi-bin/test.plÀ» + ¿äûÇÏ¸é ¾ÆÆÄÄ¡´Â + /usr/local/apache2/cgi-bin/test.pl ÆÄÀÏÀ» + ½ÇÇàÇÏ¿© °á°ú¸¦ ¹ÝȯÇÑ´Ù. ¹°·Ð ÆÄÀÏÀÌ Á¸ÀçÇÏ°í ½ÇÇà°¡´ÉÇϸç + ¾î¶² ¹æ¹ýÀ¸·Îµç Ãâ·ÂÀ» ÇØ¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ¾ÆÆÄÄ¡´Â + ¿À·ù¹®À» º¸³½´Ù.

    + + +

    ScriptAlias µð·ºÅ丮 ¹Û¿¡ ÀÖ´Â CGI

    + + +

    º¸Åë º¸¾È»ó ÀÌÀ¯¶§¹®¿¡ CGI ÇÁ·Î±×·¥Àº ScriptAliasÇÑ µð·ºÅ丮¿¡ + ÇÑÁ¤ÇÑ´Ù. ±×·¡¼­ °ü¸®ÀÚ´Â ´©°¡ CGI ÇÁ·Î±×·¥À» »ç¿ëÇÒ ¼ö + ÀÖ´ÂÁö ¾ö°ÝÈ÷ °¨µ¶ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª Àû´çÇÑ º¸¾ÈÁ¶Ä¡¸¦ + ÃëÇß´Ù¸é ¾Æ¹« µð·ºÅ丮¿¡¼­³ª CGI ÇÁ·Î±×·¥À» ½ÇÇàÇÏÁö ¾ÊÀ» + ÀÌÀ¯°¡ ¾ø´Ù. ¿¹¸¦ µé¾î, UserDir Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© + »ç¿ëÀÚ°¡ ÀÚ½ÅÀÇ È¨µð·ºÅ丮¿¡ À¥ÆäÀÌÁö¸¦ °¡Áö´Â °æ¿ì¸¦ + °¡Á¤ÇÏÀÚ. »ç¿ëÀÚ°¡ ÀÚ½ÅÀÇ CGI ÇÁ·Î±×·¥À» »ç¿ëÇÏ°í ½ÍÀºµ¥ + cgi-bin µð·ºÅ丮¿¡ Á¢±Ù±ÇÇÑÀÌ ¾ø´Ù¸é, ´Ù¸¥ + °÷¿¡¼­¶óµµ CGI ÇÁ·Î±×·¥À» ½ÇÇàÇÏ°í ½ÍÀ» °ÍÀÌ´Ù.

    + +

    ¾Æ¹« µð·ºÅ丮¿¡¼­³ª CGI ½ÇÇàÀ» Çã¿ëÇÏ·Á¸é µÎ °úÁ¤ÀÌ + ÇÊ¿äÇÏ´Ù. ¸ÕÀú, AddHandler³ª SetHandler Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© + cgi-script Çڵ鷯¸¦ ÀÛµ¿ÇØ¾ß ÇÑ´Ù. µÎ¹øÂ°·Î, + Options Áö½Ã¾î¿¡ + ExecCGI¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù.

    + + +

    Options¸¦ »ç¿ëÇÏ¿© ¸í½ÃÀûÀ¸·Î CGI ½ÇÇàÀ» Çã¿ëÇϱâ

    + + +

    ¼­¹öÀÇ ÁÖ¼³Á¤ÆÄÀÏ¿¡ Á÷Á¢ Options Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ƯÁ¤ + µð·ºÅ丮¿¡¼­ CGI ½ÇÇàÀ» Çã¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    + <Directory /usr/local/apache2/htdocs/somedir>
    + + Options +ExecCGI
    +
    + </Directory> +

    + +

    À§ Áö½Ã¾î·Î ¾ÆÆÄÄ¡´Â CGI ÆÄÀÏÀÇ ½ÇÇàÀ» Çã¿ëÇÑ´Ù. ¾î¶² + ÆÄÀÏÀÌ CGI ÆÄÀÏÀÎÁöµµ ¼­¹ö¿¡°Ô ¾Ë·Á¾ß ÇÑ´Ù. ´ÙÀ½ AddHandler Áö½Ã¾î´Â ¼­¹ö¿¡°Ô + È®ÀåÀÚ°¡ cgi³ª plÀÎ ÆÄÀÏÀº ¸ðµÎ + CGI ÇÁ·Î±×·¥À̶ó°í ¾Ë¸°´Ù.

    + +

    + AddHandler cgi-script .cgi .pl +

    + + +

    .htaccess ÆÄÀÏ

    + + +

    .htaccess ÅõÅ丮¾óÀº + httpd.conf¿¡ Á¢±Ù±ÇÇÑÀÌ ¾ø´Â °æ¿ì¿¡ CGI ÇÁ·Î±×·¥À» + »ç¿ëÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» ¾Ë·ÁÁØ´Ù.

    + + +

    »ç¿ëÀÚ µð·ºÅ丮

    + + +

    ¾Æ·¡ ¼³Á¤À» »ç¿ëÇÏ¸é »ç¿ëÀÚ µð·ºÅ丮¿¡¼­ .cgi·Î + ³¡³ª´Â ÆÄÀÏÀ» CGI ÇÁ·Î±×·¥À¸·Î ½ÇÇàÇÑ´Ù.

    + +

    + <Directory /home/*/public_html>
    + + Options +ExecCGI
    + AddHandler cgi-script .cgi
    +
    + </Directory> +

    + +

    ´ÙÀ½À» »ç¿ëÇÏ¸é »ç¿ëÀÚ µð·ºÅ丮ÀÇ cgi-bin + ÇÏÀ§µð·ºÅ丮¿¡ ÀÖ´Â ¸ðµç ÆÄÀÏÀ» CGI ÇÁ·Î±×·¥À¸·Î ÀνÄÇÑ´Ù.

    + +

    + <Directory /home/*/public_html/cgi-bin>
    + + Options ExecCGI
    + SetHandler cgi-script
    +
    + </Directory> +

    + + + +
    top
    +
    +

    CGI ÇÁ·Î±×·¥ ÀÛ¼ºÇϱâ

    + + +

    ``ÀϹÝÀûÀÎ'' ÇÁ·Î±×·¡¹Ö°ú CGI ÇÁ·Î±×·¡¹Ö »çÀÌ¿¡´Â µÎ°¡Áö + ÁÖµÈ Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù.

    + +

    ù¹øÂ° Â÷ÀÌ´Â CGI ÇÁ·Î±×·¥Àº ´Ù¸¥ Ãâ·ÂÀ» ÇϱâÀü¿¡ ¸ÕÀú + MIME-type Çì´õ¸¦ Ãâ·ÂÇØ¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù. HTTP Çì´õ´Â + Ŭ¶óÀÌ¾ðÆ®¿¡°Ô Ŭ¶óÀÌ¾ðÆ®°¡ ¾î¶² ³»¿ëÀ» ¹Þ°ÔµÉÁö ¹Ì¸® ¾Ë¸°´Ù. + º¸Åë ´ÙÀ½°ú °°´Ù.

    + +

    + Content-type: text/html +

    + +

    µÎ¹øÂ° Â÷ÀÌ´Â HTML ȤÀº ºê¶ó¿ìÀú°¡ º¸¿©ÁÙ ¼ö ÀÖ´Â Çü½ÄÀ¸·Î + Ãâ·ÂÇØ¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù. ´ëºÎºÐÀÇ °æ¿ì HTMLÀ» Ãâ·ÂÇÏÁö¸¸, + ¶§¶§·Î gif ±×¸²°ú °°ÀÌ HTMLÀÌ ¾Æ´Ñ ³»¿ëÀ» Ãâ·ÂÇÏ´Â CGI + ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °æ¿ìµµ ÀÖ´Ù.

    + +

    µÎ°¡Áö¸¦ Á¦¿ÜÇϰí´Â CGI ÇÁ·Î±×·¥ ÀÛ¼ºÀº ÀÌ¹Ì ¸¸µé¾î º¸¾ÒÀ» + ´Ù¸¥ ÇÁ·Î±×·¥µé°ú ¸Å¿ì ºñ½ÁÇÏ´Ù.

    + +

    óÀ½À¸·Î ¸¸µç CGI ÇÁ·Î±×·¥

    + + +

    ´ÙÀ½Àº ºê¶ó¿ìÀú¿¡ ÇÑ ÁÙÀ» Âï´Â CGI ÇÁ·Î±×·¥ ¿¹Á¦´Ù. + ±×´ë·Î first.plÀ̶ó´Â ÆÄÀÏ¿¡ ÀúÀåÇϰí, + cgi-bin µð·ºÅ丮¿¡ º¹»çÇÑ´Ù.

    + +

    + #!/usr/bin/perl
    + print "Content-type: text/html\n\n";
    + print "Hello, World."; +

    + +

    Perl¿¡ Àͼ÷ÇÏÁö ¾Ê´õ¶óµµ ¹«½¼ ÀÏÀÌ ÀϾ´ÂÁö ¾Ë ¼ö + ÀÖ´Ù. ù¹øÂ° ÁÙÀº ¾ÆÆÄÄ¡(ȤÀº »ç¿ëÇÏ´Â ½©)¿¡°Ô + /usr/bin/perl À§Ä¡¿¡ ÀÖ´Â ÀÎÅÍÇÁ¸®ÅÍÀ» »ç¿ëÇÏ¿© + ÀÌ ÇÁ·Î±×·¥ ÆÄÀÏÀ» ½ÇÇàÇ϶ó°í ¾Ë¸°´Ù. µÎ¹øÂ° ÁÙÀº ¹æ±Ý + ¸»ÇÑ content-type ¼±¾ðÀ» Ãâ·ÂÇϰí carriage-return ÁٹٲÞÀ» + µÎ¹ø Ãâ·ÂÇÑ´Ù. ±×·¯¸é Çì´õ µÚ¿¡ HTTP Çì´õÀÇ ³¡À» ¶æÇÏ´Â + ºóÁÙÀÌ »ý±â°í, º»¹®ÀÌ ½ÃÀÛÇÑ´Ù. ¼¼¹øÂ° ÁÙÀº "Hello, World." + ¹®ÀÚ¿­À» Ãâ·ÂÇÑ´Ù. À̰ÍÀ¸·Î ³¡ÀÌ´Ù.

    + +

    ºê¶ó¿ìÀú¸¦ ½ÇÇàÇϰí ÁÖ¼Ò¸¦ ÀÔ·ÂÇÑ´Ù

    + +

    + http://www.example.com/cgi-bin/first.pl +

    + +

    ÆÄÀÏ Àå¼Ò¸¦ ÀÔ·ÂÇϸé, ºê¶ó¿ìÀúâ¿¡ Hello, World. + ÇÑ ÁÙÀÌ º¸ÀδÙ. ÈïºÐµÇÁö´Â ¾ÊÁö¸¸, Çѹø µ¿ÀÛÇÏ´Â °ÍÀ» + º¸¾ÒÀ¸´Ï ÀÌÁ¦ ´Ù¸¥ °ÍÀ» ½ÃµµÇØ º¼ ¼ö ÀÖ´Ù.

    + +
    top
    +
    +

    ±×·¯³ª ¾ÆÁ÷ µ¿ÀÛÇÏÁö ¾Ê¾Æ¿ä!

    + + +

    À¥¿¡¼­ CGI ÇÁ·Î±×·¥¿¡ Á¢±ÙÇÒ¶§ ºê¶ó¿ìÀú¿¡ ³ª¿Ã ¼ö ÀÖ´Â + ³»¿ëÀº ±âº»ÀûÀ¸·Î ³×°¡Áö´Ù.

    + +
    +
    CGI ÇÁ·Î±×·¥ÀÇ Ãâ·Â
    +
    ÁÁ´Ù! ¸ðµç °ÍÀÌ Àß µ¿ÀÛÇÑ´Ù´Â ¶æÀÌ´Ù. Ãâ·ÂÀº Á¤È®ÇÏÁö¸¸ + ºê¶ó¿ìÀú°¡ ¿Ã¹Ù·Î ó¸®ÇÏÁö ¸øÇÑ´Ù¸é, CGI ÇÁ·Î±×·¥¿¡¼­ + ¿Ã¹Ù¸¥ Content-TypeÀ» ¼³Á¤ÇÏ¿´´ÂÁö È®ÀÎÇÑ´Ù.
    + +
    CGI ÇÁ·Î±×·¥ ¼Ò½ºÄÚµå ȤÀº "POST Method Not Allowed" + ¹®±¸
    +
    CGI ÇÁ·Î±×·¥À» ½ÇÇàÇϵµ·Ï ¾ÆÆÄÄ¡¸¦ ÀûÀýÈ÷ ¼³Á¤ÇÏÁö + ¾Ê¾Ò´Ù´Â ¶æÀÌ´Ù. ¾ÆÆÄÄ¡ ¼³Á¤Çϱâ + ÀýÀ» ´Ù½Ã ÀÐ°í »©¸ÔÀº ºÎºÐÀÌ ÀÖ´ÂÁö ã¾ÆºÁ¶ó.
    + +
    "Forbidden"À¸·Î ½ÃÀÛÇÏ´Â ¹®±¸
    +
    ±ÇÇÑ ¹®Á¦°¡ ÀÖ´Ù´Â ¶æÀÌ´Ù. ¾ÆÆÄÄ¡ + ¿À·ù ·Î±×¿Í ¾Æ·¡ ÆÄÀϱÇÇÑ + ÀýÀ» È®ÀÎÇ϶ó.
    + +
    "Internal Server Error"¶ó´Â ¹®±¸
    +
    ¾ÆÆÄÄ¡ ¿À·ù ·Î±×¸¦ º¸¸é ¾Æ¸¶µµ + CGI ÇÁ·Î±×·¥ÀÌ Ãâ·ÂÇÑ ¿À·ù¹®°ú ÇÔ²² "Premature end of + script headers"°¡ º¸ÀÏ °ÍÀÌ´Ù. ÀÌ °æ¿ì ¾Æ·¡ ³»¿ëµéÀ» Çϳª¾¿ + È®ÀÎÇÏ¿© ¾î¶² ÀÌÀ¯·Î CGI ÇÁ·Î±×·¥ÀÌ ÀûÀýÇÑ HTTP Çì´õ¸¦ + Ãâ·ÂÇÏÁö ¸øÇß´ÂÁö ¾Ë¾Æº»´Ù.
    +
    + +

    ÆÄÀϱÇÇÑ

    + + +

    ¼­¹ö´Â ´ç½Å°ú µ¿ÀÏÇÑ °èÁ¤À¸·Î µ¿ÀÛÇÏÁö ¾ÊÀ½À» ¸í½ÉÇ϶ó. + Áï, ¼­¹ö°¡ ½ÃÀÛÇÏ¸é ¼­¹ö´Â ºñƯ±Ç »ç¿ëÀÚ ±ÇÇÑ(º¸Åë + nobody³ª www)À¸·Î µ¿ÀÛÇÑ´Ù. + ±×·¡¼­ ´ç½ÅÀÌ ¼ÒÀ¯ÇÑ ÆÄÀÏÀ» ½ÇÇàÇÏ·Á¸é ±ÇÇÑÀÌ ÇÊ¿äÇÏ´Ù. + ÆÄÀÏ¿¡ nobody°¡ ½ÇÇàÇϱ⿡ ÃæºÐÇÑ ±ÇÇÑÀ» + ÁÖ±âÀ§ÇØ º¸Åë ¸ðµÎ¿¡°Ô ÆÄÀÏÀÇ ½ÇÇà ±ÇÇÑÀ» ÁØ´Ù.

    + +

    + chmod a+x first.pl +

    + +

    ¶Ç, ÇÁ·Î±×·¥ÀÌ ´Ù¸¥ ÆÄÀÏÀ» Àаųª ¾´´Ù¸é ÀÌ ÆÄÀÏ¿¡µµ + ÀûÀýÇÑ ±ÇÇÑÀÌ ÇÊ¿äÇÏ´Ù.

    + + + +

    °æ·Î Á¤º¸¿Í ȯ°æ

    + + +

    ¸í·ÉÇà¿¡¼­ ÇÁ·Î±×·¥À» ½ÇÇàÇϸé ÀÚµ¿À¸·Î ¾î¶² Á¤º¸°¡ + ½©·Î Àü´ÞµÈ´Ù. ¿¹¸¦ µé¾î, PATH´Â ½©¿¡°Ô ´ç½ÅÀÌ + ¸»ÇÑ ÆÄÀÏÀ» ãÀ» Àå¼Ò¸¦ ¾Ë·ÁÁØ´Ù.

    + +

    À¥¼­¹ö°¡ ÇÁ·Î±×·¥À» CGI ÇÁ·Î±×·¥À¸·Î ½ÇÇàÇÒ¶§´Â + PATH°¡ ´Ù¸¦ ¼ö ÀÖ´Ù. (¿¹¸¦ µé¾î, + sendmail °°ÀÌ) CGI ÇÁ·Î±×·¥ ¾È¿¡¼­ ½ÇÇàÇÏ´Â + ¸í·É¾î´Â ¿ÏÀüÇÑ °æ·Î·Î ¸í½ÃÇØ¾ß ½©ÀÌ ¸í·É¾î¸¦ ãÀ» ¼ö + ÀÖ´Ù.

    + +

    °æ·Î ¹®Á¦´Â ´ÙÀ½°ú °°ÀÌ CGI ÇÁ·Î±×·¥ ù¹øÂ° ÁÙ¿¡ ³ª¿À´Â + ½ºÅ©¸³Æ® ÀÎÅÍÇÁ¸®ÅÍ (º¸Åë perl) °æ·Î¿¡¼­ + ÀÚÁÖ ¹ß»ýÇÑ´Ù.

    + +

    + #!/usr/bin/perl +

    + +

    ½ÇÁ¦·Î ÀÎÅÍÇÁ¸®ÅÍÀÇ °æ·ÎÀÎÁö È®ÀÎÇÑ´Ù.

    + +

    ¶Ç, CGI ÇÁ·Î±×·¥ÀÌ ´Ù¸¥ ȯ°æº¯¼ö¸¦ + »ç¿ëÇÑ´Ù¸é ¾ÆÆÄÄ¡°¡ ÀÌ º¯¼öµéÀ» ÇÁ·Î±×·¥¿¡°Ô Àü´ÞÇØ¾ß + ÇÑ´Ù.

    + + + +

    ÇÁ·Î±×·¥ ¿À·ù

    + + +

    CGI ÇÁ·Î±×·¥ÀÌ ½ÇÆÐÇÏ´Â °æ¿ì ´ëºÎºÐ ÇÁ·Î±×·¥ ÀÚü + ¹®Á¦¶§¹®ÀÌ´Ù. ƯÈ÷ À§ÀÇ µÎ°¡Áö ½Ç¼ö¸¦ ÇÏÁö ¾Ê¾Ò°í ÀÌ ±ÛÀ» + °è¼Ó º¸°í ÀÖ´Ù¸é ´õ´õ¿í ±×·¸´Ù. ¸ÕÀú À¥¼­¹ö¿¡¼­ ½ÇÇàÇϱâ + Àü¿¡ ¸í·ÉÇà¿¡¼­ ÇÁ·Î±×·¥À» ½ÇÇàÇØº»´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½°ú + °°ÀÌ ½ÇÇàÇÑ´Ù.

    + +

    + cd /usr/local/apache2/cgi-bin
    + ./first.pl +

    + +

    (perl ÀÎÅÍÇÁ¸®Å͸¦ ½ÇÇàÇÏÁö ¸¶¶ó. ½©°ú + ¾ÆÆÄÄ¡´Â ½ºÅ©¸³Æ® ù¹øÂ° ÁÙ¿¡ ÀÖ´Â °æ·Î Á¤º¸¸¦ »ç¿ëÇÏ¿© ÀÎÅÍÇÁ¸®Å͸¦ + ã¾Æ¾ß ÇÑ´Ù.)

    + +

    ÇÁ·Î±×·¥Àº Á¦ÀÏ ¸ÕÀú Content-TypeÀ» Æ÷ÇÔÇÑ + HTTP Çì´õµéÀ» Ãâ·ÂÇÏ°í ºó ÁÙÀ» Ãâ·ÂÇØ¾ß ÇÑ´Ù. ´Ù¸¥ °ÍÀ» + Ãâ·ÂÇÑ´Ù¸é À¥¼­¹ö¿¡¼­ ½ÇÇàÇÒ °æ¿ì ¾ÆÆÄÄ¡´Â Premature + end of script headers¸¦ ¹ÝȯÇÑ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº + À§ÀÇ CGI ÇÁ·Î±×·¥ ÀÛ¼ºÇϱ⸦ Âü°íÇ϶ó.

    + + +

    ¿À·ù ·Î±×

    + + +

    ¿À·ù ·Î±×´Â ´ç½Å ÆíÀÌ´Ù. ¹«¾ð°¡ À߸øµÇ¸é ¿À·ù ·Î±×¿¡ + ¹®±¸°¡ »ý±ä´Ù. ¿À·ù ·Î±×¸¦ Á¦ÀÏ ¸ÕÀú »ìÆìºÁ¾ß ÇÑ´Ù. À¥»çÀÌÆ®¸¦ + È£½ºÆÃÇÏ´Â °÷¿¡¼­ ¿À·ù ·Î±×¸¦ º¸Áö ¸øÇÏ°Ô ÇÑ´Ù¸é, ¾Æ¸¶µµ + ´Ù¸¥ ¾÷ü¸¦ ¾Ë¾ÆºÁ¾ß ÇÑ´Ù. ¿À·ù ·Î±×¸¦ º¸´Â ¹æ¹ýÀ» ÀÍÈ÷¸é, + ´ëºÎºÐÀÇ ¹®Á¦¸¦ »¡¸® ÆÄ¾ÇÇÏ¿© ÇØ°áÇÒ ¼ö ÀÖ´Ù.

    + + +

    Suexec

    + + +

    suexec Áö¿ø ÇÁ·Î±×·¥À» + »ç¿ëÇÏ¸é ¾î¶² °¡»óÈ£½ºÆ® ȤÀº ¾î¶² »ç¿ëÀÚ µð·ºÅ丮¿¡ ÀÖ´ÂÁö¿¡ + µû¶ó CGI ÇÁ·Î±×·¥À» ´Ù¸¥ »ç¿ëÀÚ ±ÇÇÑÀ¸·Î ½ÇÇàÇÒ ¼ö ÀÖ´Ù. + Suexec´Â ¸Å¿ì ¾ö°ÝÇÏ°Ô ±ÇÇÑÀ» °Ë»çÇϸç, °Ë»ç¸¦ Çϳª¶óµµ + Åë°úÇÏÁö ¸øÇϸé CGI ÇÁ·Î±×·¥À» ½ÇÇàÇÏÁö ¾Ê°í Premature + end of script headers¸¦ ¹ÝȯÇÑ´Ù.

    + +

    suexec¸¦ »ç¿ëÇϰí ÀÖ´ÂÁö ¾Ë·Á¸é apachectl -V¸¦ + ½ÇÇàÇÏ¿© SUEXEC_BIN À§Ä¡¸¦ È®ÀÎÇÑ´Ù. ¾ÆÆÄÄ¡°¡ + ½ÃÀÛÇÒ¶§ ±× Àå¼Ò¿¡¼­ suexec ½ÇÇàÆÄÀÏÀ» ¹ß°ßÇϸé, suexec¸¦ + »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    suexec¸¦ ¿ÏÀüÈ÷ ÀÌÇØÇÏÁö ¸øÇß´Ù¸é »ç¿ëÇØ¼­´Â ¾ÈµÈ´Ù. + suexec¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸·Á¸é SUEXEC_BIN À§Ä¡¿¡ + ÀÖ´Â suexec ½ÇÇàÆÄÀÏÀ» Áö¿ì°í (ȤÀº ÆÄÀϸíÀ» + ¹Ù²Ù°í) ¼­¹ö¸¦ Àç½ÃÀÛÇÏ¸é µÈ´Ù. suexec¿¡ ´ëÇØ ÀÐÀº ´ÙÀ½ ±×·¡µµ + »ç¿ëÇÏ°í ½Í´Ù¸é, suexec -V¸¦ ½ÇÇàÇÏ¿© suexec + ·Î±×ÆÄÀÏ À§Ä¡¸¦ ¾Ë¾Æ³»°í ·Î±×ÆÄÀÏ¿¡¼­ ´ç½ÅÀÌ ¾î¶² ±ÔÄ¢À» + ¾î±â°í ÀÖ´ÂÁö ã´Â´Ù.

    + +
    top
    +
    +

    µÚ¿¡¼­´Â ¹«½¼ ÀÏÀÌ ¹ú¾îÁö´Â°¡?

    + + +

    CGI ÇÁ·Î±×·¡¹Ö¿¡ Àͼ÷ÇØÁú¼ö·Ï µÚ¿¡¼­ ¹ú¾îÁö´Â ÀÏÀ» ÀÌÇØÇϸé + µµ¿òÀÌ µÈ´Ù. ±¸Ã¼ÀûÀ¸·Î ºê¶ó¿ìÀú¿Í ¼­¹ö°¡ ¼­·Î Åë½ÅÇÏ´Â + ¹æ¹ýÀ» ¸»ÇÏ´Â °ÍÀÌ´Ù. ¸ô¶óµµ "Hello, World."¸¦ Ãâ·ÂÇÏ´Â + ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖÁö¸¸ ÀÌ·± ÇÁ·Î±×·¥Àº º°·Î ¾µ¸ð°¡ + ¾ø±â¶§¹®ÀÌ´Ù.

    + +

    ȯ°æº¯¼ö

    + + +

    ȯ°æº¯¼ö´Â ´ç½ÅÀÌ ÄÄÇ»Å͸¦ »ç¿ëÇÏ´Â µ¿¾È ´ç½Å ÁÖÀ§¸¦ + ¶°´Ù´Ï´Â °ªÀÌ´Ù. ȯ°æº¯¼ö´Â path (ÄÄÇ»ÅͰ¡ ´ç½ÅÀÌ ÀÔ·ÂÇÑ + ¸í·É¾î¿¡ ÇØ´çÇÏ´Â ½ÇÁ¦ ÆÄÀÏÀ» ã´Â Àå¼Ò), »ç¿ëÀÚ¸í, Å͹̳Π+ Á¾·ù¿Í °°ÀÌ À¯¿ëÇÑ Á¤º¸´Ù. ÀϹÝÀûÀΠȯ°æº¯¼ö¸¦ ¸ðµÎ º¸·Á¸é + ¸í·ÉÇà ÇÁ·ÒÇÁÆ®¿¡¼­ env¸¦ ÀÔ·ÂÇÑ´Ù.

    + +

    CGI¸¦ ½ÇÇàÇÒ¶§µµ ¼­¹ö¿Í ºê¶ó¿ìÀú´Â °¢ÀÚÀÇ È¯°æº¯¼ö¸¦ + ¼­·Î ±³È¯ÇÑ´Ù. ÀÌ Á¤º¸¿¡´Â ºê¶ó¿ìÀú Á¾·ù (Netscape, IE, + Lynx), ¼­¹ö Á¾·ù (¾ÆÆÄÄ¡, IIS, WebSite), ½ÇÇàÇÏ´Â CGI + ÇÁ·Î±×·¥¸í µîÀÌ ÀÖ´Ù.

    + +

    CGI ÇÁ·Î±×·¡¸Ó´Â ÀÌ·± º¯¼öµéÀ» »ç¿ëÇÒ ¼ö ÀÖ°í, + ȯ°æº¯¼ö´Â Ŭ¶óÀ̾ðÆ®-¼­¹ö Åë½Å¿¡´Â ÀϺκÐÀ» Â÷ÁöÇÑ´Ù. + Àüü Çʼö º¯¼ö ¸ñ·ÏÀº http://hoohoo.ncsa.uiuc.edu/cgi/env.html¿¡ ÀÖ´Ù.

    + +

    ¾Æ·¡ °£´ÜÇÑ Perl CGI ÇÁ·Î±×·¥Àº Àڽſ¡°Ô Àü´ÞµÈ ¸ðµç + ȯ°æº¯¼ö¸¦ º¸¿©ÁØ´Ù. ¾ÆÆÄÄ¡ ¹èÆ÷º»ÀÇ cgi-bin + µð·ºÅ丮¿¡ ÀÌ¿Í ºñ½ÁÇÑ ÇÁ·Î±×·¥ÀÌ µÎ°³ ÀÖ´Ù. ¸î¸î º¯¼ö´Â + ÇʼöÀÌ°í ³ª¸ÓÁö´Â ¼±ÅÃÀûÀÌ´Ù. ±×·¡¼­ °ø½Ä ¸ñ·Ï¿¡ ¾ø´Â + º¯¼öµµ º¸ÀδÙ. ¶Ç, ¾ÆÆÄÄ¡´Â ±âº»ÀûÀ¸·Î Á¦°øÇϴ ȯ°æº¯¼ö + ¿Ü¿¡ ¿©·¯°¡Áö ¹æ¹ýÀ¸·Î Á÷Á¢ ȯ°æº¯¼ö¸¦ + Ãß°¡ÇÒ ¼ö ÀÖ´Ù.

    + +

    + #!/usr/bin/perl
    + print "Content-type: text/html\n\n";
    + foreach $key (keys %ENV) {
    + + print "$key --> $ENV{$key}<br>";
    +
    + } +

    + + +

    STDIN°ú STDOUT

    + + +

    ¶Ç, ¼­¹ö¿Í Ŭ¶óÀÌ¾ðÆ®´Â Ç¥ÁØÀÔ·Â(STDIN)°ú + Ç¥ÁØÃâ·Â(STDOUT)À¸·Î Åë½ÅÇÑ´Ù. ÀÏ»óÀûÀÎ °æ¿ì + STDINÀº Űº¸µå³ª ÇÁ·Î±×·¥ÀÌ Ã³¸®ÇÏ´Â ÆÄÀÏÀ» + ³ªÅ¸³»°í, STDOUTÀº º¸Åë ÄܼÖÀ̳ª È­¸éÀ» ¶æÇÑ´Ù.

    + +

    CGI ÇÁ·Î±×·¥¿¡°Ô À¥ ¾ç½Ä(form)À» POSTÇϸé + ¾ç½Ä¿¡ ÀÔ·ÂÇÑ ÀڷḦ Ưº°ÇÑ Çü½ÄÀ¸·Î ¹­¾î¼­ CGI ÇÁ·Î±×·¥ÀÇ + STDINÀ¸·Î Àü´ÞÇÑ´Ù. ±×·¯¸é ÇÁ·Î±×·¥Àº Űº¸µå³ª + ÆÄÀÏ¿¡¼­ ¾òÀº ÀڷḦ ó¸®ÇϵíÀÌ ÀڷḦ ó¸®ÇÒ ¼ö ÀÖ´Ù.

    + +

    "Ưº°ÇÑ Çü½Ä"Àº ¸Å¿ì °£´ÜÇÏ´Ù. Ç׸ñ À̸§°ú °ªÀ» µîÈ£(=)·Î + ¿¬°áÇϰí, Ç׸ñ À̸§°ú °ªÀÇ ½ÖµéÀ» ¼­·Î ¾ØÆÛ»÷µå(&)·Î + ¿¬°áÇÑ´Ù. °ø¹é, ¾ÚÆÛ»÷µå, µîÈ£ °°Àº ºÎÀÚ¿¬½º·¯¿î ¹®ÀÚ´Â + È¥µ¿ÇÏÁö ¾Êµµ·Ï 16Áø¼ö·Î º¯È¯ÇÑ´Ù. ¿ÏÀüÇÑ ÀÚ·á ¹®ÀÚ¿­Àº + ´ÙÀ½°ú °°ÀÌ »ý°å´Ù.

    + +

    + name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey +

    + +

    Á¾Á¾ URL µÚ¿¡¼­ ÀÌ·± ¹®ÀÚ¿­À» º¸°Ô µÈ´Ù. ÀÌ °æ¿ì ¼­¹ö´Â + ¹®ÀÚ¿­À» QUERY_STRINGÀ̶ó´Â ȯ°æº¯¼ö¿¡ ÀúÀåÇÑ´Ù. + À̸¦ GET ¿äûÀ̶ó°í ÇÑ´Ù. FORM + ű×ÀÇ METHOD ¼Ó¼ºÀ» ÁöÁ¤ÇÏ¿© HTML ¾ç½Ä(form)ÀÌ + ÀڷḦ GETÇÒÁö POSTÇÒÁö °áÁ¤ÇÑ´Ù.

    + +

    ÀÌÁ¦ ÇÁ·Î±×·¥Àº ÀÌ·± ¹®ÀÚ¿­À» À¯¿ëÇÑ Á¤º¸·Î Âɰ³¾ß + ÇÑ´Ù. ´ÙÇàÈ÷µµ ÀÌ·± ÀÚ·á 󸮸¦ µ½°í CGI ÇÁ·Î±×·¥ÀÇ ´Ù¸¥ + ¿©·¯ ¸éÀ» »ìÇÇ´Â ¶óÀ̺귯¸®¿Í ¸ðµâµéÀÌ ÀÖ´Ù.

    + +
    top
    +
    +

    CGI ¸ðµâ/¶óÀ̺귯¸®

    + + +

    CGI ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ¶§ Áö·çÇÑ ÀÛ¾÷À» ´ë½ÅÇØÁÖ´Â ÄÚµå + ¶óÀ̺귯¸® ȤÀº ¸ðµâÀ» »ç¿ëÇÒÁö °í·ÁÇØºÁ¾ß ÇÑ´Ù. ÀÌ·± °ÍÀ» + »ç¿ëÇÏ¸é ¹ö±×°¡ ÁÙ°í ´õ »¡¸® ÇÁ·Î±×·¥À» °³¹ßÇÒ ¼ö ÀÖ´Ù.

    + +

    Perl·Î CGI ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù¸é CPAN¿¡¼­ °ü·Ã ¸ðµâµéÀ» ãÀ» + ¼ö ÀÖ´Ù. CGI °³¹ß¿¡ °¡Àå ³Î¸® »ç¿ëµÇ´Â ¸ðµâÀº + CGI.pmÀÌ´Ù. ´ëºÎºÐÀÇ ÇÁ·Î±×·¥¿¡ ÃæºÐÇÑ ÃÖ¼Ò + ±â´ÉÀ» ±¸ÇöÇÑ CGI::Liteµµ °í·ÁÇØ º¼ ¼ö ÀÖ´Ù.

    + +

    C·Î CGI ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù¸é ¼±ÅÃÀÇ ¿©Áö°¡ ¸¹´Ù. ÀÌÁß + Çϳª°¡ http://www.boutell.com/cgic/¿¡ + ÀÖ´Â CGIC ¶óÀ̺귯¸®´Ù.

    +
    top
    +
    +

    ´õ ¸¹Àº Á¤º¸...

    + + +

    À¥¿¡ ¸Å¿ì ¸¹Àº CGI Á¤º¸°¡ ÀÖ´Ù. ´º½º±×·ì comp.infosystems.www.authoring.cgi¿¡¼­ ¿©·¯ »ç¶÷µé°ú + CGI ¹®Á¦¸¦ ³íÀÇÇÒ ¼ö ÀÖ´Ù. HTML Writers GuildÀÇ -servers + ¸ÞÀϸµ¸®½ºÆ®´Â Áú¹®¿¡ ´ëÇÑ ´äÀ» ã±â¿¡ ÈǸ¢ÇÑ Àå¼Ò´Ù. http://www.hwg.org/lists/hwg-servers/¿¡¼­ ´õ ¸¹Àº °ÍÀ» + ¾Ë ¼ö ÀÖ´Ù.

    + +

    ±×¸®°í ¹°·Ð CGI ÇÁ·Î±×·¥ µ¿ÀÛ¿¡ ´ëÇÑ ¸ðµç ³»¿ëÀ» ¼³¸íÇÑ + CGI ±Ô¾àÀ» Àоî¾ß ÇÒÁöµµ ¸ð¸¥´Ù. NCSA¿¡ + ¿øº» ¹®¼­°¡ ÀÖ°í, ¼öÁ¤ÇÑ ÃʾÈÀº Common Gateway Interface + RFC ÇÁ·ÎÁ§Æ®¿¡ ÀÖ´Ù.

    + +

    ¸ÞÀϸµ¸®½ºÆ®³ª ´º½º±×·ì¿¡ ÇöÀç °Ý°í ÀÖ´Â CGI ¹®Á¦¿¡ ´ëÇØ + Áú¹®ÇÒ¶§´Â ¹ß»ýÇÑ Çö»ó°ú ¿ø·¡ ±â´ëÇÑ °á°ú, ½ÇÁ¦·Î ¹ß»ýÇÑ + Çö»óÀÌ ¾î¶»°Ô ´Ù¸¥Áö, »ç¿ëÇÏ´Â ¼­¹ö, CGI ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ + ¾ð¾î, °¡´ÉÇϸé ÇØ´ç Äڵ带 ÀÚ¼¼È÷ Àû¾î¶ó. ±×·¯¸é ÇØ°áÃ¥À» + ã±â ½¬¿öÁø´Ù.

    + +

    ¾ÆÆÄÄ¡ ¼Ò½ºÄڵ尡 À߸øµÇ¾ú´Ù°í È®½ÅÇÏÁö ¾Ê´Â ÇÑ CGI Áú¹®À» + ¾ÆÆÄÄ¡ ¹ö±× µ¥ÀÌÅͺ£À̽º¿¡ ¿Ã¸®¸é Àý´ë·Î + ¾ÈµÈ´Ù.

    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/htaccess.html b/docs/manual/howto/htaccess.html new file mode 100644 index 0000000..1e6a6f0 --- /dev/null +++ b/docs/manual/howto/htaccess.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: htaccess.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: htaccess.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: htaccess.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: htaccess.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: htaccess.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: htaccess.html.pt-br +Content-Language: pt-br +Content-type: text/html; charset=ISO-8859-1 diff --git a/docs/manual/howto/htaccess.html.en b/docs/manual/howto/htaccess.html.en new file mode 100644 index 0000000..fb8861f --- /dev/null +++ b/docs/manual/howto/htaccess.html.en @@ -0,0 +1,465 @@ + + + + + +Apache HTTP Server Tutorial: .htaccess files - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Apache HTTP Server Tutorial: .htaccess files

    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko  | + pt-br 

    +
    + +

    .htaccess files provide a way to make configuration +changes on a per-directory basis.

    +
    + +
    top
    +
    +

    .htaccess files

    + + +
    You should avoid using .htaccess files completely if you have access to + httpd main server config file. Using .htaccess files slows down your Apache http server. + Any directive that you can include in a .htaccess file is better set in a Directory block, as it will have the same effect with better performance.
    +
    top
    +
    +

    What they are/How to use them

    + + +

    .htaccess files (or "distributed configuration files") + provide a way to make configuration changes on a per-directory basis. A + file, containing one or more configuration directives, is placed in a + particular document directory, and the directives apply to that + directory, and all subdirectories thereof.

    + +

    Note:

    +

    If you want to call your .htaccess file something + else, you can change the name of the file using the AccessFileName directive. For example, + if you would rather call the file .config then you + can put the following in your server configuration file:

    + +
    AccessFileName ".config"
    + +
    + +

    In general, .htaccess files use the same syntax as + the main configuration + files. What you can put in these files is determined by the + AllowOverride directive. This + directive specifies, in categories, what directives will be + honored if they are found in a .htaccess file. If a + directive is permitted in a .htaccess file, the + documentation for that directive will contain an Override section, + specifying what value must be in AllowOverride in order for that + directive to be permitted.

    + +

    For example, if you look at the documentation for the AddDefaultCharset + directive, you will find that it is permitted in .htaccess + files. (See the Context line in the directive summary.) The Override line reads + FileInfo. Thus, you must have at least + AllowOverride FileInfo in order for this directive to be + honored in .htaccess files.

    + +

    Example:

    + + + + + + + + + +
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    + +

    If you are unsure whether a particular directive is permitted in a + .htaccess file, look at the documentation for that + directive, and check the Context line for ".htaccess".

    +
    top
    +
    +

    When (not) to use .htaccess files

    + +

    In general, you should only use .htaccess files when + you don't have access to the main server configuration file. There is, + for example, a common misconception that user authentication should + always be done in .htaccess files, and, in more recent years, + another misconception that mod_rewrite directives + must go in .htaccess files. This is simply not the + case. You can put user authentication configurations in the main server + configuration, and this is, in fact, the preferred way to do + things. Likewise, mod_rewrite directives work better, + in many respects, in the main server configuration.

    + +

    .htaccess files should be used in a case where the + content providers need to make configuration changes to the server on a + per-directory basis, but do not have root access on the server system. + In the event that the server administrator is not willing to make + frequent configuration changes, it might be desirable to permit + individual users to make these changes in .htaccess files + for themselves. This is particularly true, for example, in cases where + ISPs are hosting multiple user sites on a single machine, and want + their users to be able to alter their configuration.

    + +

    However, in general, use of .htaccess files should be + avoided when possible. Any configuration that you would consider + putting in a .htaccess file, can just as effectively be + made in a <Directory> section in your main server + configuration file.

    + +

    There are two main reasons to avoid the use of + .htaccess files.

    + +

    The first of these is performance. When AllowOverride + is set to allow the use of .htaccess files, httpd will + look in every directory for .htaccess files. Thus, + permitting .htaccess files causes a performance hit, + whether or not you actually even use them! Also, the + .htaccess file is loaded every time a document is + requested.

    + +

    Further note that httpd must look for .htaccess files + in all higher-level directories, in order to have a full complement of + directives that it must apply. (See section on how + directives are applied.) Thus, if a file is requested out of a + directory /www/htdocs/example, httpd must look for the + following files:

    + +

    + /.htaccess
    + /www/.htaccess
    + /www/htdocs/.htaccess
    + /www/htdocs/example/.htaccess +

    + +

    And so, for each file access out of that directory, there are 4 + additional file-system accesses, even if none of those files are + present. (Note that this would only be the case if + .htaccess files were enabled for /, which + is not usually the case.)

    + +

    In the case of RewriteRule directives, in + .htaccess context these regular expressions must be + re-compiled with every request to the directory, whereas in main + server configuration context they are compiled once and cached. + Additionally, the rules themselves are more complicated, as one must + work around the restrictions that come with per-directory context + and mod_rewrite. Consult the Rewrite Guide for more + detail on this subject.

    + +

    The second consideration is one of security. You are permitting + users to modify server configuration, which may result in changes over + which you have no control. Carefully consider whether you want to give + your users this privilege. Note also that giving users less + privileges than they need will lead to additional technical support + requests. Make sure you clearly tell your users what level of + privileges you have given them. Specifying exactly what you have set + AllowOverride to, and pointing them + to the relevant documentation, will save yourself a lot of confusion + later.

    + +

    Note that it is completely equivalent to put a .htaccess + file in a directory /www/htdocs/example containing a + directive, and to put that same directive in a Directory section + <Directory "/www/htdocs/example"> in your main server + configuration:

    + +

    .htaccess file in /www/htdocs/example:

    + +

    Contents of .htaccess file in + /www/htdocs/example

    AddType text/example ".exm"
    +
    + +

    Section from your httpd.conf + file

    <Directory "/www/htdocs/example">
    +    AddType text/example ".exm"
    +</Directory>
    +
    + +

    However, putting this configuration in your server configuration + file will result in less of a performance hit, as the configuration is + loaded once when httpd starts, rather than every time a file is + requested.

    + +

    The use of .htaccess files can be disabled completely + by setting the AllowOverride + directive to none:

    + +
    AllowOverride None
    + +
    top
    +
    +

    How directives are applied

    + +

    The configuration directives found in a .htaccess file + are applied to the directory in which the .htaccess file + is found, and to all subdirectories thereof. However, it is important + to also remember that there may have been .htaccess files + in directories higher up. Directives are applied in the order that they + are found. Therefore, a .htaccess file in a particular + directory may override directives found in .htaccess files + found higher up in the directory tree. And those, in turn, may have + overridden directives found yet higher up, or in the main server + configuration file itself.

    + +

    Example:

    + +

    In the directory /www/htdocs/example1 we have a + .htaccess file containing the following:

    + +
    Options +ExecCGI
    + + +

    (Note: you must have "AllowOverride Options" in effect + to permit the use of the "Options" directive in + .htaccess files.)

    + +

    In the directory /www/htdocs/example1/example2 we have + a .htaccess file containing:

    + +
    Options Includes
    + + +

    Because of this second .htaccess file, in the directory + /www/htdocs/example1/example2, CGI execution is not + permitted, as only Options Includes is in effect, which + completely overrides any earlier setting that may have been in + place.

    + +

    Merging of .htaccess with the main + configuration files

    + +

    As discussed in the documentation on Configuration Sections, + .htaccess files can override the <Directory> sections for + the corresponding directory, but will be overridden by other types + of configuration sections from the main configuration files. This + fact can be used to enforce certain configurations, even in the + presence of a liberal AllowOverride setting. For example, to + prevent script execution while allowing anything else to be set in + .htaccess you can use:

    + +
    <Directory "/www/htdocs">
    +    AllowOverride All
    +</Directory>
    +
    +<Location "/">
    +    Options +IncludesNoExec -ExecCGI
    +</Location>
    + + +
    This example assumes that your DocumentRoot is /www/htdocs.
    + + +
    top
    +
    +

    Authentication example

    + +

    If you jumped directly to this part of the document to find out how + to do authentication, it is important to note one thing. There is a + common misconception that you are required to use + .htaccess files in order to implement password + authentication. This is not the case. Putting authentication directives + in a <Directory> + section, in your main server configuration file, is the preferred way + to implement this, and .htaccess files should be used only + if you don't have access to the main server configuration file. See above for a discussion of when you should and should + not use .htaccess files.

    + +

    Having said that, if you still think you need to use a + .htaccess file, you may find that a configuration such as + what follows may work for you.

    + +

    .htaccess file contents:

    + +
    AuthType Basic
    +AuthName "Password Required"
    +AuthUserFile "/www/passwords/password.file"
    +AuthGroupFile "/www/passwords/group.file"
    +Require group admins
    + + +

    Note that AllowOverride AuthConfig must be in effect + for these directives to have any effect.

    + +

    Please see the authentication tutorial for a + more complete discussion of authentication and authorization.

    +
    top
    +
    +

    Server Side Includes example

    + +

    Another common use of .htaccess files is to enable + Server Side Includes for a particular directory. This may be done with + the following configuration directives, placed in a + .htaccess file in the desired directory:

    + +
    Options +Includes
    +AddType text/html shtml
    +AddHandler server-parsed shtml
    + + +

    Note that AllowOverride Options and AllowOverride + FileInfo must both be in effect for these directives to have any + effect.

    + +

    Please see the SSI tutorial for a more + complete discussion of server-side includes.

    +
    top
    +
    +

    Rewrite Rules in .htaccess files

    +

    When using RewriteRule in +.htaccess files, be aware that the per-directory context +changes things a bit. In particular, rules are taken to be relative to +the current directory, rather than being the original requested URI. +Consider the following examples:

    + +
    # In httpd.conf
    +RewriteRule "^/images/(.+)\.jpg" "/images/$1.png"
    +
    +# In .htaccess in root dir
    +RewriteRule "^images/(.+)\.jpg" "images/$1.png"
    +
    +# In .htaccess in images/
    +RewriteRule "^(.+)\.jpg" "$1.png"
    + + +

    In a .htaccess in your document directory, the leading +slash is removed from the value supplied to RewriteRule, and in the +images subdirectory, /images/ is removed from +it. Thus, your regular expression needs to omit that portion as +well.

    + +

    Consult the mod_rewrite documentation for +further details on using mod_rewrite.

    + +
    top
    +
    +

    CGI example

    + +

    Finally, you may wish to use a .htaccess file to permit + the execution of CGI programs in a particular directory. This may be + implemented with the following configuration:

    + +
    Options +ExecCGI
    +AddHandler cgi-script cgi pl
    + + +

    Alternately, if you wish to have all files in the given directory be + considered to be CGI programs, this may be done with the following + configuration:

    + +
    Options +ExecCGI
    +SetHandler cgi-script
    + + +

    Note that AllowOverride Options and AllowOverride + FileInfo must both be in effect for these directives to have any + effect.

    + +

    Please see the CGI tutorial for a more + complete discussion of CGI programming and configuration.

    + +
    top
    +
    +

    Troubleshooting

    + +

    When you put configuration directives in a .htaccess + file, and you don't get the desired effect, there are a number of + things that may be going wrong.

    + +

    Most commonly, the problem is that AllowOverride is not + set such that your configuration directives are being honored. Make + sure that you don't have a AllowOverride None in effect + for the file scope in question. A good test for this is to put garbage + in your .htaccess file and reload the page. If a server error is + not generated, then you almost certainly have AllowOverride + None in effect.

    + +

    If, on the other hand, you are getting server errors when trying to + access documents, check your httpd error log. It will likely tell you + that the directive used in your .htaccess file is not + permitted.

    + +

    + [Fri Sep 17 18:43:16 2010] [alert] [client 192.168.200.51] /var/www/html/.htaccess: DirectoryIndex not allowed here +

    + +

    This will indicate either that you've used a directive that is + never permitted in .htaccess files, or that you simply + don't have AllowOverride set to + a level sufficient for the directive you've used. Consult the + documentation for that particular directive to determine which is + the case.

    + +

    Alternately, it may tell you that you had a syntax error in your + usage of the directive itself.

    + +

    + [Sat Aug 09 16:22:34 2008] [alert] [client 192.168.200.51] /var/www/html/.htaccess: RewriteCond: bad flag delimiters +

    + +

    In this case, the error message should be specific to the + particular syntax error that you have committed.

    + +
    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko  | + pt-br 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/htaccess.html.es b/docs/manual/howto/htaccess.html.es new file mode 100644 index 0000000..44c5466 --- /dev/null +++ b/docs/manual/howto/htaccess.html.es @@ -0,0 +1,464 @@ + + + + + +Tutorial del Servidor Apache HTTP: Ficheros .htaccess - Servidor HTTP Apache Versión 2.4 + + + + + + + +
    <-
    +

    Tutorial del Servidor Apache HTTP: Ficheros .htaccess

    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + pt-br 

    +
    + +

    Los ficheros .htaccess facilitan una forma de realizar + cambios en la configuración en contexto directorio.

    +
    + +
    top
    +
    +

    Ficheros .htaccess

    + + +
    Debería evitar usar ficheros .htaccess completamente si + tiene acceso al fichero de configuración principal de httpd. Usar ficheros + .htaccess ralentiza su servidor Apache http. Cualquier + directiva que pueda incluir en un fichero .htaccess + estará mejor configurada dentro de una sección + Directory, tendrá el mismo efecto y + mejor rendimiento.
    +
    top
    +
    +

    Qué son/Cómo usarlos

    + + +

    Los ficheros .htaccess (o "ficheros de configuración + distribuida") facilitan una forma de realizar cambios en la configuración + en contexto directorio. Un fichero, que contiene una o más directivas, se + coloca en un documento específico de un directorio, y estas directivas + aplican a ese directorio y todos sus subdirectorios.

    + +

    Nota:

    +

    Si quiere llamar a su fichero .htaccess de otra manera, + puede cambiar el nombre del fichero usando la directiva AccessFileName. Por ejemplo, si usted prefiere + llamar al fichero .config, entonces puede poner lo siguiente + en el fichero de configuración de su servidor:

    + +
    AccessFileName ".config"
    + +
    + +

    Generalmente, los ficheros .htaccess usan la misma sintáxis + que los ficheros de la configuración + principal. Lo que puede utilizar en estos ficheros lo determina la + directiva AllowOverride. Esta directiva + especifica, en categorías, qué directivas tendrán efecto si se encuentran en + un fichero .htaccess. Si se permite una directiva en un fichero + .htaccess, la documentación para esa directiva contendrá una + sección Override, especificando qué valor debe ir en + AllowOverride para que se permita esa + directiva.

    + +

    Por ejemplo, si busca en la documentación la directiva AddDefaultCharset, encontrará que se permite en + ficheros .htaccess. (Vea la línea de Contexto en el sumario de + la directiva.) La línea Override muestra + FileInfo. De este modo, debe tener al menos + AllowOverride FileInfo para que esta directiva se aplique en + ficheros .htaccess.

    + +

    Ejemplo:

    + + + + + + + + + +
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    + +

    Si no está seguro de cuándo, una directiva en concreto, se puede usar en un + fichero .htaccess, consulte la documentación para esa directiva, + y compruebe la línea Context buscando ".htaccess".

    +
    top
    +
    +

    Cuando (no) usar ficheros .htaccess

    + +

    Generalmente, solo debería usar ficheros .htaccess cuando no + tiene acceso al fichero principal de configuración del servidor. Hay, por + ejemplo, una creencia errónea de que la autenticación de usuario debería + hacerse siempre dentro de ficheros .htaccess, y, más recientemente, otra creencia errónea de que las directivas de + mod_rewrite deben ir en ficheros .htaccess. + Esto sencillamente no es el caso. Puede poner las configuraciones de + autenticación de usuario en la configuración principal del servidor, y esto + es de hecho, el método preferido de configurar Apache. Del mismo modo, las + directivas mod_rewrite funcionan mejor, en muchos sentidos, en + el fichero de configuración principal del servidor.

    + +

    Los ficheros .htaccess deberían usarse cuando su proveedor + de contenidos le permite hacer modificaciones de configuración + en contexto directorio, pero usted no tiene acceso de root en el servidor. + En el caso de que el administrador no esté dispuesto a hacer cambios + frecuentes en la configuración, puede que sea necesario permitir a usuarios + individuales realizar estos cambios de configuración en ficheros + .htaccess por ellos mismos. Lo cual ocurre a menudo, por + ejemplo, en casos donde los ISP están albergando múltiples sitios web de + usuario en una sola máquina, y quieren que sus usuarios tengan la + posibilidad de modificar sus configuraciones.

    + +

    Aun así, generalmente, el uso de ficheros .htaccess debería + evitarse cuando sea posible. Cualquier configuración que consideraría poner + en un fichero .htaccess, puede usarse con la misma efectividad + en una sección <Directory> en el fichero de configuración + del servidor.

    + +

    Hay dos razones para evitar el uso de ficheros .htaccess.

    + +

    La primera es el rendimiento. Cuando AllowOverride + está configurado para permitir el uso de ficheros .htaccess, + httpd buscará ficheros .htaccess en cada directorio. Así, + permitiendo ficheros .htaccess provoca una pérdida de + rendimiento, ¡incluso aunque no los use! Además, los ficheros + .htaccess se cargan cada vez que se solicita un documento.

    + +

    Además tenga en cuenta que httpd debe buscar ficheros + .htaccess en todos los directorios de mayor jerarquía, + para poder terner la lista completa de directivas que debe aplicar. (Vea + la sección sobre Cómo se aplican las directivas.) Así, si + se solicita un fichero de un directorio /www/htdocs/example, + httpd debe buscar los siguientes ficheros:

    + +

    + /.htaccess
    + /www/.htaccess
    + /www/htdocs/.htaccess
    + /www/htdocs/example/.htaccess +

    + +

    De esta manera, por cada acceso a un fichero de ese directorio, hay 4 + accesos adicionales al sistema de ficheros, incluso si ninguno de esos + ficheros está presente. (Tenga en cuenta que este caso solo se daría si los + ficheros .htaccess están activados en /, que + generalmente no es el caso.).

    + +

    En el caso de las directivas RewriteRule, en el contexto de + .htaccess estas expresiones regulares deben recompilarse con + cada solicitud a ese directorio, cuando en el contexto de configuración del + servidor solo se compilan una vez y se cachean. Adicionalmente, las reglas + en sí mismas son más complicadas, puesto que uno debe sortear las + restricciones que vienen acompañadas del contexto directorio y + mod_rewrite. Consulte la Guía de Rewrite para un mayor + detalle sobre este tema.

    + +

    La segunda consideración es de seguridad. Estará permitiendo que usuarios + modifiquen la configuración del servidor, lo cual puede dar lugar a cambios sobre los que usted no tendrá ningún control. Medite profundamente si debe + dar a sus usuarios ese privilegio. Además tenga en cuenta que dar a los usuarios menos privilegios de los que necesitan dará lugar a más peticiones + de soporte. Asegúrese de que le indica a sus usuarios claramente el nivel de privilegios que les está dando. Especificando exactamente cómo ha + configurado AllowOverride, e invíteles + a revisar la documentación relacionada, lo cual le ahorrará + bastantes confusiones más adelante.

    + +

    Tenga en cuenta que esto es equivalente por completo a poner un fichero + .htaccess en un directorio /www/htdocs/example + con una directiva, y poner la misma directiva en una sección + Directory <Directory "/www/htdocs/example"> en su + configuración principal del servidor:

    + +

    Fichero .htaccess en /www/htdocs/example:

    + +

    Contenido de fichero .htaccess en + /www/htdocs/example

    AddType text/example ".exm"
    +
    + +

    Sección de su fichero httpd.conf

    <Directory "/www/htdocs/example">
    +    AddType text/example ".exm"
    +</Directory>
    +
    + +

    Aun así, poniendo ésta en el fichero de configuración dará como resultado + una menor pérdida de rendimiento, y como la configuración se carga una vez + cuando el httpd arranca, en lugar de cada vez que se solicita un fichero.

    + +

    El uso de ficheros .htaccess puede desactivarse por completo + configurando la directiva AllowOverride + a none:

    + +
    AllowOverride None
    + +
    top
    +
    +

    How directives are applied

    + +

    Las directivas de configuración que se encuentran en el fichero + .htaccess se aplican al directorio en el que el fichero + .htaccess se encuentra, y a todos sus subdirectorios. Sin + embargo, es importante recordar que puede haber otros ficheros + .htaccess en directorios previos. Las directivas se aplican en + el orden en el que se encuentran. Por lo tanto, un fichero + .htaccess puede sobrescribir directivas que se encuentran + en ficheros .htaccess que se encuentran en directorios previos + del árbol de directorios. Y estos, en cambio, pueden haber sobrescrito + directivas que se encontraban más arriba, o en el fichero principal de + configuración del servidor mismo.

    + +

    Ejemplo:

    + +

    En el directorio /www/htdocs/example1 tenemos un fichero + .htaccess que contiene lo siguiente:

    + +
    Options +ExecCGI
    + + +

    (Nota: debe terner "AllowOverride Options" configurado para + permitir el uso de la directiva "Options" en ficheros + .htaccess files.)

    + +

    En el directorio /www/htdocs/example1/example2 tenemos un + fichero .htaccess que contiene:

    + +
    Options Includes
    + + +

    Por este segundo fichero .htaccess, en el directorio + /www/htdocs/example1/example2, la ejecución de CGI execution no + está permitida, porque solo se ha definido Options Includes, + que sobrescribe completamente una configuración previa que se pudiera haber + definido.

    + +

    Incorporando el .htaccess en los ficheros de + configuración principal

    + +

    Como se ha comentado en la documentación en las Secciones de Configuración, los ficheros + .htaccess pueden sobrescribir las secciones <Directory> por el directorio + correspondiente, pero se sobrescribirán por otros tipos de secciones de + configuración de los ficheros de configuración principal. Este hecho se + puede usar para forzar ciertas configuraciones, incluso en presencia + de una configuración laxa de + AllowOverride. Por ejemplo, para + prevenir la ejecución de un script mientras se permite cualquier otra cosa + en .htaccess puede usar:

    + +
    <Directory "/www/htdocs">
    +    AllowOverride All
    +</Directory>
    +
    +<Location "/">
    +    Options +IncludesNoExec -ExecCGI
    +</Location>
    + + +
    Este ejemplo asume que su DocumentRoot es /www/htdocs.
    + + +
    top
    +
    +

    Ejemplo de Autenticación

    + +

    Si saltó directamente a esta parte del documento para averiguar como + hacer la autenticación, es important que tenga en cuenta una cosa. Hay una + creencia errónea de que necesita usar ficheros .htaccess para + configurar autenticación con contraseña. Este no es el caso. Colocar las + directivas de autenticación en una sección + <Directory>, en su fichero + de configuración principal, es el método recomendado para configurar esto, + y los ficheros .htaccess deberían usarse solamente si no tiene + acceso al fichero de configuración principal del servidor. Vea más arriba una explicación de cuando debería y cuando no + debería usar ficheros .htaccess.

    + +

    Dicho esto, si todavía cree que debe usar el fichero + .htaccess, podrá ver que una configuración como la que sigue + podría servirle.

    + +

    Contenido del fichero .htaccess:

    + +
    AuthType Basic
    +AuthName "Password Required"
    +AuthUserFile "/www/passwords/password.file"
    +AuthGroupFile "/www/passwords/group.file"
    +Require group admins
    + + +

    Tenga en cuenta que AllowOverride AuthConfig debe estar + habilitado para que estas directivas tengan algún efecto.

    + +

    Por favor vea el tutorial de autenticación para + una explicación más completa de la autenticación y la autorización.

    +
    top
    +
    +

    Ejemplo de Server Side Includes

    + +

    Otro uso común de ficheros .htaccess es activar Server Side + Includes para un directorio en particular. Esto puede hacerse + con las siguientes directivas de configuración, colocadas en un fichero + .htaccess y el directorio deseado:

    + +
    Options +Includes
    +AddType text/html "shtml"
    +AddHandler server-parsed shtml
    + + +

    Tenga en cuenta que AllowOverride Options y + AllowOverride FileInfo deben estar activadas para que estas + directivas tengan efecto.

    + +

    Por favor vea el tutorial de SSI para una + explicación más completa de server-side includes.

    +
    top
    +
    +

    Reglas de Rewrite en ficheros .htaccess

    +

    Cuando use RewriteRule en + ficheros .htaccess, tenga en cuenta que el contexto + directorio cambia las cosas un poco. En concreto, las reglas son + relativas al directorio actual, en lugar de serlo de la petición de URI + solicitada originalmente. + Considere los siguientes ejemplos:

    + +
    # En httpd.conf
    +RewriteRule "^/images/(.+)\.jpg" "/images/$1.png"
    +
    +# En .htaccess en el directorio raíz
    +RewriteRule "^images/(.+)\.jpg" "images/$1.png"
    +
    +# En .htaccess en images/
    +RewriteRule "^(.+)\.jpg" "$1.png"
    + + +

    En un .htaccess en cualquier directorio del DocumentRoot, la + barra ("/") inicial se elimina del valor facilitado a RewriteRule, y en el subdirectorio + images, se elimina /images/ también de este valor. + Así, su expresión regular necesita omitir también esa parte.

    + +

    Consulte la documentación de mod_rewrite para + más detalles al usar mod_rewrite.

    + +
    top
    +
    +

    Ejemplo de CGI

    + +

    Finalmente, puede que quiera usar un fichero .htaccess para + permitir la ejecución de programas CGI en un directorio en particular. Esto + se puede implementar con la siguiente configuración:

    + +
    Options +ExecCGI
    +AddHandler cgi-script "cgi" "pl"
    + + +

    Alternativamente, si quiere considerar como programas CGI todos los + ficheros de un directorio concreto, esto se puede conseguir con la siguiente + configuración:

    + +
    Options +ExecCGI
    +SetHandler cgi-script
    + + +

    Tenga en cuenta que AllowOverride Options y + AllowOverride FileInfo deben estar ambas activadas para que + estas directivas tengan efecto.

    + +

    Por favor vea el tutorial CGI para mayor detalle + sobre programación y configuración de CGI.

    + +
    top
    +
    +

    Resolución de problemas

    + +

    Cuando pone directivas en un fichero .htaccess y no obtiene + el efecto deseado hay una serie de cosas que pueden haber ido mal.

    + +

    El problema más común es que AllowOverride + no está configurada para que sus directivas puedan surtir + efecto. Asegúrese de que no tiene AllowOverride None + configurado para el directorio en cuestión. Una buena forma de probar esto + es poner "basura" en su fichero .htaccess y recargar la página. + Si no se genera un error en el servidor, casi seguro que tiene configurado + AllowOverride None.

    + +

    Si, por otro lado, obtiene errores de servidor al intentar acceder a + documentos, compruebe el log de errores de httpd. Seguramente le indiquen + que la directiva en uso en su fichero .htaccess no está + permitida.

    + +

    + [Fri Sep 17 18:43:16 2010] [alert] [client 192.168.200.51] /var/www/html/.htaccess: DirectoryIndex not allowed here +

    + +

    Esto indicará que o bien ha usado una directiva que no se permite nunca + en ficheros .htaccess, o que simplementa no tiene + AllowOverride configurado + a un nivel suficiente para la directiva que ha usado. Consulte la + documentación para esa directiva en particular para determinar cual es el + caso.

    + +

    Alternativamente, puede que le indique que hay un error de sintaxis en + el uso de la propia directiva.

    + +

    + [Sat Aug 09 16:22:34 2008] [alert] [client 192.168.200.51] /var/www/html/.htaccess: RewriteCond: bad flag delimiters +

    + +

    En este caso, el mensaje de error debería ser específico para el error de + sintaxis concreto que ha cometido.

    + +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + pt-br 

    +
    top

    Comentarios

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/htaccess.html.fr.utf8 b/docs/manual/howto/htaccess.html.fr.utf8 new file mode 100644 index 0000000..edc0e4d --- /dev/null +++ b/docs/manual/howto/htaccess.html.fr.utf8 @@ -0,0 +1,512 @@ + + + + + +Tutoriel du serveur HTTP Apache : fichiers .htaccess - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Tutoriel du serveur HTTP Apache : fichiers .htaccess

    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko  | + pt-br 

    +
    + +

    Les fichiers .htaccess fournissent une méthode pour +modifier la configuration du serveur au niveau de chaque répertoire.

    +
    + +
    top
    +
    +

    Fichiers .htaccess

    + + +
    Les fichiers .htaccess ne doivent être utilisés + que si vous n'avez pas accès au fichier de configuration du serveur + principal. L'utilisation des fichiers .htaccess + ralentit le fonctionnement de votre serveur HTTP Apache. Il est toujours + préférable de définir les directives que vous pouvez inclure dans un + fichier .htaccess dans une section Directory, car elles produiront le + même effet avec de meilleures performances.
    +
    top
    +
    +

    Que sont ce fichiers, comment les utiliser ?

    + + +

    Les fichiers .htaccess (ou "fichiers de + configuration distribués") fournissent une méthode pour modifier la + configuration du serveur au niveau d'un répertoire. Un fichier, + contenant une ou plusieurs directives de configuration, est placé + dans un répertoire de documents particulier, et ses directives + s'appliquent à ce répertoire et à tous ses sous-répertoires.

    + +

    Note :

    +

    Si vous voulez donner un autre nom à votre fichier + .htaccess, vous pouvez le faire en utilisant la + directive AccessFileName. Par + exemple, si vous préférez nommer votre fichier + .config, vous pouvez mettre ceci dans le fichier de + configuration de votre serveur :

    + +
    AccessFileName ".config"
    + +
    + +

    En général, les fichiers .htaccess utilisent la même + syntaxe que les fichiers de + configuration principaux. Ce que vous pouvez mettre dans ces + fichier est déterminé par la directive AllowOverride. Cette directive spécifie, + sous forme de catégories, quelles directives seront traitées si + elles se trouvent dans un fichier .htaccess. Si une + directive est permise dans un fichier .htaccess file, + la documentation de cette directive contiendra une section Override, + spécifiant quelle valeur doit prendre AllowOverride pour que cette directive + soit traitée.

    + +

    Par exemple, si vous regardez la documentation de la directive + AddDefaultCharset, vous verrez + que cette dernière est permise dans les fichiers + .htaccess (Voir la ligne de contexte dans le résumé de + la directive). La ligne Override indique + FileInfo. Vous devez donc avoir au moins + AllowOverride FileInfo pour que cette directive soit + traitée dans les fichiers .htaccess.

    + +

    Exemple :

    + + + + + + + + + +
    Contexte :configuration du serveur, serveur virtuel, directory, .htaccess
    Override:FileInfo
    + +

    Si vous n'êtes pas sûr qu'une directive particulière soit permise + dans un fichier .htaccess, lisez la documentation de + cette directive, et consultez la ligne de contexte pour + ".htaccess".

    +
    top
    +
    +

    Quand doit-on (ne doit-on pas) utiliser + les fichiers .htaccess ?

    + +

    En principe, vous ne devriez utiliser les fichiers + .htaccess que lorsque vous n'avez pas accès au fichier de + configuration du serveur principal. Par exemple, la fausse + idée + selon laquelle l'authentification de l'utilisateur devrait toujours + être faite dans les fichiers .htaccess est très + répandue. Il est aussi souvent avancé, ces dernières + années, que les directives de mod_rewrite doivent + être définies dans les fichiers .htaccess. Ceci est + tout simplement faux. Vous pouvez configurer + l'authentification des utilisateurs au niveau de la configuration du + serveur principal, et c'est en fait cette méthode qui doit être + privilégiée. De même, les directives de + mod_rewrite fonctionneront mieux, à de nombreux égards, + dans le contexte du serveur principal.

    + +

    Les fichiers .htaccess ne devraient être utilisés + que dans le cas où les fournisseurs de contenu ont besoin de + modifier la configuration du serveur au niveau d'un répertoire, mais + ne possèdent pas l'accès root sur le système du serveur. Si + l'administrateur du serveur ne souhaite pas effectuer des + modifications de configuration incessantes, il peut être intéressant + de permettre aux utilisateurs isolés d'effectuer eux-mêmes ces + modifications par le biais de fichiers .htaccess. Ceci + est particulièrement vrai dans le cas où le fournisseur d'accès à + Internet héberge de nombreux sites d'utilisateurs sur un seul + serveur, et souhaite que ces utilisateurs puissent modifier + eux-mêmes leurs configurations.

    + +

    Cependant et d'une manière générale, il vaut mieux éviter + d'utiliser les fichiers .htaccess. Tout élément de + configuration que vous pourriez vouloir mettre dans un fichier + .htaccess, peut aussi être mis, et avec la même + efficacité, dans une section <Directory> du fichier de configuration de + votre serveur principal.

    + +

    Il y a deux raisons principales d'éviter l'utilisation des + fichiers .htaccess.

    + +

    La première est liée aux performances. Lorsque la directive + AllowOverride est définie de + façon à autoriser l'utilisation des fichiers .htaccess, + httpd va rechercher leur présence dans chaque répertoire. Ainsi, + permettre l'utilisation des fichiers .htaccess est déjà + en soi une cause de dégradation des performances, que vous utilisiez + effectivement ces fichiers ou non ! De plus, le fichier + .htaccess est chargé en mémoire chaque fois qu'un + document fait l'objet d'une requête.

    + +

    Notez aussi que httpd doit rechercher les fichiers + .htaccess dans tous les répertoires de niveau + supérieur, afin de rassembler toutes les directives qui s'appliquent + au répertoire courant (Voir la section comment sont + appliquées les directives). Ainsi, si un fichier fait l'objet + d'une requête à partir d'un répertoire + /www/htdocs/exemple, httpd doit rechercher les + fichiers suivants :

    + +

    + /.htaccess
    + /www/.htaccess
    + /www/htdocs/.htaccess
    + /www/htdocs/exemple/.htaccess +

    + +

    En conséquence, chaque accès à un fichier de ce répertoire + nécessite 4 accès au système de fichiers supplémentaires pour + rechercher des fichiers .htaccess, même si + aucun de ces fichiers n'est présent. Notez que cet exemple ne peut + se produire que si les fichiers .htaccess ont été + autorisés pour le répertoire /, ce qui est rarement le + cas.

    + +

    La seconde raison d'éviter l'utilisation des fichiers + .htaccess est liée à la sécurité. Si vous permettez aux + utilisateurs de modifier la configuration du serveur, il peut en + résulter des conséquences sur lesquelles vous n'aurez aucun + contrôle. Réfléchissez bien avant de donner ce privilège à vos + utilisateurs. Notez aussi que ne pas donner aux utilisateurs les + privilèges dont ils ont besoin va entraîner une augmentation des + demandes de support technique. Assurez-vous d'avoir informé + clairement vos utilisateurs du niveau de privilèges que vous leur + avez attribué. Indiquer exactement comment vous avez défini la + directive AllowOverride et + diriger les utilisateurs vers la documentation correspondante vous + évitera bien des confusions ultérieures.

    + +

    Notez que mettre un fichier .htaccess contenant une + directive dans un répertoire /www/htdocs/exemple + revient exactement au même que mettre la même directive dans une + section Directory <Directory "/www/htdocs/exemple"> + du fichier de configuration de votre serveur principal :

    + +

    Fichier .htaccess dans + /www/htdocs/exemple :

    + +

    Contenu du fichier .htaccess dans + /www/htdocs/exemple

    AddType text/example ".exm"
    +
    + +

    Section de votre fichier + httpd.conf

    <Directory "/www/htdocs/example">
    +    AddType text/example .exm
    +</Directory>
    +
    + +

    Cependant, la perte de performances sera moindre si vous + définissez cette directive dans la configuration de + votre serveur principal, car cette dernière ne sera chargée qu'une + seule fois au moment du démarrage du serveur, alors qu'elle le sera + à chaque accès dans le cas d'un fichier .htaccess.

    + +

    L'utilisation des fichiers .htaccess peut être + entièrement désactivée en définissant la directive AllowOverride à none :

    + +
    AllowOverride None
    + +
    top
    +
    +

    Comment sont appliquées les directives ?

    + +

    Les directives de configuration situées dans un fichier + .htaccess s'appliquent au répertoire dans lequel ce + fichier .htaccess se trouve, ainsi qu'à tous ses + sous-répertoires. Cependant, il est important de garder à l'esprit + qu'il peut y avoir des fichiers .htaccess dans les + répertoires de niveau supérieur. Les directives sont appliquées + selon l'ordre dans lequel elles sont rencontrées. Ainsi, les + directives d'un fichier .htaccess situé dans un + répertoire particulier peuvent écraser les directives se trouvant + dans des fichiers .htaccess situés à un niveau + supérieur dans l'arborescence des répertoires. Et ces dernières + peuvent elles-mêmes avoir écrasé des directives d'un fichier + .htaccess situé à un niveau encore plus haut, ou dans + le fichier de configuration du serveur principal.

    + +

    Exemple :

    + +

    Dans le répertoire /www/htdocs/exemple1 se trouve un + fichier .htaccess contenant ce qui suit :

    + +
    Options +ExecCGI
    + + +

    Note : "AllowOverride Options" doit être présent + pour permettre l'utilisation de la directive "Options" dans les fichiers + .htaccess.

    + +

    Dans le répertoire /www/htdocs/exemple1/exemple2 se + trouve un fichier .htaccess contenant ce qui suit + :

    + +
    Options Includes
    + + +

    Ainsi, à cause de ce second fichier .htaccess du + répertoire /www/htdocs/exemple1/exemple2, l'exécution + des CGI est interdite, car la dernière définition d'options + Options Includes écrase toute autre définition + d'options d'un fichier .htaccess situé dans un + répertoire de niveau supérieur.

    + +

    Interactions entre les fichiers .htaccess + et les fichiers de configuration du serveur principal

    + +

    Comme indiqué dans la documentation sur les Sections de configuration, les fichiers + .htaccess peuvent écraser les directives des sections + <Directory> pour + le répertoire correspondant, mais peuvent eux-mêmes être écrasés + par d'autres types de sections des fichiers de la + configuration principale. Cette possibilité peut s'avérer utile pour + forcer certaines configurations, même en cas de présence de l'option + libérale AllowOverride. Par + exemple, pour interdire l'exécution de scripts en autorisant la + définition de toute autre option dans les fichiers + .htaccess, vous pouvez utiliser :

    + +
    <Directory "/www/htdocs">
    +    AllowOverride All
    +</Directory>
    +
    +<Location "/">
    +    Options +IncludesNoExec -ExecCGI
    +</Location>
    + + +
    Dans cet exemple, on considère que le chemin défini par la + directive DocumentRoot est + /www/htdocs.
    + + +
    top
    +
    +

    Exemple d'authentification

    + +

    Si vous accédez directement à ce point du document pour apprendre + à effectuer une authentification, il est important de noter ceci. Il + existe une fausse idée selon laquelle il serait nécessaire + d'utiliser les fichiers .htaccess pour implémenter + l'authentification par mot de passe. Ceci est tout simplement faux. + Pour y parvenir, il est préférable de mettre les directives + d'authentification dans une section <Directory> du fichier de configuration de + votre serveur principal, et les fichiers .htaccess ne + devraient être utilisés que dans le cas où vous n'avez pas accès au + fichier de configuration du serveur principal. Voir ci-dessus pour savoir dans quels cas vous devez ou + ne devez pas utiliser les fichiers .htaccess.

    + +

    Ceci étant dit, si vous pensez que vous devez quand-même utiliser + un fichier .htaccess, vous pouvez utiliser la + configuration suivante :

    + +

    Contenu du fichier .htaccess :

    + +
    AuthType Basic
    +AuthName "Password Required"
    +AuthUserFile "/www/passwords/password.file"
    +AuthGroupFile "/www/passwords/group.file"
    +Require group admins
    + + +

    Notez que AllowOverride AuthConfig doit être présent + pour que ces directives produisent leur effet.

    + +

    Vous pouvez vous référer au tutoriel sur + l'authentification pour une description plus détaillée de + l'authentification et de l'autorisation.

    +
    top
    +
    +

    Exemple d'Inclusion Côté Serveur (Server Side +Includes - SSI)

    + +

    Les fichiers .htaccess sont aussi couramment + utilisés pour activer les SSI pour un répertoire particulier. Pour y + parvenir, on utilise les directives de configuration suivantes, + placées dans un fichier .htaccess enregistré dans le + répertoire considéré :

    + +
    Options +Includes
    +AddType text/html shtml
    +AddHandler server-parsed shtml
    + + +

    Notez que AllowOverride Options et AllowOverride + FileInfo doivent être tous les deux présents pour que ces + directives puissent produire leur effet.

    + +

    Vous pouvez vous référer au tutoriel SSI + pour une description plus détaillée des SSI.

    +
    top
    +
    +

    Les règles de réécriture dans les fichiers .htaccess

    +

    Sivous utilisez des directives RewriteRule dans un fichier +.htaccess, gardez à l'esprit que les choses sont légèrement +différentes dans un contexte de répertoire. En particulier, les règles +sont relatives au répertoire courant, et non à l'URI original. Considérez +les exemples suivants :

    + +
    # Dans httpd.conf
    +RewriteRule "^/images/(.+)\.jpg" "/images/$1.png"
    +
    +# Dans un fichier .htaccess situé dans le répertoire racine de vos
    +# documents
    +RewriteRule "^images/(.+)\.jpg" "images/$1.png"
    +
    +# Dans un fichier .htaccess situé dans le répertoire images/
    +RewriteRule "^(.+)\.jpg" "$1.png"
    + + +

    On voit que si le fichier .htaccess se situe à la racine +de vos documents, le slash de tête est supprimé de la valeur de +remplacement spécifiée pour la règle RewriteRule, et que si le fichier +.htaccess se situe dans le répertoire images, +la chaîne /images/ disparaît de cette même valeur de +remplacement. Il doit donc en être de même dans votre expression +rationnelle.

    + +

    Veuillez vous référer à cette documentation +pour une étude détaillée de l'utilisation du module +mod_rewrite.

    + +
    top
    +
    +

    Exemple de CGI

    + +

    En fin de compte, vous avez décidé d'utiliser un fichier + .htaccess pour permettre l'exécution des programmes CGI + dans un répertoire particulier. Pour y parvenir, vous pouvez + utiliser la configuration suivante :

    + +
    Options +ExecCGI
    +AddHandler cgi-script cgi pl
    + + +

    Alternativement, si vous souhaitez que tous les fichiers d'un + répertoire donné soient considérés comme des programmes CGI, vous + pouvez utiliser la configuration suivante :

    + +
    Options +ExecCGI
    +SetHandler cgi-script
    + + +

    Notez que AllowOverride Options et AllowOverride + FileInfo doivent être tous les deux présents pour que ces + directives puissent produire leur effet.

    + +

    Vous pouvez vous référer au tutoriel CGI + pour une description plus détaillée de la configuration et de la + proprammation CGI.

    + +
    top
    +
    +

    Résolution des problèmes

    + +

    De nombreuses raisons peuvent être à l'origine du fait que + les directives que vous avez mises dans un fichier + .htaccess ne produisent pas l'effet désiré.

    + +

    Le plus souvent, le problème vient du fait que la définition de + la directive AllowOverride + ne permet pas l'activation des directives de votre fichier + .htaccess. Vérifiez si une directive + AllowOverride None n'affecte pas le répertoire où se + trouve votre fichier. Un bon test consiste à mettre des directives + dont la syntaxe est erronée dans votre ficher .htaccess + et de recharger la page. Si aucune erreur n'est générée par le + serveur, il est pratiquement certain qu'une directive + AllowOverride None affecte votre répertoire.

    + +

    Par contre, si vous obtenez des erreurs de serveur lorsque vous + tentez d'accéder à des documents, consultez votre journal des + erreurs de httpd. Il vous indiquera probablement que la directive + utilisée dans votre fichier .htaccess n'est pas + permise.

    + +

    + [Fri Sep 17 18:43:16 2010] [alert] [client 192.168.200.51] /var/www/html/.htaccess: DirectoryIndex not allowed here +

    +

    Cela signifie soit que vous utilisez une directive qui n'est + jamais permise dans les fichiers .htaccess, soit + que vous n'avez tout simplement pas défini la directive + AllowOverride à un niveau + suffisant pour la directive que vous utilisez. Consultez la + documentation de cette directive pour déterminer quel cas + s'applique.

    + +

    Le journal des erreurs peut aussi vous signaler une erreur de + syntaxe dans l'usage de la directive elle-même.

    + +

    + [Sat Aug 09 16:22:34 2008] [alert] [client 192.168.200.51] /var/www/html/.htaccess: RewriteCond: bad flag delimiters +

    + +

    Dans ce cas, le message d'erreur sera spécifique à l'erreur + de syntaxe que vous avez commise.

    +
    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko  | + pt-br 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/htaccess.html.ja.utf8 b/docs/manual/howto/htaccess.html.ja.utf8 new file mode 100644 index 0000000..b4d183d --- /dev/null +++ b/docs/manual/howto/htaccess.html.ja.utf8 @@ -0,0 +1,417 @@ + + + + + +Apache ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«: .htaccess ファイル - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    Apache ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«: .htaccess ファイル

    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko  | + pt-br 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + +

    .htaccess ファイルã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ¯Žã«è¨­å®šã‚’変更ã™ã‚‹æ–¹æ³•ã‚’ +æä¾›ã—ã¾ã™ã€‚

    +
    + +
    top
    +
    top
    +
    +

    .htaccess ファイルã¨ã¯ä½•ã‹/ãã®ä½¿ã„æ–¹

    + + +

    .htaccess ファイル (「分散設定ファイルã€) 㯠+ ディレクトリ毎ã«è¨­å®šã‚’変更ã™ã‚‹æ–¹æ³•ã‚’æä¾›ã—ã¾ã™ã€‚ディレクティブ㮠+ 書ã‹ã‚ŒãŸãƒ•ァイルをディレクトリã«ç½®ãã“ã¨ã§ã€ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ãã® + サブディレクトリã™ã¹ã¦ã«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã‚’é©ç”¨ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    注:

    +

    .htaccess ファイルを別ã®åå‰ã«ã—ãŸã„å ´åˆã¯ã€ + AccessFileName ディレクティブを + 使ã£ã¦å¤‰æ›´ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚例ãˆã°ã€ãã®ãƒ•ァイルを .config + ã¨ã„ã†åå‰ã«ã—ãŸã„å ´åˆã¯ã€ä»¥ä¸‹ã®è¨­å®šã‚’サーãƒè¨­å®šãƒ•ァイルã«å…¥ã‚Œã‚‹ã“ã¨ãŒ + ã§ãã¾ã™:

    + +

    + AccessFileName .config +

    +
    + +

    一般ã«ã€.htaccess ãƒ•ã‚¡ã‚¤ãƒ«ã®æ§‹æ–‡ã¯ + 主設定ファイル + ã¨åŒã˜ã§ã™ã€‚ã“れらã®ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãã“ã¨ã®ã§ãるディレクティブ㯠AllowOverride ディレクティブã«ã‚ˆã‚Šæ±ºã¾ã‚Šã¾ã™ã€‚ + ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã¯ã€.htaccess ファイル㫠+ 書ã‹ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã®ä¸­ã§ã€ã€ + ã©ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ãŒé©ç”¨ã•れるã‹ã‚’カテゴリーå˜ä½ã§æŒ‡å®šã—ã¾ã™ã€‚ + .htaccess ã«æ›¸ãã“ã¨ã®ã§ãるディレクティブã§ã‚れã°ã€ + 説明文書ã«ã¯ã€Œä¸Šæ›¸ãã€ã¨ã„ã†é …ç›®ãŒã‚りã€.htaccess ã«æ›¸ãã“ã¨ãŒã§ãるよã†ã« + ãªã‚‹ãŸã‚ã® AllowOverride ã®å€¤ãŒæŒ‡å®šã•れã¦ã„ã¾ã™ã€‚

    + +

    例ãˆã°ã€AddDefaultCharset ディレクティブã®èª¬æ˜Žã‚’ + 見るã¨ã€.htaccess ファイルã§ã®ä½¿ç”¨ãŒè¨±å¯ã•れã¦ã„ã‚‹ã“ã¨ãŒ + ã‚ã‹ã‚Šã¾ã™ã€‚ (ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã®æ¦‚è¦ã®æ‰€ã«ã‚る「コンテキストã€ã¨æ›¸ã‹ã‚Œã¦ã„ã‚‹ + 行を見ã¦ãã ã•ã„。) 上書ãã¨æ›¸ã‹ã‚Œã¦ã„る行ã«ã¯ + FileInfo ã¨ã‚りã¾ã™ã€‚ã§ã™ã‹ã‚‰ã€.htaccess 中㮠+ ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ãŒæœ‰åйã«ãªã‚‹ãŸã‚ã«ã¯ã€å°‘ãªãã¨ã‚‚ + AllowOverride FileInfo ãŒè¨­å®šã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚

    + +

    例:

    + + + + + + + + + +
    コンテキスト:サーãƒè¨­å®šãƒ•ァイル,ãƒãƒ¼ãƒãƒ£ãƒ«ãƒ›ã‚¹ãƒˆ,ディレクトリ,.htaccess
    上書ã:FileInfo
    + +

    ã‚るディレクティブを .htaccess ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãã“ã¨ãŒã§ãã‚‹ã‹ + ã©ã†ã‹ã‚ã‹ã‚‰ãªã„ã¨ãã¯ã€ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã®èª¬æ˜Žã‚’探ã—ã¦ã€".htaccess" + ã®ãŸã‚ã®ã€Œã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€ã®è¡Œã‚’調ã¹ã¦ãã ã•ã„。

    +
    top
    +
    +

    ã„㤠.htaccess ファイルを使ã†(使ã‚ãªã„)ã‹ã€‚

    + +

    一般的ã«ã€ã‚µãƒ¼ãƒã®ä¸»è¨­å®šãƒ•ァイルã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªã„å ´åˆã‚’除ã„ã¦ã€ + .htaccess ファイルã®ä½¿ç”¨ã¯æ¥µåŠ›é¿ã‘ã¦ãã ã•ã„。 + 世ã®ä¸­ã«ã¯ã€ä¾‹ãˆã°ã€ãƒ¦ãƒ¼ã‚¶èªè¨¼ã¯å¸¸ã« .htaccess ファイル㧠+ 行ãªã‚ãªã‘れã°ãªã‚‰ãªã„ã€ã¨ã„ã†èª¤è§£ãŒåºƒã¾ã£ã¦ã„ã¾ã™ãŒã€ã¾ã£ãŸããã‚“ãªã“ã¨ã¯ + ã‚りã¾ã›ã‚“。ユーザèªè¨¼ã®è¨­å®šã¯ã‚µãƒ¼ãƒä¸»è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãã“ã¨ãŒã§ã〠+ 実際ã€ãã®æ–¹ãŒã‚ˆã‚Šè‰¯ã„設定方法ã§ã™ã€‚

    + +

    .htaccess ファイルã¯ã‚³ãƒ³ãƒ†ãƒ³ãƒ„æä¾›è€…ãŒãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ¯Žã® + 設定を行ãªã„ãŸã„ã‘れã©ã€ã‚µãƒ¼ãƒã‚·ã‚¹ãƒ†ãƒ ã® root アクセス権é™ã‚’æŒã£ã¦ã„ãªã„ + ã¨ã„ã†å ´åˆã«ã®ã¿ä½¿ã†ã¹ãã‚‚ã®ã§ã™ã€‚サーãƒç®¡ç†è€…ãŒé »ç¹ã«è¨­å®šå¤‰æ›´ã‚’行ãªã„ãŸã㯠+ ãªã„ã€ã¨ã„ã†ã¨ãã«ã¯å€‹ã€…ã®ãƒ¦ãƒ¼ã‚¶ãŒ .htaccess ファイルを使ã£ã¦ + 自分ã§è¨­å®šã®å¤‰æ›´ã‚’行ãªã†ã“ã¨ã‚’許å¯ã—ãŸæ–¹ãŒè‰¯ã„ã¨ãã‚‚ã‚ã‚‹ã§ã—ょã†ã€‚ + ã“れã¯ç‰¹ã«ã€ISP ãŒè¤‡æ•°ã®ãƒ¦ãƒ¼ã‚¶ã®ã‚µã‚¤ãƒˆã‚’一ã¤ã®ãƒžã‚·ãƒ³ã§ãƒ›ã‚¹ãƒˆã—ã¦ã„ã¦ã€ + å„ユーザãŒè¨­å®šã®å¤‰æ›´ã‚’ã§ãるよã†ã«ã—ãŸã„よã†ãªã¨ãã«ã‚ã¦ã¯ã¾ã‚Šã¾ã™ã€‚

    + +

    ã—ã‹ã—ã€æ™®é€šã¯å¯èƒ½ã§ã‚れ㰠.htaccess ファイルã®ä½¿ç”¨ã¯ + é¿ã‘ã¦ãã ã•ã„。.htaccess ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã“ã†ã¨è€ƒãˆã‚‹ã‚ˆã†ãª + ã™ã¹ã¦ã®è¨­å®šã¯ã€ã‚µãƒ¼ãƒã®ä¸»è¨­å®šãƒ•ァイル㮠<Directory> セクションã§åŒã˜ã‚ˆã†ã«è¡Œãªã†ã“ã¨ãŒ + ã§ãã¾ã™ã€‚

    + +

    .htaccess ファイルã®ä½¿ç”¨ã‚’é¿ã‘ã‚‹ç†ç”±ã¯ä¸»ã«äºŒã¤ã‚りã¾ã™ã€‚

    + +

    一ã¤ç›®ã¯ã‚µãƒ¼ãƒã®æ€§èƒ½ã®å•題ã§ã™ã€‚AllowOverride ディレクティブ㌠+ .htaccess ファイルã®è¨­å®šã‚’許å¯ã—ã¦ã„ã‚‹å ´åˆã¯ã€Apache 㯠+ å„ディレクトリ㧠.htaccess ファイルを探ã—ã¾ã™ã€‚ + ã§ã™ã‹ã‚‰ã€.htaccess ファイルを許å¯ã™ã‚‹ã¨ã€å®Ÿéš›ã«ä½¿ç”¨ã—ã¦ã„ã‚‹ã‹ + ã©ã†ã‹ã«é–¢ã‚らãšã€æ€§èƒ½ã®ä½Žä¸‹ã‚’æ‹›ãã“ã¨ã«ãªã‚Šã¾ã™! ã¾ãŸã€.htaccess + ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ–‡æ›¸ãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã•れる度ã«èª­ã¿è¾¼ã¾ã‚Œã¾ã™ã€‚

    + +

    ã•らã«ã€Apache ã¯é©ç”¨ã™ã¹ãディレクティブを集ã‚ã‚‹ãŸã‚ã«ã€ã™ã¹ã¦ã® + 上ä½ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã® .htaccess ファイルを探ã™å¿…è¦ãŒã‚ã‚‹ã“ã¨ã«ã‚‚ + 注æ„ã—ã¦ãã ã•ã„。(ディレクティブãŒé©ç”¨ã•れる方法を + å‚ç…§ã—ã¦ãã ã•ã„。)ã§ã™ã‹ã‚‰ã€/www/htdocs/example ã«ã‚ã‚‹ + ファイルãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã•れãŸã¨ãã¯ã€Apache ã¯ä»¥ä¸‹ã®ãƒ•ァイルを調ã¹ã¾ã™ã€‚

    + +

    + /.htaccess
    + /www/.htaccess
    + /www/htdocs/.htaccess
    + /www/htdocs/example/.htaccess +

    + +

    ã§ã™ã‹ã‚‰ã€ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãれãžã‚Œã®ãƒ•ァイルã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã«å¯¾ã—ã¦ã€ + 上ã®ä¾‹ã®ãƒ•ァイルãŒã¾ã£ãŸã存在ã—ãªã„ã¨ãã§ã‚‚ã€è¿½åŠ ã®ãƒ•ァイルシステム㮠+ アクセスãŒè¡Œãªã‚れるã“ã¨ã«ãªã‚Šã¾ã™ã€‚(ã“れã¯ã€.htaccess ㌠+ / ã«å¯¾ã—ã¦æœ‰åйã«ãªã£ã¦ã„ã‚‹ã¨ãã®å ´åˆã§ã€æ™®é€šã¯ãã†ãªã£ã¦ + ã„ãªã„ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。)

    + +

    二ã¤ç›®ã¯ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã§ã™ã€‚ユーザã«ã‚µãƒ¼ãƒã®è¨­å®šã‚’変更ã™ã‚‹ã“ã¨ã‚’ + 許å¯ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã®ã§ã€ã‚ãªãŸè‡ªèº«ãŒç®¡ç†ã§ããªã„変更をã•れる + æã‚ŒãŒã‚りã¾ã™ã€‚ユーザã«ã“ã®ç‰¹æ¨©ã‚’与ãˆã‚‹ã®ãŒè‰¯ã„ã®ã‹ã©ã†ã‹ã€å分 + 検討ã—ã¦ãã ã•ã„。ã¾ãŸã€ãƒ¦ãƒ¼ã‚¶ã«ä¸Žãˆã‚‹æ¨©é™ãŒå¿…è¦ãªã‚‚ã®ã‚ˆã‚Šã‚‚å°‘ãªã™ãŽã‚‹ã¨ã€ + ä½™åˆ†ãªæŠ€è¡“ã‚µãƒãƒ¼ãƒˆå ±å‘Šã‚’å—ã‘å–るよã†ã«ãªã‚‹å¯èƒ½æ€§ãŒé«˜ã„ã“ã¨ã«ã‚‚ + 注æ„ã—ã¦ãã ã•ã„。確実ã«ã€ãƒ¦ãƒ¼ã‚¶ã«ã©ã®ç¨‹åº¦ã®æ¨©é™ã‚’与ãˆãŸã‹æ˜Žç¢ºã«å‘Šã’るよã†ã« + ã—ã¦ãã ã•ã„。AllowOverride ã« + 何を設定ã—ãŸã‹ã¨ã„ã†ã“ã¨ã¨ã€é–¢é€£ã™ã‚‹æ–‡æ›¸ã‚’示ã™ã“ã¨ã§ã€ + å¾Œã€…ã®æ··ä¹±ã‚’ãã£ã¨æ¸›ã‚‰ã™ã“ã¨ãŒ + ã§ãã¾ã™ã€‚

    + +

    ã¨ã“ã‚ã§ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã®æ›¸ã‹ã‚ŒãŸ .htaccess ã‚’ + /www/htdocs/example ã«ç½®ãã“ã¨ã¨ã€åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã‚’ + 主サーãƒè¨­å®šã® Directory セクション + <Directory /www/htdocs/example> ã«æ›¸ãã“ã¨ã¯ + 完全ã«ç­‰ä¾¡ã§ã™:

    + +

    /www/htdocs/example 㮠.htaccess ファイル:

    + +

    /www/htdocs/example 㮠.htaccess ファイル㮠+ 内容

    + AddType text/example .exm +

    + +

    httpd.conf ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ + file

    + <Directory /www/htdocs/example>
    + + AddType text/example .exm
    +
    + </Directory> +

    + +

    ã—ã‹ã—ã€ã“ã®è¨­å®šã¯ã‚µãƒ¼ãƒè¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã„ãŸæ–¹ãŒãƒ‘フォーマンス㮠+ 低下ãŒå°‘ãªããªã‚Šã¾ã™ã€‚ファイルãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã•れる度㫠+ 読ã¿è¾¼ã¾ã‚Œã‚‹ä»£ã‚りã«ã€Apache ã®èµ·å‹•時㫠1 回ã ã‘読ã¿è¾¼ã‚ã° + よããªã‚‹ã‹ã‚‰ã§ã™ã€‚

    + +

    AllowOverride ディレクティブ㮠+ 値を none ã«è¨­å®šã™ã‚‹ã“ã¨ã§ .htaccess ファイル + ã®ä½¿ç”¨ã‚’完全ã«ç„¡åйã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    + AllowOverride None +

    +
    top
    +
    +

    ディレクティブã®é©ç”¨ã®ã•れ方

    + +

    .htaccess ファイルã®è¨­å®šãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–㯠.htaccess + ファイルã®å­˜åœ¨ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ã€ãã®ã‚µãƒ–ディレクトリã™ã¹ã¦ã«é©ç”¨ã•れã¾ã™ã€‚ + ã—ã‹ã—ã€ä¸Šã®éšŽå±¤ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚‚ .htaccess ファイル㌠+ 存在ã™ã‚‹ã‹ã‚‚ã—れãªã„ã“ã¨ã‚’覚ãˆã¦ãŠãã“ã¨ã¯å¤§åˆ‡ã§ã™ã€‚ディレクティブã¯ç¾ã‚Œã‚‹ + 順番ã«é©ç”¨ã•れã¾ã™ã€‚ã§ã™ã‹ã‚‰ã€ã‚るディレクトリ㮠.htaccess 㯠+ ディレクトリツリーã®ã‚ˆã‚Šä¸Šã®éšŽå±¤ã® .htaccess ファイル㮠+ 設定を上書ãã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。ãã—ã¦ã€ãã® .htaccess ã‚‚ + より上ã®éšŽå±¤ã§æ›¸ã‹ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–を上書ãã—ãŸã‚Šã€ä¸»ã‚µãƒ¼ãƒè¨­å®šãƒ•ァイル + ãã®ã‚‚ã®ã®è¨­å®šã‚’上書ãã—ãŸã‚Šã—ã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。

    + +

    例:

    + +

    ディレクトリ /www/htdocs/example1 ã«ä»¥ä¸‹ã®å†…容㮠+ .htaccess ファイルãŒã‚りã¾ã™:

    + +

    + Options +ExecCGI +

    + +

    (注: .htaccess + ファイル㧠"Options" ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ãŒæœ‰åйã«ãªã‚‹ãŸã‚ã«ã¯ã€ + "AllowOverride Options" を有効ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚)

    + +

    ディレクトリ /www/htdocs/example1/example2 ã«ã¯ + 以下ã®ã‚ˆã†ãª .htaccess ファイルãŒã‚りã¾ã™:

    + +

    + Options Includes +

    + +

    二ã¤ã‚ã® .htaccess ã«ã‚ˆã‚Šã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª + /www/htdocs/example1/example2 ã§ã¯ CGI ã®å®Ÿè¡Œã¯ + 許å¯ã•れã¾ã›ã‚“。ã“れã¯ã€Options Includes ã®ã¿ãŒ + 効力をæŒã¡ã€ãれãŒã™ã¹ã¦ã®ä»¥å‰ã®è¨­å®šã‚’上書ãã™ã‚‹ã‹ã‚‰ã§ã™ã€‚

    + +

    メイン設定ファイルã«å¯¾ã™ã‚‹ + .htaccess ã®ãƒžãƒ¼ã‚¸

    + +

    As discussed in the documentation on Configuration Sections, + .htaccess files can override the <Directory> sections for + the corresponding directory, but will be overriden by other types + of configuration sections from the main configuration files. This + fact can be used to enforce certain configurations, even in the + presence of a liberal AllowOverride setting. For example, to + prevent script execution while allowing anything else to be set in + .htaccess you can use:

    +

    セクションã®è¨­å®š + ã«è¨˜è¼‰ã•れã¦ã„るよã†ã«ã€.htaccess ファイルを使ã£ã¦ + <Directory> + セクションã®è¨­å®šã‚’ディレクトリ毎ã«ä¸Šæ›¸ãã§ãã¾ã™ãŒã€ + メイン設定ファイル中ã«ã‚ã‚‹ã€ä»–ã®ç¨®é¡žã®è¨­å®šã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ã‚ˆã£ã¦ + ã•らã«ä¸Šæ›¸ãã•れるã“ã¨ã‚‚ã‚りã¾ã™ã€‚ + ã“ã®ç‰¹å¾´ã‚’使ã£ã¦ã€ + AllowOverride + ã§è‡ªç”±åº¦ã®é«˜ã„設定ãŒã‚ã£ãŸã¨ã—ã¦ã‚‚ã€ã‚る特定ã®è¨­å®šãŒç¢ºå®Ÿã« + åæ˜ ã•れるよã†ã«ã§ãã¾ã™ã€‚例ãˆã°ã€CGI スクリプトã®å®Ÿè¡Œã¯ + ä¸è¨±å¯ã«ã€ã‹ã¤ã€.htaccess ã§ãã®ä»–ã®é …目㯠+ 設定ã§ãるよã†ã«ã€ã¨ã„ã†å ´åˆã¯æ¬¡ã®ã‚ˆã†ã«ã§ãã¾ã™ :

    + +

    +<Directory />
    + +Allowoverride All
    +
    +</Directory>
    +
    +<Location />
    + +Options +IncludesNoExec -ExecCGI
    +
    +</Location> +

    + + +
    top
    +
    +

    èªè¨¼ã®ä¾‹

    + +

    ã‚‚ã—èªè¨¼ã®æ–¹æ³•を知るãŸã‚ã«ã“ã®éƒ¨åˆ†ã«ç›´æŽ¥æ¥ãŸã®ã§ã‚れã°ã€æ¬¡ã®ã“ã¨ã‚’ + 知ã£ã¦ãŠãã“ã¨ãŒé‡è¦ã§ã™ã€‚よãã‚る誤解ã«ã€ãƒ‘スワードèªè¨¼ã‚’行ãªã†ãŸã‚ã«ã¯ + .htaccess ファイルを使ã†å¿…è¦ãŒã‚ã‚‹ã€ã¨ã„ã†ã‚‚ã®ãŒã‚りã¾ã™ã€‚ + ã“ã‚Œã¯æ­£ã—ãã‚りã¾ã›ã‚“。主サーãƒè¨­å®šãƒ•ァイル㮠<Directory> セクション㫠+ èªè¨¼ç”¨ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã‚’æ›¸ãæ–¹ãŒæŽ¨å¥¨ã•れる方法ã§ã€.htaccess + ファイルã¯ä¸»ã‚µãƒ¼ãƒè¨­å®šãƒ•ァイルを変更ã§ããªã„ã¨ãã«ã®ã¿ä½¿ç”¨ã™ã¹ãã§ã™ã€‚ + ã„㤠.htaccess ファイルを使ã†ã¹ãã§ã€ã„ã¤ä½¿ã†ã¹ãã§ã¯ãªã„ã‹ã« + ã¤ã„ã¦ã¯ 上をå‚ç…§ã—ã¦ãã ã•ã„。

    + +

    以上ã®ã“ã¨ã‚’ãµã¾ãˆãŸä¸Šã§ã€ã‚‚ã— .htaccess ã®ä½¿ç”¨ãŒ + ã¾ã å¿…è¦ã ã¨æ€ã†å ´åˆã¯ã€æ¬¡ã®ã‚ˆã†ãªã‚‚ã®ãŒæœ›ã¿ã®ã“ã¨ã‚’ã—ã¦ãれるã‹ã‚‚ + ã—れã¾ã›ã‚“。

    + +

    .htaccess ファイルã®å†…容:

    + +

    + AuthType Basic
    + AuthName "Password Required"
    + AuthUserFile /www/passwords/password.file
    + AuthGroupFile /www/passwords/group.file
    + Require Group admins +

    + +

    ã“れらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ãŒæœ‰åйã«ãªã‚‹ãŸã‚ã«ã¯ã€ + AllowOverride AuthConfig ãŒæœ‰åйã§ãªãã¦ã¯ãªã‚‰ãªã„ã“ã¨ã« + 注æ„ã—ã¦ãã ã•ã„。

    + +

    èªè¨¼ã¨æ‰¿èªã«ã¤ã„ã¦ã¯ èªè¨¼ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’ + å‚ç…§ã—ã¦ãã ã•ã„。

    +
    top
    +
    +

    SSI ã®ä¾‹

    + +

    ã‚‚ã†ä¸€ã¤ã® .htaccess ファイルã®ã‚ˆãã‚る利用法㯠+ 特定ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ SSI を有効ã«ã™ã‚‹ã“ã¨ã§ã™ã€‚ã“れã¯ã€æœ›ã¿ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã® + .htaccess ファイルã«ä»¥ä¸‹ã®è¨­å®šãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–を書ãã“ã¨ã§ + 锿ˆã§ãã¾ã™:

    + +

    + Options +Includes
    + AddType text/html shtml
    + AddHandler server-parsed shtml +

    + +

    ã“れらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ãŒæœ‰åйã«ãªã‚‹ãŸã‚ã«ã¯ã€ + AllowOverride Options 㨠AllowOverride + FileInfo ãŒæœ‰åйã«ãªã£ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。

    + +

    よりã¾ã¨ã¾ã£ãŸ SSI ã®èª¬æ˜Žã¯ SSI ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’ + å‚ç…§ã—ã¦ãã ã•ã„。

    +
    top
    +
    +

    CGI ã®ä¾‹

    + +

    最後ã«ã€ç‰¹å®šã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ CGI プログラムã®å®Ÿè¡Œã‚’許å¯ã—ãŸã„ã“ã¨ãŒ + ã‚ã‚‹ã§ã—ょã†ã€‚ã“れã¯ä»¥ä¸‹ã®è¨­å®šã§è¡Œãªã†ã“ã¨ãŒã§ãã¾ã™:

    + +

    + Options +ExecCGI
    + AddHandler cgi-script cgi pl +

    + +

    ã‚‚ã—ãã¯ã€ã‚るディレクトリã®ã™ã¹ã¦ã®ãƒ•ァイル㌠CGI プログラム㨠+ ã¿ãªã•れるよã†ã«ã—ãŸã„ãªã‚‰ã€ä»¥ä¸‹ã®è¨­å®šã§å®Ÿç¾ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:

    + +

    + Options +ExecCGI
    + SetHandler cgi-script +

    + +

    ã“れらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ãŒæœ‰åйã«ãªã‚‹ãŸã‚ã«ã¯ã€ + AllowOverride Options 㨠AllowOverride + FileInfo ãŒæœ‰åйã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。

    + +

    CGI プログラムã¨è¨­å®šã®ã‚ˆã‚Šã¾ã¨ã¾ã£ãŸèª¬æ˜Žã¯ CGI ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

    + +
    top
    +
    +

    å•題解決

    + +

    設定ディレクティブを .htaccess ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã„ãŸã‘れã©ã‚‚〠+ 期待ã—ãŸåŠ¹æžœãŒå¾—られãªã„ã¨ãã«ã¯ã€ã„ãã¤ã‹ã®åŽŸå› ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚

    + +

    一番よãã‚ã‚‹ã“ã¨ã¯ã€è¨­å®šãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ãŒè€ƒæ…®ã•れるよã†ã«ã¯ + AllowOverride ãŒè¨­å®šã•れã¦ã„ãªã„ + ã¨ã„ã†ã‚‚ã®ã§ã™ã€‚該当ã®ãƒ•ァイルã®ã‚¹ã‚³ãƒ¼ãƒ—ã« AllowOverride None + ãŒè¨­å®šã•れã¦ã„ãªã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。ã“れを調ã¹ã‚‹ãŸã‚ã®è‰¯ã„方法ã¯ã€ + .htaccess ファイルã«ã”ã¿ã‚’書ã„ã¦ã€ãƒªãƒ­ãƒ¼ãƒ‰ã™ã‚‹ã“ã¨ã§ã™ã€‚ + サーãƒã®ã‚¨ãƒ©ãƒ¼ãŒç”Ÿæˆã•れãªã„ã¨ãã¯ã€ã»ã¼ç¢ºå®Ÿã« AllowOverride + None ãŒè¨­å®šã•れã¦ã„る状態ã«ãªã£ã¦ã„ã¾ã™ã€‚

    + +

    ãã†ã§ã¯ãªãã€æ–‡æ›¸ã‚’アクセスã—よã†ã¨ã—ãŸã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¦ã„ã‚‹ + ã¨ãã¯ã€Apache ã®ã‚¨ãƒ©ãƒ¼ãƒ­ã‚°ã‚’調ã¹ã¦ãã ã•ã„。.htaccess ファイル㧠+ 使用ã•れãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ãŒè¨±å¯ã•れã¦ã„ãªã„ã€ã¨ã„ã†ã“ã¨ã‚’知らã›ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒé«˜ã„ã§ã™ã€‚ã¾ãŸã¯ã€æ§‹æ–‡ã®é–“é•ã„ãŒã‚ã‚‹ã“ã¨ã‚’è¿°ã¹ã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 + ãã®å ´åˆã«ã¯ã¾ãšãれを修正ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚

    + +
    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko  | + pt-br 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/htaccess.html.ko.euc-kr b/docs/manual/howto/htaccess.html.ko.euc-kr new file mode 100644 index 0000000..0e9716a --- /dev/null +++ b/docs/manual/howto/htaccess.html.ko.euc-kr @@ -0,0 +1,363 @@ + + + + + +¾ÆÆÄÄ¡ ÅõÅ丮¾ó: .htaccess ÆÄÀÏ - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡ ÅõÅ丮¾ó: .htaccess ÆÄÀÏ

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + pt-br 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + +

    .htaccess ÆÄÀÏÀ» »ç¿ëÇÏ¿© µð·ºÅ丮º°·Î ¼³Á¤À» +º¯°æÇÒ ¼ö ÀÖ´Ù.

    +
    + +
    top
    +
    top
    +
    +

    ¹«¾ùÀ̸ç/¾î¶»°Ô »ç¿ëÇϴ°¡

    + + +

    .htaccess ÆÄÀÏ(ȤÀº "ºÐ»ê ¼³Á¤ÆÄÀÏ")À» + »ç¿ëÇÏ¸é µð·ºÅ丮º°·Î ¼³Á¤À» º¯°æÇÒ ¼ö ÀÖ´Ù. ¿©·¯ ¼³Á¤ Áö½Ã¾î°¡ + ÀÖ´Â ÆÄÀÏÀ» ƯÁ¤ ¹®¼­ µð·ºÅ丮¿¡ µÎ¸é, ±× µð·ºÅ丮¿Í ¸ðµç + ÇÏÀ§µð·ºÅ丮¿¡ Áö½Ã¾î¸¦ Àû¿ëÇÑ´Ù.

    + +

    ÁÖÀÇ:

    +

    .htaccess ÆÄÀϸíÀ» ´Ù¸£°Ô »ç¿ëÇÏ°í ½Í´Ù¸é, + AccessFileName Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© º¯°æÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, .config + ÆÄÀϸíÀ» »ç¿ëÇÏ·Á¸é ¼­¹ö ¼³Á¤ÆÄÀÏ¿¡ ´ÙÀ½°ú °°ÀÌ Ãß°¡ÇÑ´Ù.

    + +

    + AccessFileName .config +

    +
    + +

    ÀϹÝÀûÀ¸·Î .htaccess ÆÄÀÏÀº ÁÖ¼³Á¤ÆÄÀϰú ¹®¹ýÀÌ + °°´Ù. AllowOverride + Áö½Ã¾î°¡ ÀÌ ÆÄÀÏ¿¡ ³ª¿Ã ¼ö ÀÖ´Â ³»¿ëÀ» °áÁ¤ÇÑ´Ù. ÀÌ Áö½Ã¾î´Â + .htaccess ÆÄÀÏ¿¡¼­ Çã¿ëÇÏ´Â Áö½Ã¾î ºÐ·ù¸¦ ÁöÁ¤ÇÑ´Ù. + Áö½Ã¾î¸¦ .htaccess ÆÄÀÏ¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù¸é, + ÇØ´ç Áö½Ã¾î ¹®¼­ÀÇ Override Ç׸ñÀº Áö½Ã¾î¸¦ Çã¿ëÇϱâÀ§ÇØ + AllowOverride¿¡ »ç¿ëÇÒ + °ªÀ» ¾Ë·ÁÁØ´Ù.

    + +

    ¿¹¸¦ µé¾î, AddDefaultCharset + Áö½Ã¾î ¹®¼­¸¦ º¸¸é ÀÌ Áö½Ã¾î¸¦ .htaccess ÆÄÀÏ¿¡¼­ + »ç¿ëÇÒ ¼ö ÀÖ´Ù. (Áö½Ã¾î ¿ä¾à¿¡¼­ »ç¿ëÀå¼Ò Ç׸ñÀ» º¸¶ó.) + Override + ÁÙ¿¡ FileInfo°¡ ÀÖ´Ù. ±×·¡¼­ ÀÌ Áö½Ã¾î¸¦ + .htaccess ÆÄÀÏ¿¡¼­ »ç¿ëÇϱâÀ§Çؼ­´Â ÃÖ¼ÒÇÑ + AllowOverride FileInfo°¡ ÇÊ¿äÇÏ´Ù.

    + +

    ¿¹Á¦:

    + + + + + + + + + +
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override:FileInfo
    + +

    ƯÁ¤ Áö½Ã¾î¸¦ .htaccess ÆÄÀÏ¿¡¼­ »ç¿ëÇÒ + ¼ö ÀÖ´ÂÁö ±Ã±ÝÇϸé Áö½Ã¾î ¹®¼­ÀÇ »ç¿ëÀå¼Ò Ç׸ñ¿¡ ".htaccess"°¡ + ÀÖ´ÂÁö È®ÀÎÇÑ´Ù.

    +
    top
    +
    +

    ¾ðÁ¦ .htaccess ÆÄÀÏÀ» »ç¿ëÇϳª + (ȤÀº »ç¿ëÇÏÁö ¾Ê³ª)

    + +

    ÀϹÝÀûÀ¸·Î ÁÖ¼­¹öÆÄÀÏ¿¡ Á¢±ÙÇÒ ¼ö ¾ø´Â °æ¿ì°¡ ¾Æ´Ï¶ó¸é + .htaccess ÆÄÀÏÀ» »ç¿ëÇÏ¸é ¾ÈµÈ´Ù. ¿¹¸¦ µé¾î, + »ç¿ëÀÚ ÀÎÁõÀÌ Ç×»ó .htaccess ÆÄÀÏ¿¡ ÀÖ¾î¾ß + ÇÑ´Ù´Â °ÍÀº À߸ø ¾Ë·ÁÁø ¿ÀÇØ´Ù. ÀÌ´Â »ç½ÇÀÌ ¾Æ´Ï´Ù. ÁÖ¼­¹ö¼³Á¤¿¡ + »ç¿ëÀÚ ÀÎÁõ ¼³Á¤À» ÀûÀ» ¼ö ÀÖ°í, »ç½Ç ÀÌ·¯±æ ±ÇÇÑ´Ù.

    + +

    .htaccess ÆÄÀÏÀº ÄÁÅÙÃ÷ Á¦°øÀÚ°¡ µð·ºÅ丮º°·Î + ¼­¹ö ¼³Á¤À» ´Ù¸£°ÔÇÏ°í ½ÍÁö¸¸ ¼­¹ö ½Ã½ºÅÛ¿¡ root ±ÇÇÑÀÌ + ¾ø´Â °æ¿ì¿¡ »ç¿ëÇÑ´Ù. ¼­¹ö °ü¸®ÀÚ°¡ ¼³Á¤À» ÀÚÁÖ º¯°æÇϰí + ½ÍÁö ¾ÊÀº °æ¿ì ÀÏ¹Ý »ç¿ëÀÚ°¡ Á÷Á¢ .htaccess + ÆÄÀÏÀ» ¼öÁ¤Çϵµ·Ï Çã¿ëÇÏ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù. ¿¹¸¦ µé¾î, ÇÑ + ÄÄÇ»ÅÍ¿¡ ¿©·¯ »ç¿ëÀÚ »çÀÌÆ®¸¦ ¼­ºñ½ºÇÏ´Â ISP¿¡¼­ »ç¿ëÀÚ°¡ + ÀÚ½ÅÀÇ ¼³Á¤À» º¯°æÇÏ°í ½ÍÀº °æ¿ì°¡ ±×·¯ÇÏ´Ù.

    + +

    ±×·¯³ª ÀϹÝÀûÀ¸·Î .htaccess ÆÄÀÏÀº °¡±ÞÀû + ÇÇÇØ¾ß ÇÑ´Ù. .htaccess ÆÄÀÏ¿¡¼­ Çã¿ëÇÏ´Â Áö½Ã¾î´Â + ÁÖ¼³Á¤ÆÄÀÏÀÇ <Directory> ¼½¼Ç°ú °°Àº È¿°ú°¡ + ÀÖ´Ù.

    + +

    ´ÙÀ½ µÎ°¡Áö Å« ÀÌÀ¯¶§¹®¿¡ .htaccess ÆÄÀÏ + »ç¿ëÀ» ÇÇÇØ¾ß ÇÑ´Ù.

    + +

    ù¹øÂ°´Â ¼º´ÉÀÌ´Ù. AllowOverride°¡ .htaccess + ÆÄÀÏÀ» »ç¿ëÇϵµ·Ï Çã¿ëÇϸé, ¾ÆÆÄÄ¡´Â µð·ºÅ丮¸¶´Ù + .htaccess ÆÄÀÏÀ» ã´Â´Ù. ±×·¡¼­ + .htaccess ÆÄÀÏÀ» Çã¿ëÇÏ¸é ½ÇÁ¦·Î ÆÄÀÏÀ» »ç¿ëÇÏÁö + ¾Ê´Â °æ¿ì¿¡µµ ¼º´ÉÀÌ ¶³¾îÁø´Ù! ¶Ç, .htaccess + ÆÄÀÏÀº ¹®¼­¸¦ ¿äûÇÒ¶§¸¶´Ù ÀоîµéÀδÙ.

    + +

    °Ô´Ù°¡ Àû¿ëÇØ¾ß ÇÏ´Â Àüü Áö½Ã¾î¸¦ ¸ðÀ¸±âÀ§ÇØ ¾ÆÆÄÄ¡´Â + ¸ðµç »óÀ§ µð·ºÅ丮¿¡¼­ .htaccess ÆÄÀÏÀ» ã´Â´Ù. + (¾î¶»°Ô Áö½Ã¾î¸¦ Àû¿ëÇϳª ÀýÀ» Âü°í.) + ±×·¡¼­ /www/htdocs/example µð·ºÅ丮¿¡ ÀÖ´Â + ÆÄÀÏÀ» ¿äûÇϸé, ¾ÆÆÄÄ¡´Â ´ÙÀ½ ÆÄÀϵéÀ» ã¾Æ¾ß ÇÑ´Ù.

    + +

    + /.htaccess
    + /www/.htaccess
    + /www/htdocs/.htaccess
    + /www/htdocs/example/.htaccess +

    + +

    ±×·¡¼­ ±× µð·ºÅ丮¿¡ ÀÖ´Â ÆÄÀÏÀ» Á¢±ÙÇÒ ¶§¸¶´Ù ¼³Á¤ÆÄÀÏÀÌ + ÀüÇô ¾ø¾îµµ ÆÄÀϽýºÅÛÀ» 4¹ø ´õ Á¢±ÙÇØ¾ß ÇÑ´Ù. + (/¿¡¼­µµ .htaccess ÆÄÀÏÀ» Çã¿ëÇÑ + °æ¿ì¸¦ ¸»ÇÑ´Ù. º¸ÅëÀº Çã¿ëÇÏÁö ¾Ê´Â´Ù.)

    + +

    µÎ¹øÂ° ÀÌÀ¯´Â º¸¾ÈÀÌ´Ù. »ç¿ëÀÚ¿¡°Ô ¼­¹ö¼³Á¤ º¯°æ ±ÇÇÑÀ» + ÁÖ¸é ´ç½ÅÀÌ °¨´çÇÒ ¼ö ¾ø´Â º¯È­°¡ ÀϾ ¼ö ÀÖ´Ù. »ç¿ëÀÚ¿¡°Ô + ÀÌ·± ±ÇÇÑÀ» ÁÙÁö °õ°õÀÌ »ý°¢Ç϶ó. ¶Ç, »ç¿ëÀÚ°¡ ¿øÇÏ´Â °Íº¸´Ù + ÀûÀº ±ÇÇÑÀ» ÁÖ¸é ±â¼úÁö¿ø¿äûÀÌ µé¾î¿Â´Ù. »ç¿ëÀÚ¿¡°Ô °¡´ÉÇÑ + ±ÇÇÑ ¼öÁØÀ» ¸íÈ®È÷ ¾Ë·Á¶ó. »ç¿ëÀÚ¿¡°Ô AllowOverride¸¦ ¾î¶»°Ô ¼³Á¤ÇÏ¿´´ÂÁö + Á¤È®È÷ ¾Ë¸®°í °ü·Ã ¹®¼­¸¦ Á¦°øÇÏ¸é ¾ÕÀ¸·Î È¥¶õÀ» ÇÇÇÒ ¼ö + ÀÖ´Ù.

    + +

    Áö½Ã¾î¸¦ /www/htdocs/example µð·ºÅ丮ÀÇ + .htaccess ÆÄÀÏÀ» µÎ´Â °Í°ú ÁÖ¼­¹ö¼³Á¤ÀÇ + <Directory /www/htdocs/example> Directory + ¼³Á¤¿¡ µÎ´Â °ÍÀº ¿ÏÀüÈ÷ °°´Ù.

    + +

    /www/htdocs/example¿¡ ÀÖ´Â + .htaccess ¼½¼Ç:

    + +

    /www/htdocs/example¿¡ ÀÖ´Â + .htaccess ÆÄÀÏ ³»¿ë

    + AddType text/example .exm +

    + +

    httpd.conf ÆÄÀÏ¿¡ ÀÖ´Â ¼½¼Ç

    + <Directory /www/htdocs/example>
    + + AddType text/example .exm
    +
    + </Directory> +

    + +

    ±×·¯³ª ÆÄÀÏÀ» ¿äûÇÒ ¶§¸¶´Ù ¼³Á¤À» ÀÐÁö¾Ê°í ¾ÆÆÄÄ¡°¡ + ½ÃÀÛÇÒ¶§ Çѹø¸¸ ¼³Á¤À» Àб⶧¹®¿¡ °°Àº ¼³Á¤À» ¼­¹ö¼³Á¤ÆÄÀÏ¿¡ + »ç¿ëÇÏ¸é ¼º´ÉÀÌ ´õ ºü¸£´Ù.

    + +

    AllowOverride Áö½Ã¾î¸¦ + noneÀ¸·Î ¼³Á¤Çϸé .htaccess ÆÄÀÏÀ» + ¿ÏÀüÈ÷ »ç¿ëÇÒ ¼ö ¾ø´Ù.

    + +

    + AllowOverride None +

    +
    top
    +
    +

    ¾î¶»°Ô Áö½Ã¾î¸¦ Àû¿ëÇϳª

    + +

    .htaccess ÆÄÀÏÀ» ¹ß°ßÇÑ µð·ºÅ丮¿Í ±× µð·ºÅ丮ÀÇ + ¸ðµç ÇÏÀ§µð·ºÅ丮¿¡ .htaccess ÆÄÀÏ¿¡ ÀÖ´Â ¼³Á¤ + Áö½Ã¾î¸¦ Àû¿ëÇÑ´Ù. ±×·¡¼­ »óÀ§µð·ºÅ丮ÀÇ .htaccess + ÆÄÀÏÀ» ÁÖÀÇÇØ¾ß ÇÑ´Ù. ¹ß°ßÇÑ ¼ø¼­·Î Áö½Ã¾î¸¦ Àû¿ëÇÑ´Ù. ƯÁ¤ + µð·ºÅ丮¿¡ ÀÖ´Â .htaccess ÆÄÀÏÀº »óÀ§µð·ºÅ丮¿¡ + ÀÖ´Â .htaccess ÆÄÀÏÀÇ Áö½Ã¾î¸¦ ¹«È¿·Î ¸¸µé + ¼ö ÀÖ°í, »óÀ§µð·ºÅ丮¿¡ ÀÖ´Â Áö½Ã¾î´Â ´õ »óÀ§µð·ºÅ丮 ȤÀº + ÁÖ¼³Á¤ÆÄÀÏ¿¡ ÀÖ´Â Áö½Ã¾î¸¦ ¹«È¿·Î ¸¸µé ¼ö ÀÖ´Ù.

    + +

    ¿¹Á¦:

    + +

    /www/htdocs/example1 µð·ºÅ丮¿¡ ´ÙÀ½°ú °°Àº + .htaccess ÆÄÀÏÀÌ ÀÖ´Ù.

    + +

    + Options +ExecCGI +

    + +

    (ÁÖÀÇ: .htaccess ÆÄÀÏ¿¡ "Options" Áö½Ã¾î¸¦ »ç¿ëÇÏ·Á¸é + "AllowOverride Options"°¡ ÇÊ¿äÇÏ´Ù.)

    + +

    /www/htdocs/example1/example2 µð·ºÅ丮¿¡´Â + ´ÙÀ½°ú °°Àº .htaccess ÆÄÀÏÀÌ ÀÖ´Ù.

    + +

    + Options Includes +

    + +

    ÀÌ µÎ¹øÂ° .htaccess ÆÄÀÏÀÇ + Options Includes°¡ ÀÌÀü ¼³Á¤À» ¿ÏÀüÈ÷ ¹«È¿·Î + ¸¸µé±â¶§¹®¿¡ /www/htdocs/example1/example2 + µð·ºÅ丮´Â CGI ½ÇÇàÀ» Çã¿ëÇÏÁö ¾Ê´Â´Ù.

    +
    top
    +
    +

    ÀÎÁõ ¿¹Á¦

    + +

    ÀÎÁõ ¹æ¹ýÀ» ¾Ë±âÀ§ÇØ ¹Ù·Î À̰÷ºÎÅÍ Àд´ٸé ÁÖÀÇÇÒ °ÍÀÌ + ÀÖ´Ù. ¾ÏÈ£ ÀÎÁõÀ» ÇÏ·Á¸é .htaccess ÆÄÀÏÀÌ + ÇÊ¿äÇÏ´Ù´Â ¿ÀÇØ°¡ ³Î¸® ÆÛÁ®ÀÖ´Ù. ÀÌ´Â »ç½ÇÀÌ ¾Æ´Ï´Ù. + ÁÖ¼³Á¤ÆÄÀÏÀÇ <Directory> ¼½¼Ç¿¡ ÀÎÁõ Áö½Ã¾î¸¦ + µÎ´Â °ÍÀÌ ´õ ±ÇÀåÇÏ´Â ¹æ¹ýÀ̰í, ¼­¹öÀÇ ÁÖ¼³Á¤ÆÄÀÏÀ» ¼öÁ¤ÇÒ + ¼ö ¾ø´Â °æ¿ì¿¡¸¸ .htaccess ÆÄÀÏÀ» »ç¿ëÇØ¾ß + ÇÑ´Ù. ¾ðÁ¦ .htaccess ÆÄÀÏÀ» »ç¿ëÇØ¾ß ÇÏ´ÂÁö¿Í + »ç¿ëÇÏÁö ¸»¾Æ¾ß ÇÏ´ÂÁö´Â À§¿¡¼­ + ¼³¸íÇÏ¿´´Ù.

    + +

    ¾Õ¿¡¼­ ¸»ÇßÁö¸¸ ¾ÆÁ÷µµ .htaccess ÆÄÀÏÀÌ + ÇÊ¿äÇÏ´Ù°í »ý°¢µÇ¸é ¾Æ·¡ ¼³Á¤ÀÌ µµ¿òÀÌ µÉ °ÍÀÌ´Ù.

    + +

    .htaccess ÆÄÀÏ ³»¿ë.

    + +

    + AuthType Basic
    + AuthName "Password Required"
    + AuthUserFile /www/passwords/password.file
    + AuthGroupFile /www/passwords/group.file
    + Require Group admins +

    + +

    ÀÌ Áö½Ã¾î°¡ µ¿ÀÛÇϱâÀ§Çؼ­´Â + AllowOverride AuthConfig Áö½Ã¾î°¡ ÇÊ¿äÇÔÀ» + ¸í½ÉÇ϶ó.

    + +

    ÀÎÁõ°ú ±ÇÇѺο©¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº ÀÎÁõ + ÅõÅ丮¾óÀ» º¸±æ ¹Ù¶õ´Ù.

    +
    top
    +
    +

    Server Side Includes ¿¹Á¦

    + +

    ¶Ç´Ù¸¥ ÀϹÝÀûÀÎ .htaccess ÆÄÀÏÀÇ ¿ëµµ´Â + ƯÁ¤ µð·ºÅ丮¿¡¼­ Server Side Includes¸¦ °¡´ÉÇÏ°Ô ¸¸µå´Â + °ÍÀÌ´Ù. ¿øÇÏ´Â µð·ºÅ丮ÀÇ .htaccess ÆÄÀÏ¿¡ + ´ÙÀ½°ú °°Àº ¼³Á¤ Áö½Ã¾î¸¦ »ç¿ëÇÏ¸é µÈ´Ù.

    + +

    + Options +Includes
    + AddType text/html shtml
    + AddHandler server-parsed shtml +

    + +

    ÀÌ Áö½Ã¾î°¡ µ¿ÀÛÇÏ·Á¸é AllowOverride Options¿Í + AllowOverride FileInfo°¡ ¸ðµÎ ÇÊ¿äÇÔÀ» ¸í½ÉÇ϶ó.

    + +

    server-side includes¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº SSI ÅõÅ丮¾óÀ» º¸±æ ¹Ù¶õ´Ù.

    +
    top
    +
    +

    CGI ¿¹Á¦

    + +

    ¸¶Áö¸·À¸·Î .htaccess ÆÄÀÏÀ» »ç¿ëÇÏ¿© ƯÁ¤ + µð·ºÅ丮¿¡¼­ CGI ÇÁ·Î±×·¥ ½ÇÇàÀ» Çã¿ëÇÏ°í ½Í´Ù¸é, ´ÙÀ½°ú + °°Àº ¼³Á¤À» »ç¿ëÇÑ´Ù.

    + +

    + Options +ExecCGI
    + AddHandler cgi-script cgi pl +

    + +

    ȤÀº ÀÌ µð·ºÅ丮¿¡ ÀÖ´Â ¸ðµç ÆÄÀÏÀ» CGI ÇÁ·Î±×·¥À¸·Î + ó¸®ÇÏ°í ½Í´Ù¸é ´ÙÀ½°ú °°Àº ¼³Á¤µµ °¡´ÉÇÏ´Ù.

    + +

    + Options +ExecCGI
    + SetHandler cgi-script +

    + +

    ÀÌ Áö½Ã¾î°¡ µ¿ÀÛÇÏ·Á¸é AllowOverride Options¿Í + AllowOverride FileInfo°¡ ¸ðµÎ ÇÊ¿äÇÔÀ» ¸í½ÉÇ϶ó.

    + +

    CGI ÇÁ·Î±×·¡¹Ö°ú ¼³Á¤¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº CGI ÅõÅ丮¾óÀ» º¸±æ ¹Ù¶õ´Ù.

    + +
    top
    +
    +

    ¹®Á¦Çذá

    + +

    .htaccess ÆÄÀÏ¿¡ µÐ ¼³Á¤ Áö½Ã¾î°¡ ¿øÇÏ´Â + ±â´ÉÀ» ÇÏÁö ¾Ê´Â °æ¿ì ¿©·¯°¡Áö ÀÌÀ¯°¡ ÀÖÀ» ¼ö ÀÖ´Ù.

    + +

    °¡Àå ÀϹÝÀûÀÎ ¹®Á¦´Â ¼³Á¤ Áö½Ã¾î¸¦ °¡´ÉÇÏ°Ô ¸¸µå´Â AllowOverride¸¦ ¼³Á¤ÇÏÁö ¾ÊÀº + °æ¿ì´Ù. ¹®Á¦°¡ µÇ´Â ÆÄÀÏ ¿µ¿ª¿¡ AllowOverride NoneÀÌ + ¾ø´ÂÁö È®ÀÎÇÑ´Ù. .htaccess ÆÄÀÏÀ» ¾Æ¹«·¸°Ô³ª + ÀûÀº ´ÙÀ½ ÆäÀÌÁö¸¦ ´Ù½Ã Á¢±ÙÇÏ¿© ½±°Ô °Ë»çÇØº¼ ¼ö ÀÖ´Ù. + ¼­¹ö ¿À·ù°¡ ³ª¿ÀÁö ¾ÊÀ¸¸é °ÅÀÇ È®½ÇÈ÷ + AllowOverride NoneÀ» »ç¿ëÇÑ °æ¿ì´Ù.

    + +

    ¹Ý´ë·Î ¹®¼­¿¡ Á¢±ÙÇÒ¶§ ¼­¹ö ¿À·ù°¡ ¹ß»ýÇÏ¸é ¾ÆÆÄÄ¡ ¿À·ù·Î±×¸¦ + »ìÆìºÁ¶ó. ¾Æ¸¶µµ .htaccess ÆÄÀÏ¿¡ ÀÖ´Â Áö½Ã¾î¸¦ + Çã¿ëÇÏÁö ¾Ê´Â´Ù°í ÇÒ °ÍÀÌ´Ù. ¾Æ´Ï°í ¹®¹ý ¿À·ù°¡ ÀÖ´Ù¸é ¿À·ù¸¦ + °íÄ£´Ù.

    + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + pt-br 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/htaccess.html.pt-br b/docs/manual/howto/htaccess.html.pt-br new file mode 100644 index 0000000..f11bf87 --- /dev/null +++ b/docs/manual/howto/htaccess.html.pt-br @@ -0,0 +1,407 @@ + + + + + +Tutorial do Apache: arquivos .htaccess - Servidor HTTP Apache Versão 2.4 + + + + + + + +
    <-
    +

    Tutorial do Apache: arquivos .htaccess

    +
    +

    Línguas Disponíveis:  en  | + es  | + fr  | + ja  | + ko  | + pt-br 

    +
    +
    Esta tradução pode estar desatualizada. + Confira a versão em Inglês para mudanças recentes.
    + +

    Arquivos .htaccess oferecem um meio de fazer mudanças + nas configurações por-diretório.

    +
    + +
    top
    +
    top
    +
    +

    O que eles são/Como usá-los

    + + +

    Os arquivos .htaccess (ou "arquivos de + configuração distribuída") oferecem um meio de fazer mudanças nas + configurações por-diretório. Um arquivo, contendo uma ou mais + diretrizes de configurações, é colocado em um diretório + em particular, e as diretrizes se aplicam para aquele diretório e todos + os seu subdiretórios subseqüentes.

    + +

    Nota:

    +

    Se você quiser renomear o seu arquivo .htaccess + para outro nome, você deve usar a diretriz AccessFileName. Por exemplo, se você + prefere que o arquivo se chame .config, então você + pode adicionar a seguinte linha ao seu arquivo de configuração + do servidor:

    + +

    + AccessFileName .config +

    +
    + +

    No geral, arquivos .htaccess usam a mesma sintaxe + que os arquivos de + configuração principal. O que você pode colocar nesses + arquivos é determinado pele diretriz AllowOverride. Essa diretriz especifica, + em categorias, quais diretrizes serão aceitas caso sejam + encontradas em um arquivo .htaccess. Se uma diretriz + for permitida em um arquivo .htaccess, a documentação + para essa diretriz irá conter uma seção Override, + especificando que valor precisa estar em AllowOverride para que esta diretriz + seja permitida.

    + +

    Por exemplo, se você procurar na documentação pela diretriz + AddDefaultCharset, você + achará que ela é permitida nos arquivos .htaccess. + (Veja a linha Contexto no sumário das diretivas.) A + linha Override lê + FileInfo. Então, você deve ao menos ter + AllowOverride FileInfo para que essa diretriz seja + aceita nos arquivos .htaccess.

    + +

    Exemplo:

    + + + + + + + + + +
    Contexto:configuração do servidor, hospedeiros virtuais, diretório, .htaccess
    Override:FileInfo
    + +

    Se você estiver incerto se uma diretriz em particular é + aceita em um arquivo .htaccess, procure na + documentação por essa diretriz, e verifique a linha de + Contexto por ".htaccess".

    top
    +
    +

    Quando (não) usar arquivos .htaccess

    + +

    No geral, você nunca deve usar arquivos .htaccess + a não ser que você não tenha acesso ao arquivo de configuração + principal do servidor. Existe, por exemplo, um erro de concepção + que dita que a autenticação de usuários sempre deve + ser feita usando os arquivos .htaccess. Esse + simplesmente não é o caso. Você pode usar as configurações de + autenticação de usuário no arquivo de configuração principal do + servidor, e isso é, de fato, a maneira mais adequada de se fazer + as coisas.

    + +

    Arquivos .htaccess devem ser usados em casos onde + os provedores de conteúdo do site precisem fazer mudanças na + configuração do servidor por-diretório, mas não tem + acesso root ao sistema do servidor. Caso o administrador do + servidor não esteja disposto a fazer mudanças freqüentes nas + configurações do servidor, é desejável permitir que os + usuários possam fazer essas mudanças através de arquivos + .htaccess eles mesmos. Isso é particularmente + verdade, por exemplo, em casos onde provedores estão fornecendo + múltiplos sites para usuários em apenas uma máquina, e querem que + seus usuários possam alterar suas configurações.

    + +

    No entanto, de modo geral, o uso de arquivos .htaccess + deve ser evitado quando possível. Quaisquer configurações + que você considerar acrescentar em um arquivo .htaccess, podem + ser efetivamente colocadas em uma seção <Directory> no arquivo principal de + configuração de seu servidor.

    + +

    Existem duas razões principais para evitar o uso de arquivos + .htaccess.

    + +

    A primeira delas é a performance. Quando AllowOverride é configurado para + permitir o uso de arquivos .htaccess, o Apache procura + em todos diretórios por arquivos .htaccess. + Logo, permitir arquivos .htaccess causa um impacto na + performance, mesmo sem você usá-los de fato! Além disso, + o arquivo .htaccess é carregado toda vez que um documento + é requerido.

    + +

    Além disso, note que o Apache precisa procurar pelos arquivos + .htaccess em todos os diretórios superiores, para ter + o complemento total de todas as diretivas que devem ser + aplicadas. (Veja a seção como as diretrizes são + aplicadas.) Então, se um arquivo de um diretório + /www/htdocs/example é requerido, o Apache precisa + procurar pelos seguintes arquivos:

    + +

    + /.htaccess
    + /www/.htaccess
    + /www/htdocs/.htaccess
    + /www/htdocs/example/.htaccess +

    + +

    Assim, para cada acesso de arquivo fora desse diretório, + existem 4 acessos ao sistema de arquivos adicionais, mesmo + que nenhum desses arquivos estejam presentes. (Note que esse + só será o caso se os arquivos .htaccess + estiverem habilitados para /, o que + normalmente não é o verdade.)

    + +

    A segunda consideração é relativa à segurança. + Você está permitindo que os usuários modifiquem as + configurações do servidor, o que pode resultar em mudanças + que podem fugir ao seu controle. Considere com cuidado se você quer + ou não dar aos seus usuários esses privilégios. Note também + que dar aos usuários menos privilégios que eles precisam, acarreta em + pedidos de suporte técnico adicionais. Tenha certeza que você comunicou + aos usuários que nível de privilégios você os deu. + Especificar exatamente o que você configurou na diretriz AllowOverride, e direcioná-los para a + documentação relevante, irá poupá-lo de muita confusão + depois.

    + +

    Perceba que é exatamente equivalente colocar o arquivo + .htaccess em um diretório + /www/htdocs/example contendo uma diretriz, e + adicionar a mesma diretriz em uma seção Directory + <Directory /www/htdocs/example> na configuração + principal do seu servidor:

    + +

    Arquivo .htaccess em /www/htdocs/example:

    + +

    Conteúdo de um arquivo .htaccess em + /www/htdocs/example

    + AddType text/example .exm +

    + +

    Seção do seu arquivo httpd.conf

    + <Directory /www/htdocs/example>
    + + AddType text/example .exm
    +
    + </Directory> +

    + +

    No entanto, adicionando isso ao seu arquivo de configuração do + servidor resultará em uma menor perda de performance, na medida que + a configuração é carregada no momento da inicialização do + servidor, ao invés de toda que que um arquivo é requerido.

    + +

    O uso de arquivos .htaccess pode ser totalmente + desabilitado, ajustando a diretriz AllowOverride para none:

    + +

    + AllowOverride None +

    +
    top
    +
    +

    Como as diretrizes são aplicadas

    + +

    As diretrizes de configuração que se encontram em um arquivo + .htaccess são aplicadas para o diretório no qual o + arquivo .htaccess se encontra, e para todos os + subdiretórios ali presentes. Mas, é importante lembrar também que + podem existir arquivos .htaccess no diretórios + superiores. As diretrizes são aplicadas na ordem que são + achadas. Logo, um arquivo .htaccess em um diretório + em particular, pode sobrescrever as diretrizes encontradas em um + diretório acima deste em sua respectiva árvore. Estes, por sua vez, + podem ter suas diretrizes sobrescritas por diretrizes ainda mais + acima, ou no próprio arquivo de configuração principal do + servidor.

    + +

    Exemplo:

    + +

    No diretório /www/htdocs/example1 nós temos + um arquivo .htaccess contendo o seguinte:

    + +

    + Options +ExecCGI +

    + +

    (Nota: você deve ter "AllowOverride Options" para + permitir o uso da diretriz "Options" nos arquivos + .htaccess .)

    + +

    No diretório /www/htdocs/example1/example2 nós temos + um arquivo .htaccess contendo:

    + +

    + Options Includes +

    + +

    Devido a esse segundo arquivo .htaccess, no + diretório /www/htdocs/example1/example2, a execução + de scripts CGI não é permitida, pois somente Options + Includes está em efeito, o que sobrescreve completamente + quaisquer outros ajustes previamente configurados.

    +
    top
    +
    +

    Exemplo de Autenticação

    + +

    Se você veio diretamente à esta parte do documento para + aprender como fazer autenticação, é importante notar uma + coisa. Existe uma concepção errada, mas muito comum, de que é + necessário o uso de arquivos .htaccess para implementar + a autenticação por senha. Este não é o caso. Colocar + diretrizes de senha em uma seção <Directory>, no seu arquivo principal de + configuração do servidor, é a melhor maneira de se implementar + isto, e os arquivos .htaccess devem ser usados apenas + se você não tem acesso ao arquivo principal de configuração do + servidor. Veja acima a discussão sobre quando + você deve e quando não deve usar os arquivos + .htaccess.

    + +

    Dito isso, se você ainda acredita que precisa usar um arquivo + .htaccess, a configuração a seguir provavelmente + funcionará para você.

    + +

    Conteúdo de um arquivo .htaccess:

    + +

    + AuthType Basic
    + AuthName "Password Required"
    + AuthUserFile /www/passwords/password.file
    + AuthGroupFile /www/passwords/group.file
    + Require Group admins +

    + +

    Note que AllowOverride AuthConfig precisa estar + habilitado para que estas diretrizes tenham efeito.

    + +

    Por favor veja o tutorial de + autenticação para uma discussão mais completa sobre + autenticação e autorização.

    +
    top
    +
    +

    Exemplo de Server Side Includes

    + +

    Outro uso comum de arquivos .htaccess é ativar o + Server Side Includes para um diretório em particular. Isto pode + ser feito com as seguintes diretrizes de configuração, colocadas em + um arquivo .htaccess no diretório desejado:

    + +

    + Options +Includes
    + AddType text/html shtml
    + AddHandler server-parsed shtml +

    + +

    Note que ambos AllowOverride Options e + AllowOverride FileInfo precisam estar habilitados + para essas diretrizes terem efeito.

    + +

    Por favor veja o tutorial de SSI para + uma discussão mais completa sobre server-side includes.

    +
    top
    +
    +

    Exemplo de CGI

    + +

    Finalmente, você pode querer que um arquivo + .htaccess permita a execução de programas CGI em um + diretório em particular. Isto pode ser implementado com as + seguintes configurações:

    + +

    + Options +ExecCGI
    + AddHandler cgi-script cgi pl +

    + +

    Alternativamente, se você desejar que todos os arquivos de um + dado diretório, sejam considerados programas CGI, isso pode ser + feito com a seguinte configuração:

    + +

    + Options +ExecCGI
    + SetHandler cgi-script +

    + +

    Note que ambos AllowOverride Options e + AllowOverride FileInfo precisam estar habilitados + para que essas diretrizes tenham quaisquer efeito.

    + +

    Por favor veja o tutorial de CGI + tutorial para uma discussão mais completa sobre programação + e configuração CGI.

    +
    top
    +
    +

    Resolvendo Problemas

    + +

    Quando você adiciona diretrizes de configuração em um arquivo + .htaccess, e não obtém o efeito desejado, existe uma + série de pontos que podem estar errados.

    + +

    Mais comumente, o problema é que a diretriz AllowOverride não está habilitada + corretamente para que as suas diretrizes de configurações sejam + honradas. Verifique se você não possui AllowOverride + None ajustado para o escopo do arquivo em questão. Um bom + meio de testar isso é colocar "lixo" em seu arquivo + .htaccess e recarregá-lo. Se não for gerado nenhum + erro do servidor, certamente você tem AllowOverride + None habilitado.

    + +

    Se, por outro lado, você está obtendo erros do servidor ao + tentar acessar documentos, verifique o registro de erros do + Apache. Ele provavelmente irá indicar que a diretriz usada em + seu arquivo .htaccess não é permitida. + Alternativamente, ele pode acusar erros de sintaxe que você terá + que corrigir.

    + +
    +
    +

    Línguas Disponíveis:  en  | + es  | + fr  | + ja  | + ko  | + pt-br 

    +
    top

    Comentários

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/http2.html b/docs/manual/howto/http2.html new file mode 100644 index 0000000..7de4a43 --- /dev/null +++ b/docs/manual/howto/http2.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: http2.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: http2.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: http2.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/howto/http2.html.en b/docs/manual/howto/http2.html.en new file mode 100644 index 0000000..119447a --- /dev/null +++ b/docs/manual/howto/http2.html.en @@ -0,0 +1,346 @@ + + + + + +HTTP/2 guide - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    HTTP/2 guide

    +
    +

    Available Languages:  en  | + es  | + fr 

    +
    + +

    This is the howto guide for the HTTP/2 implementation in Apache httpd. This + feature is production-ready and you may expect interfaces and directives to + remain consistent releases. +

    +
    + +
    top
    +
    +

    The HTTP/2 protocol

    + +

    HTTP/2 is the evolution of the world's most successful application layer protocol, HTTP. + It focuses on making more efficient use of network resources. It does not change the fundamentals + of HTTP, the semantics. There are still request and responses and headers and all that. So, if + you already know HTTP/1, you know 95% about HTTP/2 as well.

    +

    There has been a lot written about HTTP/2 and how it works. The most normative is, of course, + its RFC 7540 + (also available in more readable formatting, YMMV). + So, there you'll find the nuts and bolts.

    +

    But, as RFC do, it's not really a good thing to read first. It's better to first understand + what a thing wants to do and then read the RFC about how it is done. A much + better document to start with is http2 explained + by Daniel Stenberg, the author of curl. It is available in + an ever growing list of languages, too!

    +

    Too Long, Didn't read: there are some new terms and gotchas that need to be kept in mind while reading this document:

    +
      +
    • HTTP/2 is a binary protocol, as opposed to HTTP 1.1 that is plain text. The latter is meant to be human readable (for example sniffing network traffic) meanwhile the former is not. More info in the official FAQ question.
    • +
    • h2 is HTTP/2 over TLS (protocol negotiation via ALPN).
    • +
    • h2c is HTTP/2 over TCP.
    • +
    • A frame is the smallest unit of communication within an HTTP/2 connection, consisting of a header and a variable-length sequence of octets structured according to the frame type. More info in the official documentation section.
    • +
    • A stream is a bidirectional flow of frames within the HTTP/2 connection. The correspondent concept in HTTP 1.1 is a request/response message exchange. More info in the official documentation section.
    • +
    • HTTP/2 is able to run multiple streams of data over the same TCP connection, avoiding the classic HTTP 1.1 head of blocking slow request and avoiding to re-instantiate TCP connections for each request/response (KeepAlive patched the problem in HTTP 1.1 but did not fully solve it).
    • +
    +
    top
    +
    +

    HTTP/2 in Apache httpd

    + +

    The HTTP/2 protocol is implemented by its own httpd module, aptly named + mod_http2. It implements the complete set + of features described by RFC 7540 and supports HTTP/2 over cleartext (http:), as + well as secure (https:) connections. The cleartext variant is named 'h2c', + the secure one 'h2'. For h2c it allows the direct + mode and the Upgrade: via an initial HTTP/1 request.

    +

    One feature of HTTP/2 that offers new capabilities for web developers is + Server Push. See that section on how your web application + can make use of it.

    +
    top
    +
    +

    Build httpd with HTTP/2 support

    + +

    mod_http2 uses the library of nghttp2 + as its implementation base. In order to build mod_http2 you need at least version 1.2.1 of + libnghttp2 installed on your system.

    +

    When you ./configure your Apache httpd source tree, you need to give it + '--enable-http2' as additional argument to trigger the build of the module. + Should your libnghttp2 reside in an unusual place (whatever that is on your + operating system), you may announce its location with '--with-nghttp2=<path>' + to configure.

    +

    While that should do the trick for most, they are people who might prefer a statically + linked nghttp2 in this module. For those, the option --enable-nghttp2-staticlib-deps + exists. It works quite similar to how one statically links openssl to mod_ssl.

    +

    Speaking of SSL, you need to be aware that most browsers will speak HTTP/2 only on https: + URLs, so you need a server with SSL support. But not only that, you will need a SSL library + that supports the ALPN extension. If OpenSSL is the library you use, you need + at least version 1.0.2.

    +
    top
    +
    +

    Basic Configuration

    + + +

    When you have a httpd built with mod_http2 you need some + basic configuration for it becoming active. The first thing, as with every Apache module, + is that you need to load it:

    +
    LoadModule http2_module modules/mod_http2.so
    + + +

    The second directive you need to add to your server configuration is

    +
    Protocols h2 http/1.1
    + +

    This allows h2, the secure variant, to be the preferred protocol on your server + connections. When you want to enable all HTTP/2 variants, you simply write:

    +
    Protocols h2 h2c http/1.1
    + +

    Depending on where you put this directive, it affects all connections or just + the ones to a certain virtual host. You can nest it, as in:

    +
    Protocols http/1.1
    +<VirtualHost ...>
    +    ServerName test.example.org
    +    Protocols h2 http/1.1
    +</VirtualHost>
    + + +

    This allows only HTTP/1 on connections, except SSL connections to test.example.org + which offer HTTP/2.

    +

    Choose a strong SSLCipherSuite

    +

    The SSLCipherSuite needs to be configured with + a strong TLS cipher suite. The current version of mod_http2 does not enforce any cipher but most + clients do so. Pointing a browser to a h2 enabled server with a inappropriate + cipher suite will force it to simply refuse and fall back to HTTP 1.1. This is a common mistake + that is done while configuring httpd for HTTP/2 the first time, so please keep it in mind to avoid + long debugging sessions! If you want to be sure about the cipher suite to choose please avoid + the ones listed in the HTTP/2 TLS reject list.

    +
    +

    The order of protocols mentioned is also relevant. By default, the first one is the + most preferred protocol. When a client offers multiple choices, the one most to the + left is selected. In

    +
    Protocols http/1.1 h2
    + +

    the most preferred protocol is HTTP/1 and it will always be selected unless a + client only supports h2. Since we want to talk HTTP/2 to clients that + support it, the better order is

    +
    Protocols h2 h2c http/1.1
    + + +

    There is one more thing to ordering: the client has its own preferences, too. If + you want, you can configure your server to select the protocol most preferred by + the client:

    +
    ProtocolsHonorOrder Off
    + +

    makes the order you wrote the Protocols irrelevant and only the client's + ordering will decide.

    +

    A last thing: the protocols you configure are not checked for correctness + or spelling. You can mention protocols that do not exist, so there is no need + to guard Protocols with any + <IfModule> checks.

    +

    For more advanced tips on configuration, see the + modules section about dimensioning and + how to manage multiple hosts with the same certificate.

    +
    top
    +
    +

    MPM Configuration

    + + +

    HTTP/2 is supported in all multi-processing modules that come with httpd. However, if + you use the prefork mpm, there will be severe restrictions.

    +

    In prefork, mod_http2 will only process one request at at time + per connection. But clients, such as browsers, will send many requests at the same time. + If one of these takes long to process (or is a long polling one), the other requests will + stall.

    +

    mod_http2 will not work around this limit by default. The reason is that + prefork is today only chosen, if you run processing engines that are not + prepared for multi-threading, e.g. will crash with more than one request.

    +

    If your setup can handle it, configuring event mpm is nowadays + the best one (if supported on your platform).

    +

    If you are really stuck with prefork and want multiple requests, + you can tweak the H2MinWorkers to make + that possible. If it breaks, however, you own both parts.

    +
    top
    +
    +

    Clients

    + +

    Almost all modern browsers support HTTP/2, but only over SSL connections: Firefox (v43), + Chrome (v45), Safari (since v9), iOS Safari (v9), Opera (v35), Chrome for Android (v49) + and Internet Explorer (v11 on Windows10) (source).

    +

    Other clients, as well as servers, are listed + on the Implementations wiki, + among them implementations for c, c++, common lisp, dart, erlang, haskell, java, nodejs, php, + python, perl, ruby, rust, scala and swift.

    +

    Several of the non-browser client implementations support HTTP/2 over cleartext, h2c. The + most versatile being curl.

    +
    top
    +
    +

    Useful tools to debug HTTP/2

    + +

    The first tool to mention is of course curl. Please make sure that + your version supports HTTP/2 checking its Features:

    +
        $ curl -V
    +    curl 7.45.0 (x86_64-apple-darwin15.0.0) libcurl/7.45.0 OpenSSL/1.0.2d zlib/1.2.8 nghttp2/1.3.4
    +    Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 [...] 
    +    Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2
    +    
    + +

    Mac OS homebrew notes

    + brew install curl --with-openssl --with-nghttp2 +
    +

    And for really deep inspection wireshark.

    +

    The nghttp2 package also includes clients, such as:

    +
      +
    • nghttp - useful to visualize the HTTP/2 frames and get a better idea of the protocol.
    • +
    • h2load - useful to stress-test your server.
    • +
    +

    Chrome offers detailed HTTP/2 logs on its connections via the + special net-internals page. There is also an + interesting extension for Chrome + and Firefox + to visualize when your browser is using HTTP/2.

    +
    top
    +
    +

    Server Push

    + +

    The HTTP/2 protocol allows the server to PUSH responses to a client it never + asked for. The tone of the conversation is: "here is a request that you + never sent and the response to it will arrive soon..."

    +

    But there are restrictions: the client can disable this feature and the + server may only ever PUSH on a request that came from the client.

    +

    The intention is to allow the server to send resources to the client that + it will most likely need: a css or javascript resource that belongs to a html + page the client requested. A set of images that is referenced by a css, etc.

    +

    The advantage for the client is that it saves the time to send the request which + may range from a few milliseconds to half a second, depending on where on the + globe both are located. The disadvantage is that the client may get sent + things it already has in its cache. Sure, HTTP/2 allows for the early cancellation + of such requests, but still there are resources wasted.

    +

    To summarize: there is no one good strategy on how to make best use of this + feature of HTTP/2 and everyone is still experimenting. So, how do you experiment + with it in Apache httpd?

    +

    mod_http2 inspect response header for Link headers + in a certain format:

    +
    Link </xxx.css>;rel=preload, </xxx.js>; rel=preload
    + +

    If the connection supports PUSH, these two resources will be sent to the + client. As a web developer, you may set these headers either directly in + your application response or you configure the server via

    +
    <Location /xxx.html>
    +    Header add Link "</xxx.css>;rel=preload"
    +    Header add Link "</xxx.js>;rel=preload"
    +</Location>
    + +

    If you want to use preload links without triggering a PUSH, you + can use the nopush parameter, as in

    +
    Link </xxx.css>;rel=preload;nopush
    + +

    or you may disable PUSHes for your server entirely with the directive

    +
    H2Push Off
    + +

    And there is more:

    +

    The module will keep a diary of what has been PUSHed for each connection + (hashes of URLs, basically) and will not PUSH the same resource twice. When + the connection closes, this information is discarded.

    +

    There are people thinking about how a client can tell a server what it + already has, so PUSHes for those things can be avoided, but this is all + highly experimental right now.

    +

    Another experimental draft that has been implemented in mod_http2 + is the + Accept-Push-Policy Header Field where a client can, for each request, define + what kind of PUSHes it accepts.

    +

    + PUSH might not always trigger the request/response/performance that one expects or + hopes for. There are various studies on this topic to be found on the web that explain + benefits and weaknesses and how different features of client and network influence + the outcome. For example: just because the server PUSHes a resource does not mean + a browser will actually use the data.

    +

    The major thing that influences the response being PUSHed is the request that was + simulated. The request URL for a PUSH is given by the application, but where do the + request headers come from? For example, will the PUSH request a accept-language + header and if yes with what value?

    +

    Apache will look at the original request (the one that triggered the PUSH) and copy the + following headers over to PUSH requests: user-agent, accept, + accept-encoding, accept-language, cache-control.

    +

    All other headers are ignored. Cookies will also not be copied over. PUSHing resources + that require a cookie to be present will not work. This can be a matter of debate. But + unless this is more clearly discussed with browser, let's err on the side of caution and + not expose cookie where they might ordinarily not be visible.

    +
    top
    +
    +

    Early Hints

    + +

    An alternative to PUSHing resources is to send Link headers to the + client before the response is even ready. This uses the HTTP feature called "Early Hints" and + is described in RFC 8297.

    +

    In order to use this, you need to explicitly enable it on the server via

    +
    H2EarlyHints on
    + +

    (It is not enabled by default since some older browser tripped on such responses.)

    +

    If this feature is on, you can use the directive H2PushResource to + trigger early hints and resource PUSHes:

    +
    <Location /xxx.html>
    +    H2PushResource /xxx.css
    +    H2PushResource /xxx.js
    +</Location>
    + +

    This will send out a "103 Early Hints" response to a client as soon + as the server starts processing the request. This may be much early than + the time the first response headers have been determined, depending on your web + application.

    +

    If H2Push is enabled, this will also start the PUSH right after the + 103 response. If H2Push is disabled however, the 103 response will be send + nevertheless to the client.

    +
    +
    +

    Available Languages:  en  | + es  | + fr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/http2.html.es b/docs/manual/howto/http2.html.es new file mode 100644 index 0000000..8254e1b --- /dev/null +++ b/docs/manual/howto/http2.html.es @@ -0,0 +1,421 @@ + + + + + +Guía HTTP/2 - Servidor HTTP Apache Versión 2.4 + + + + + + + +
    <-
    +

    Guía HTTP/2

    +
    +

    Idiomas disponibles:  en  | + es  | + fr 

    +
    +
    Esta traducción podría estar + obsoleta. Consulte la versión en inglés de la + documentación para comprobar si se han producido cambios + recientemente.
    + +

    + Esta es la guía para configurar HTTP/2 en Apache httpd. Ésta característica + está lista en produción así que es de esperar que las interfaces + y las directivas se mantengan consistentes en cada verión. +

    +
    + +
    top
    +
    +

    El protocolo HTTP/2

    + + +

    HTTP/2 es la evolución del protocolo de la capa de aplicación con más + éxito, HTTP. Se centra en hacer un uso más eficiente de los recursos de red. + No cambia la característica fundamental de HTTP, la semántica. Todavía hay + olicitudes, respuestas, cabeceras y todo los elementos típicos de HTTP/1. Así + que, si ya conoce HTTP/1, también conoce el 95% de HTTP/2.

    + +

    Se ha escrito mucho sobre HTTP/2 y de cómo funciona. La norma más + estándar es, por supuesto, su + RFC 7540 + ( también disponible en un + formato más legible, YMMV). Así que, ahí encontrará toda la especificación + del protocolo.

    + +

    Pero, como con todos los RFC, no es ideal como primera lectura. Es mejor + entender primero qué se quiere hacer y después leer el RFC sobre + cómo hacerlo. Un documento mucho mejor con el que empezar es + http2 explicado + por Daniel Stenberg, el autor de curl. + ¡También está disponible cada vez en un mayor número lenguajes!

    + +

    Si le parece demasiado largo, o no lo ha leido, hay algunos términos + y elementos a tener en cuenta cuando lea este documento:

    +
      +
    • HTTP/2 es un protocolo binario, al contrario que + HTTP 1.1 que es texto plano. La intención para HTTP 1.1 es que sea + legible (por ejemplo capturando el tráfico de red) mientras que para + HTTP/2 no. Más información en el FAQ oficial + ¿Por qué es + binario HTTP/2?
    • + +
    • h2 es HTTP/2 sobre TLS (negociación de protocolo a + través de ALPN).
    • + +
    • h2c es HTTP/2 sobre TCP.
    • + +
    • Un frame es la unidad más pequeña de comunicación + dentro de una conexión HTTP/2, que consiste en una cabecera y una secuencia + de octetos de longitud variable estructurada de acuerdo con el tipo de + frame. Más información en la documentación oficial + Sección de + Capa de Frame.
    • + +
    • Un stream es un flujo bidireccional de frames dentro + de una conexión HTTP/2. El concepto correspondiente en HTTP 1.1 es un + intercambio de mensajes de solicitud/respuesta. Más información en la + documentación oficial + Sección Capa + de Stream.
    • + +
    • + HTTP/2 es capaz de llevar múltiples streams de datos + sobre la misma conexión TCP, evitando la clásica solicitud lenta + "head-of-line blocking" de HTTP 1.1 y evitando generar múltiples conexiones + TCP para cada solicitud/respuesta (KeepAlive parcheó el problema en + HTTP 1.1 pero no lo resolvió completamente). +
    • +
    +
    top
    +
    +

    HTTP/2 en Apache httpd

    + + +

    + El protocolo HTTP/2 se implementa con su propio módulo httpd, llamado + acertadamente mod_http2. Incluye el set completo de + características descritas por el RFC 7540 y soporta HTTP/2 sobre texto + plano (http:), así como conexiones seguras (https:). La variante de texto + plano se llama 'h2c', la segura 'h2'. Para + h2c permite el modo direct + y el Upgrade: a través de una solicitud inicial HTTP/1. +

    + +

    + Una característica de HTTP/2 que ofrece capacidades nuevas para + desarrolladores de web es Server Push. Vea esa sección + para saber como su aplicación web puede hacer uso de ella. +

    +
    top
    +
    +

    Compilar httpd con soporte HTTP/2

    + + +

    + mod_http2 usa la librería + nghttp2como su implementación base. Para compilar + mod_http2 necesita al menos la versión 1.2.1 de + libnghttp2 instalada en su sistema. +

    + +

    + Cuando usted ejecuta ./configure en el código fuente de + Apache HTTPD, necesita indicarle '--enable-http2' como una + opción adicional para activar la compilación de este módulo. Si su + libnghttp2 está ubicado en una ruta no habitual (cualquiera que + sea en su sistema operativo), puede indicar su ubicación con + '--with-nghttp2=<path>' para ./configure. +

    + +

    Aunque puede que eso sirva para la mayoría, habrá quien prefiera un nghttp2 compilado estáticamente para este módulo. Para ellos existe la opción --enable-nghttp2-staticlib-deps. Funciona de manera muy similar a como uno debe enlazar openssl estáticamente para mod_ssl.

    + +

    Hablando de SSL, necesita estar al tanto de que la mayoría de los navegadores hablan HTTP/2 solo con URLs https:. Así que necesita un servidor con soporte SSL. Pero no solo eso, necesitará una librería SSL que de soporte a la extensión ALPN. Si usa OpenSSL, necesita al menos la versión 1.0.2.

    +
    top
    +
    +

    Configuración básica

    + + +

    Cuando tiene un httpd compilado con mod_http2 necesita una configuración básica para activarlo. Lo primero, como con cualquier otro módulo de Apache, es que necesita cargarlo:

    + +
    LoadModule http2_module modules/mod_http2.so
    + + +

    La segunda directiva que necesita añadir a la configuración de su servidor es:

    + +
    Protocols h2 http/1.1
    + + +

    Esto permite h2, la variante segura, para ser el protocolo preferido de las conexiones en su servidor. Cuando quiera habilitar todas las variantes de HTTP/2, entonces simplemente configure:

    + +
    Protocols h2 h2c http/1.1
    + + +

    Dependiendo de dónde pone esta directiva, afecta a todas las conexiones o solo a las de ciertos host virtuales. La puede anidar, como en:

    + +
    Protocols http/1.1
    +<VirtualHost ...>
    +    ServerName test.example.org
    +    Protocols h2 http/1.1
    +</VirtualHost>
    + + +

    Esto solo permite HTTP/1, excepto conexiones SSL hacia test.example.org que ofrecen HTTP/2.

    + +

    Escoger un SSLCipherSuite seguro

    +

    Es necesario configurar SSLCipherSuite con una suite segura de cifrado TLS. La versión actual de mod_http2 no fuerza ningún cifrado pero la mayoría de los clientes si lo hacen. Encaminar un navegador hacia un servidor con h2 activado con una suite inapropiada de cifrados forzará al navegador a rehusar e intentar conectar por HTTP 1.1. Esto es un error común cuando se configura httpd con HTTP/2 por primera vez, ¡así que por favor tenga en cuenta que debe evitar largas sesiones de depuración! Si quiere estar seguro de la suite de cifrados que escoja, por favor evite los listados en la Lista Negra de TLS para HTTP/2.

    +
    + +

    El orden de los protocolos mencionados también es relevante. Por defecto, el primero es el protocolo preferido. Cuando un cliente ofrece múltiples opciones, la que esté más a la izquierda será la escogida. En

    +
    Protocols http/1.1 h2
    + + +

    el protocolo preferido es HTTP/1 y siempre será seleccionado a menos que el cliente sólo soporte h2. Puesto que queremos hablar HTTP/2 con clientes que lo soporten, el orden correcto es:

    + +
    Protocols h2 h2c http/1.1
    + + +

    Hay algo más respecto al orden: el cliente también tiene sus propias preferencias. Si quiere, puede configurar su servidor para seleccionar el protocolo preferido por el cliente:

    + +
    ProtocolsHonorOrder Off
    + + +

    Hace que el orden en que usted escribió los Protocols sea irrelevante y sólo el orden de preferencia del cliente será decisorio.

    + +

    Una última cosa: cuando usted configura los protocolos no se comprueba si son correctos o están bien escritos. Puede mencionar protocolos que no existen, así que no hay necesidad de proteger Protocols con ningún <IfModule> de comprobación.

    + +

    Para más consejos avanzados de configuración, vea la + sección de módulos sobre dimensionamiento y + como gestionar multiples hosts con el mismo certificado.

    +
    top
    +
    +

    Configuración MPM

    + + +

    HTTP/2 está soportado en todos los módulos de multi-proceso que se ofrecen con httpd. Aun así, si usa el mpm prefork, habrá restricciones severas.

    + +

    En prefork, mod_http2 solo procesará una solicitud cada vez por conexión. Pero los clientes, como los navegadores, enviarán muchas solicitudes al mismo tiempo. Si una de ellas tarda mucho en procesarse (o hace un sondeo que dura más de la cuenta), las otras solicitudes se quedarán atascadas.

    + +

    mod_http2 no evitará este límite por defecto. El motivo es que prefork hoy en día solo se escoge si ejecuta motores de proceso que no están preparados para multi-hilo, p.ej. fallará con más de una solicitud.

    + +

    Si su configuración lo soporta, hoy en día event es el mejor mpm que puede usar.

    + +

    Si realmente está obligado a usar prefork y quiere multiples solicitudes, puede configurar la directiva H2MinWorkers para hacerlo posible. Sin embargo, si esto falla, es bajo su cuenta y riesgo.

    +
    top
    +
    +

    Clientes

    + + +

    Casi todos los navegadores modernos dan soporte a HTTP/2, pero solo en conexiones SSL: Firefox (v43), Chrome (v45), Safari (since v9), iOS Safari (v9), Opera (v35), Chrome para Android (v49) e Internet Explorer (v11 en Windows10) (Fuente).

    + +

    Otros clientes, así cómo otros servidores, están listados en la + wiki de Implementaciones, entre ellos, implementaciones para c, c++, common lisp, dart, erlang, haskell, java, nodejs, php, python, perl, ruby, rust, scala y swift.

    + +

    Muchos de las implementaciones de clientes que no son navegadores soportan HTTP/2 sobre texto plano, h2c. La más versátil es curl.

    +
    top
    +
    +

    Herramientas útiles para depurar HTTP/2

    + + +

    La primera herramienta a mencionar es por supuesto curl. Por favor asegúrese de que su versión soporta HTTP/2 comprobando sus Características:

    +
        $ curl -V
    +    curl 7.45.0 (x86_64-apple-darwin15.0.0) libcurl/7.45.0 OpenSSL/1.0.2d zlib/1.2.8 nghttp2/1.3.4
    +    Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 [...] 
    +    Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2
    +    
    + +

    Notas sobre Mac OS homebrew

    + brew install curl --with-openssl --with-nghttp2 +
    +

    Y para una inspección en gran profundidad wireshark.

    +

    El paquete nghttp2 también incluye clientes, tales como:

    +
      +
    • nghttp + - util para visualizar la frames de HTTP/2 y tener una mejor idea de como funciona el protocolo.
    • +
    • h2load - útil para hacer un stress-test de su servidor.
    • +
    + +

    Chrome ofrece logs detallados de HTTP/2 en sus conexiones a través de la página especial de net-internals. También hay una extensión interesante para Chrome y Firefox con la que visualizar cuando su navegador usa HTTP/2.

    +
    top
    +
    +

    Server Push

    + + +

    El protocolo HTTP/2 permite al servidor hacer PUSH de respuestas a un cliente que nunca las solicitó. El tono de la conversación es: "Aquí tiene una solicitud que nunca envió y la respuesta llegará pronto..."

    + +

    Pero hay restricciones: el cliente puede deshabilitar esta característica y el servidor entonces solo podrá hacer PUSH en una solicitud que hizo previamente del cliente.

    + +

    La intención es permitir al servidor enviar recursos que el cliente seguramente vaya a necesitar, p. ej. un recurso css o javascript que pertenece a una página html que el cliente solicitó, un grupo de imágenes a las que se hace referencia en un css, etc.

    + +

    La ventaja para el cliente es que ahorra tiempo para solicitudes que pueden tardar desde unos pocos milisegundos a medio segundo, dependiendo de la distancia entre el cliente y el servidor. La desventaja es que el cliente puede recibir cosas que ya tiene en su cache. Por supuesto que HTTP/2 soporta cancelación previa de tales solicitudes, pero aun así se malgastan recursos.

    + +

    Resumiendo: no hay una estrategia mejor sobre cómo usar esta característica de HTTP/2 y todo el mundo está experimentando con ella. Así que, ¿cómo experimenta usted con ella en Apache httpd?

    + +

    mod_http2 busca e inspecciona las cabeceras de respuesta + Link con cierto formato:

    + +
    Link </xxx.css>;rel=preload, </xxx.js>; rel=preload
    + + +

    + Si la conexión soporta PUSH, estos dos recursos se enviarán al cliente. + Como desarrollador web, puede configurar estas cabeceras o bien + directamente en la respuesta de su aplicación o configurar su servidor con: +

    + +
    <Location /xxx.html>
    +    Header add Link "</xxx.css>;rel=preload"
    +    Header add Link "</xxx.js>;rel=preload"
    +</Location>
    + + +

    Si quiere usar enlaces con preload sin activar un PUSH, puede + usar el parámetro nopush, como en:

    + +
    Link </xxx.css>;rel=preload;nopush
    + + +

    o puede desactivar PUSH para su servidor por completo con la directiva

    + +
    H2Push Off
    + + +

    Y hay más:

    + +

    + El módulo mantiene un registro de lo que se ha enviado con PUSH para cada + conexión (hashes de URLs, básicamente) y no hará PUSH del mismo recurso dos + veces. Cuando la conexión se cierra, la información es descartada. +

    + +

    + Hay gente pensando cómo un cliente puede decirle al servidor lo que ya + tiene, para evitar los PUSH de esos elementos, pero eso algo muy + experimental ahora mismo. +

    + +

    Otro borrador experimental que ha sido implementado en + mod_http2 es el Campo de Cabecera + Accept-Push-Policy en la que un cliente puede, para cada solicitud, definir + qué tipo de PUSH acepta.

    + +

    + Puede que PUSH no siempre lance la peticion/respuesta/funcionamiento que + uno espera. Hay varios estudios sobre este tema en internet, que explican + el beneficio y las debilidades de como diferentes funcionalidades del + cliente y de la red influyen en el resultado. + Por Ejemplo, que un servidor haga "PUSH" de recursos, no significa que el + navegador vaya a usar dichos datos. +

    +

    + Lo más importante que influye en la respuesta que se envía, es la solicitud + que se simuló. La url de solicitud de un PUSH es dada por la aplicación, + pero ¿de donde vienen las cabeceras de la petición? por ejemplo si el PUSH + pide una cabecera accept-language y si es así, ¿con qué valor? +

    +

    Httpd mirará la petición original (la que originó el PUSH) y copiará las + siguientes cabeceras a las peticiones PUSH: + user-agent, accept, accept-encoding, + accept-language, cache-control. +

    +

    + Todas las otras cabeceras son ignorados. Las cookies tampoco serán copiadas. + Impulsar los recursos que requieren una cookie para estar presente no + funcionará. Esto puede ser una cuestión de debate. Pero a menos que esto se + discuta más claramente con el navegador, evitemos el exceso de precaución y + no expongamos las cookies donde podrían o no ser visibles. +

    + +
    top
    +
    +

    "Early Hints"

    + + +

    Una alternativa de "Pushear" recursos es mandar una cabecera + Link al cliente antes que la respuesta esté lista. Esto usa + una caracteristica de HTTP que se llama "Early Hints" y está descrita en + la RFC 8297.

    +

    Para poder usar esto, necesita habilitarlo explicitamente en el servidor + via

    + +
    H2EarlyHints on
    + + +

    (No está habilitado por defecto ya q ue algunos navegadores más antiguos + se caen con dichas respuestas.) +

    + +

    si esta funcionalidad esta activada, puede usar la directiva + H2PushResource para que lance + "Early hints" y recursos mediante push: +

    +
    <Location /xxx.html>
    +    H2PushResource /xxx.css
    +    H2PushResource /xxx.js
    +</Location>
    + +

    + Esto lanzará una respuesta "103 Early Hints" a un cliente + tan pronto como el servidor comience a procesar la solicitud. + Esto puede ser mucho antes que en el momento en que se determinaron los + primeros encabezados de respuesta, dependiendo de su aplicación web. +

    + +

    + Si la directiva H2Push está + habilitada, esto comenzará el PUSH justo después de la respuesta 103. + Sin embargo, si la directiva H2Push está dehabilitada, la respuesta 103 se le enviará al cliente. +

    +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr 

    +
    top

    Comentarios

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/http2.html.fr.utf8 b/docs/manual/howto/http2.html.fr.utf8 new file mode 100644 index 0000000..9494b9e --- /dev/null +++ b/docs/manual/howto/http2.html.fr.utf8 @@ -0,0 +1,429 @@ + + + + + +Guide HTTP/2 - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Guide HTTP/2

    +
    +

    Langues Disponibles:  en  | + es  | + fr 

    +
    + +

    Ce document est le guide de l'utilisateur de l'implémentation de HTTP/2 + dans Apache httpd. Cette fonctionnalité en est au stade + de production, et les interfaces et directives devraient donc être + dorénavant relativement stables. +

    +
    + +
    top
    +
    +

    Le protocole HTTP/2

    + +

    HTTP/2 est une évolution du protocole de la couche application le plus + utilisé au monde, HTTP. Cette évolution permet en particulier une utilisation + plus efficace des ressources réseau. Il ne modifie pas les aspects + fondamentaux de HTTP (sa sémantique). Entre autres, il y a toujours des + requêtes, des réponses et des en-têtes. Par conséquent, si vous connaissez + HTTP/1, vous connaissez déjà 95% de HTTP/2.

    +

    Beaucoup a déjà été écrit à propos de HTTP/2 et de son fonctionnement. La + documentation la plus officielle est bien entendu sa RFC 7540 (ou cette version au format plus + lisible). Vous trouverez ici une description des rouages de HTTP/2 dans + leurs moindres détails.

    +

    Le premier document à lire lorsqu'on ne connaît pas un mécanisme n'est + cependant pas sa RFC. Il est préférable de comprendre tout d'abord ce + que ce mécanisme est censé faire, et seulement ensuite de lire sa RFC + pour comprendre comment il fonctionne. http2 explained de Daniel Stenberg + (l'auteur de curl) + est un bien meilleur document pour démarrer l'étude de HTTP/2. En outre, de + nouveaux langages s'ajoutent régulièrement à sa liste de traductions + disponibles !

    +

    Si vous n'avez pas envie de le lire parce que vous le trouvez trop long, + voici certains pièges à éviter et nouveaux termes à connaître avant de lire + ce document :

    +
      +
    • A la différence de HTTP/1 qui est en texte pur, HTTP/2 est un + protocole binaire, et alors que le premier est lisible par + un humain (par exemple pour sniffer le trafic réseau), le second ne + l'est pas. Voir la FAQ + officielle pour plus de détails.
    • +
    • h2 correspond à HTTP/2 sur TLS (négociation de + protocole via ALPN).
    • +
    • h2c correspond à HTTP/2 sur TCP.
    • +
    • Une frame ou trame est la plus petite unité de + communication au sein d'une connexion HTTP/2 et comporte une en-tête et + une séquence d'octets de longueur variable dont la structure correspond + au type de trame. Voir la section + correspondante de la documentation officielle pour plus de + détails.
    • +
    • Un stream est un flux bidirectionnel de frames au + sein d'une connexion HTTP/2. La notion correspondante dans HTTP/1 est un + échange de messages de type requête et réponse. Voir la section + correspondante de la documentation officielle pour plus de détails.
    • +
    • HTTP/2 peut gérer plusieurs streams de données sur + la même connexion TCP, ce qui permet d'éviter le point de blocage + classique de HTTP/1 pour les requêtes lentes, et de ne pas avoir à + ouvrir de nouvelles connexions TCP pour chaque requête/réponse (les + connexions persistantes ou KeepAlive avaient contourné le problème dans + HTTP/1 mais ne l'avaient pas entièrement résolu)
    • +
    +
    top
    +
    +

    HTTP/2 dans Apache httpd

    + +

    Le protocole HTTP/2 est implémenté dans Apache httpd via un module + propre, pertinemment nommé mod_http2. Ce + module implémente toutes les fonctionnalités décrites par la RFC 7540 et + supporte les connexions en texte pur (http:), ou sécurisées (https:). + La variante texte pur se nomme 'h2c', et la variante sécurisée + 'h2'. h2c peut être en mode direct ou + Upgrade: via une requête initiale en HTTP/1.

    +

    Server Push est une nouvelle fonctionnalité offerte + aux développeurs web par HTTP/2. La section correspondante de ce document + vous indiquera comment votre application peut en tirer parti.

    +
    top
    +
    +

    Compilation de httpd avec le support de HTTP/2

    + +

    mod_http2 se base sur la bibliothèque + de nghttp2 pour son implémentation. Pour + pouvoir compiler mod_http2, libnghttp2 version + 1.2.1. ou supérieure doit être installée dans votre système.

    +

    Pour déclencher la compilation de mod_http2, vous devez + ajouter l'argument '--enable-http2' au script + ./configure que vous exécutez à la racine de l'arborescence des + sources de httpd. Si libnghttp2 est installée dans un + répertoire non connu du chemin de vos bibliothèques, vous devez indiquer ce + répertoire au script ./configure via l'argument + '--with-nghttp2=<path>'.

    +

    Alors que cette méthode de compilation conviendra à la plupart, certains + préféreront lier statiquement nghttp2 à ce module. Pour ce + faire, utilisez l'argument --enable-nghttp2-staticlib-deps. + Cette méthode est pratiquement la même que celle utilisée pour lier + statiquement openssl à mod_ssl.

    +

    En parlant de SSL, vous devez savoir que la plupart des navigateurs ne + communiqueront en HTTP/2 que sur des URLs sécurisées de type + https: ; votre serveur doit donc supporter SSL. Mais de plus, + votre bibliothèque SSL devra supporter l'extension ALPN. Enfin, + si la bibliothèque que vous utilisez est OpenSSL, sa version devra être + 1.0.2. ou supérieure.

    +
    top
    +
    +

    Configuration de base

    + + +

    Maintenant que vous disposez d'un binaire httpd compilé avec le + module mod_http2, l'activation de ce dernier nécessite un + minimum de configuration supplémentaire. En premier lieu, comme pour tout + module Apache, vous devez le charger :

    +
    LoadModule http2_module modules/mod_http2.so
    + + +

    La seconde directive que vous devez ajouter à votre fichier de + configuration est

    +
    Protocols h2 http/1.1
    + +

    Ceci permet de définir h2, la variante sécurisée, comme le protocole + préféré pour les connexions à votre serveur. Si vous souhaitez que toutes les + variantes soient disponibles, utilisez la directive suivante :

    +
    Protocols h2 h2c http/1.1
    + +

    Selon l'endroit où vous placez cette directive, elle affectera l'ensemble + de votre serveur, ou seulement un ou plusieurs serveurs virtuels. Vous + pouvez aussi l'imbriquer comme dans l'exemple suivant :

    +
    Protocols http/1.1
    +<VirtualHost ...>
    +    ServerName test.example.org
    +    Protocols h2 http/1.1
    +</VirtualHost>
    + + +

    Seules les connexions en HTTP/1 seront alors permises, sauf pour le serveur + virtuel test.example.org qui acceptera aussi les connexions SSL + en HTTP/2.

    +

    Utilisez une chaîne d'algorithmes de chiffrement forte

    +

    La directive SSLCipherSuite doit + être définie avec une chaîne d'algorithmes de chiffrement TLS forte. Même si + la version actuelle de mod_http2 n'impose pas d'algorithmes + de chiffrement particuliers, la plupart des clients le font. Faire pointer + un navigateur vers un serveur où h2 est activé avec une chaîne + d'algorithmes de chiffrement inappropriée entraînera un rejet et une + retrogradation vers HTTP 1.1. C'est une erreur que l'on fait couramment + lorsqu'on configure httpd pour HTTP/2 pour la première fois ; donc gardez la + à l'esprit si vous voulez éviter de longues sessions de débogage ! Si vous + voulez être sûr de définir une chaîne d'algorithmes de chiffrement + appropriée, évitez ceux qui sont listés dans la liste des + algorithmes de chiffrement TLS HTTP/2 à proscrire.

    +
    +

    L'ordre des protocoles indiqués est aussi important. Par défaut, le + premier sera le protocole préféré. Lorsqu'un client offre plusieurs choix, + c'est le plus à gauche qui sera sélectionné. Dans

    +
    Protocols http/1.1 h2
    + +

    le protocole préféré sera HTTP/1 et il sera toujours sélectionné sauf si + un client ne supporte que h2. Comme nous souhaitons communiquer en + HTTP/2 avec les clients qui le supportent, la meilleure définition de la + directive est

    +
    Protocols h2 h2c http/1.1
    + + +

    Toujours à propos de l'ordre des protocoles, le client a lui aussi ses + propres préférences en la matière. À ce titre, si vous le souhaitez, vous + pouvez configurer votre serveur pour qu'il sélectionne non plus son + protocole préféré, mais au contraire le protocole préféré + du client :

    +
    ProtocolsHonorOrder Off
    + +

    Avec cette directive, l'ordre des protocoles que vous avez + défini devient caduque et seul l'ordre défini par le client sera pris en + compte.

    +

    Une dernière chose : les protocoles que vous définissez ne sont pas + vérifiés quant à leurs validité ou orthographe. Vous pouvez très bien + définir des protocoles qui n'existent pas, et il n'est donc pas nécessaire + de filtrer le contenu de la directive Protocols avec des vérifications de type + <IfModule>.

    +

    Pour des conseils plus avancés à propos de la configuration, voir la Documentation de mod_http2, et en particulier + la section à propos de la consommation supplémentaire de + ressources, ainsi que la section expliquant comment gérer les serveurs multiples avec certificat + commun.

    +
    top
    +
    +

    Configuration du MPM

    + + +

    Tous les modules multiprocessus (MPM) fournis avec httpd supportent + HTTP/2. Cependant, si vous utilisez le MPM prefork, vous allez + faire face à de sévères restrictions.

    +

    Avec le MPM prefork, mod_http2 ne traitera + qu'une requête à la fois par connexion alors que les clients tels que les + navigateurs internet envoient de nombreuses requêtes au même moment. Si + l'une d'entre elles est longue à traiter (ou implique une longue + interrogation), les autres requêtes seront mises en attente.

    +

    Par défaut, mod_http2 ne passe pas outre cette limitation pour + la simple et bonne raison que le MPM prefork n'est aujourd'hui + choisi que si vous exécutez des moteurs de traitement qui ne sont pas préparés + pour le multithreading (par exemple qui se crashent lorsque plusieurs + requêtes arrivent).

    +

    Si votre plateforme et votre installation de httpd le supportent, la + meilleur solution consiste actuellement à utiliser le MPM + event. +

    +

    Si vous n'avez pas d'autre choix que d'utiliser le MPM + prefork, mais souhaitez tout de même traiter plusieurs requêtes + simultanément, vous pouvez jouer avec la directive H2MinWorkers, sans garantie que cela + fonctionne.

    +
    top
    +
    +

    Clients

    + +

    La plupart des navigateurs modernes supportent HTTP/2, mais seulement sur + des connexions SSL : Firefox v43, Chrome v45, Safari v9, iOS Safari v9, + Opera v35, Chrome pour Android v49 et + Internet Explorer v11 sous Windows10 (selon cette source).

    +

    D'autres clients et serveurs sont listés dans le wiki des + implémentations ; entre autres des implémentations pour c, c++, common + lisp, dart, erlang, haskell, java, nodejs, php, python, perl, ruby, rust, + scala et swift.

    +

    De nombreuses implémentations clientes autres que les navigateurs + supportent HTTP/2 en texte pur, h2c. L'une des plus efficaces d'entre elles + est curl.

    +
    top
    +
    +

    Outils efficaces pour déboguer HTTP/2

    + +

    Le premier d'entre eux est bien entendu curl. Assurez-vous au préalable que votre + version supporte HTTP/2 en vérifiant ses Fonctionnalités :

    +
        $ curl -V
    +    curl 7.45.0 (x86_64-apple-darwin15.0.0) libcurl/7.45.0 OpenSSL/1.0.2d zlib/1.2.8 nghttp2/1.3.4
    +    Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 [...]
    +    Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2
    +    
    + +

    homebrew sous Mac OS :

    + brew install curl --with-openssl --with-nghttp2 +
    +

    Pour une inspection en profondeur : wireshark.

    +

    Le paquet nghttp2 inclut aussi des + outils comme :

    +
      +
    • nghttp + - permet de visualiser les trames HTTP/2 et ainsi de se faire une meilleure + idée du protocole.
    • +
    • h2load - + permet de tester votre serveur dans des conditions extremes.
    • +
    +

    Chrome fournit des journaux détaillés des connexions HTTP/2 via la page + special net-internals page. Il y + a aussi cette extension intéressante pour Chrome + et Firefox + qui permet d'indiquer que votre navigateur utilise HTTP/2.

    +
    top
    +
    +

    Push serveur

    + +

    Le protocole HTTP/2 permet au serveur de proposer (PUSH) des réponses + pour lesquelles le client n'a rien demandé. La communication autour de ces + réponses est du style : "voici une requête que vous n'avez jamais + envoyée, et la réponse vous parviendra bientôt tout de même ..."

    +

    Il y a cependant des conditions : le client peut désactiver cette + fonctionnalité et le serveur ne pourra alors lui proposer des réponses que + pour les requêtes qu'il a effectivement envoyées.

    +

    Cette fonctionnalité a pour but de permettre au serveur d'envoyer au + client des ressources dont il va probablement avoir besoin : par exemple une + ressource css ou javascript appartenant à une page html que le client a + demandée, un jeu d'images référencé par un css, etc...

    +

    Cette anticipation a pour avantage de permettre au client d'économiser le + temps qu'il lui aurait fallu pour envoyer une requête, quelques + millisecondes à une demi-seconde en fonction de l'éloignement du serveur. + Elle a cependant pour inconvénient d'imposer au client le téléchargement de + ressources qu'il possède peut-être déjà dans son cache. Bien entendu, HTTP/2 + permet d'annuler prématurément de telles requêtes, mais des ressources sont + tout de même gaspillées.

    +

    En résumé : il n'existe pas encore de stratégie efficace pour faire le + meilleur usage de cette fonctionnalité de HTTP/2 et tout le monde en est + encore au stade de l'expérimentation. À ce titre, voici des conseils pour + procéder vous-même à ces expérimentations :

    +

    mod_http2 inspecte l'en-tête de la réponse et recherche les + en-têtes Link sous un certain format :

    +
    Link </xxx.css>;rel=preload, </xxx.js>; rel=preload
    + +

    Si la connexion supporte PUSH, ces deux ressources seront envoyées au + client. En tant que développeur web vous pouvez définir ces en-têtes soit + directement au niveau de la réponse de votre application, soit en + configurant votre serveur via

    +
    <Location /xxx.html>
    +    Header add Link "</xxx.css>;rel=preload"
    +    Header add Link "</xxx.js>;rel=preload"
    +</Location>
    + +

    Si vous souhaitez utiliser des liens preload sans déclencher + de PUSH, vous pouvez utiliser le paramètre nopush comme suit :

    +
    Link </xxx.css>;rel=preload;nopush
    + +

    Vous pouvez aussi désactiver les PUSHes pour l'ensemble de votre + serveur via la directive

    +
    H2Push Off
    + +

    À savoir aussi :

    +

    Le module maintient un journal des ressources ayant fait l'objet d'un + PUSH pour chaque connexion (en général des condensés hash des URLs), et + n'effectuera pas deux fois un PUSH pour la même ressource. Cependant, + lorsque la connexion est fermée, le journal de ses PUSHes est supprimé.

    +

    Certains développeurs planchent sur la manière de permettre au client + d'informer le serveur des ressources qu'il possède déjà dans son cache afin + d'éviter les PUSHes pour ces dernières, mais ceci n'en est actuellement qu'à + un stade très expérimental.

    +

    L' + en-tête Accept-Push-Policy est un autre dispositif expérimental + implémenté dans mod_http2 ; il permet au client de définir pour + chaque requête quels genres de PUSHes il accepte.

    + + +

    + La fonctionnalité PUSH n'apportera pas toujours le gain de performances dans + l'obtention de réponses aux requêtes. Vous trouverez plusieurs études sur ce + sujet sur internet qui en expliquent les avantages et inconvénients et + comment les particularités des clients et du réseau en influencent le + fonctionnement. Par exemple, le seul fait que le serveur PUSHes une + ressource n'implique pas forcément que le navigateur l'utilisera.

    +

    Ce qui influence le plus la réponse PUSHed, c'est la requête qui a été + simulée. En effet, l'URL de la requête pour un PUSH est fournie par + l'application, mais d'où viennent les en-têtes ? Par exemple, La requête + PUSH requiert-elle un en-tête accept-language et si oui, quelle + sera sa valeur ?

    +

    httpd va consulter la requête originale (celle qui a déclenché le PUSH) + et copier les en-têtes suivants vers la requête PUSH : + user-agent, accept, accept-encoding, + accept-language et cache-control.

    +

    Tous les autres en-têtes sont ignorés. Les cookies eux non plus ne seront + pas copiés. PUSHer des ressources qui requièrent la présence d'un cookie ne + fonctionnera pas. Ceci peut être sujet à débat, mais tant que ce ne sera pas + clairement discuté avec les navigateurs, restons prudents et évitons + d'exposer les cookies là où ils ne sont pas censés être visibles.

    +
    top
    +
    +

    Suggestions précoces

    + +

    A l'instar des ressources PUSHées, une autre méthode consiste à envoyer + des en-têtes Link au client avant même que la réponse ne soit + prête. Cette méthode utilise la fonctionnalité appelée "Suggestions + précoces" (Early Hints) décrite dans la RFC 8297.

    +

    Pour utiliser cette fonctionnalité, vous devez l'activer explicitement + sur le serveur via :

    +
    H2EarlyHints on
    + +

    Elle n'est en effet pas activée par défaut car certains navigateurs + anciens perdent pied avec de telles réponses.

    +

    Une fois cette fonctionnalité activée, vous pouvez utiliser la directive + H2PushResource pour déclencher les + suggestions précoces et les PUSHes de ressources :

    +
    <Location /xxx.html>
    +    H2PushResource /xxx.css
    +    H2PushResource /xxx.js
    +</Location>
    + +

    Le serveur enverra alors au client une réponse "103 Early + Hints" dès qu'il commencera à traiter la requête. Selon + votre application web, cet envoi peut intervenir beaucoup plus tôt que le + moment où les premiers en-têtes de réponse auront été déterminés.

    +

    Si H2Push est activé, ceci + déclenchera aussi le PUSH juste après la réponse 103. Mais si H2Push n'est pas activé, la réponse 103 sera + quand-même envoyée au client.

    +
    +
    +

    Langues Disponibles:  en  | + es  | + fr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/index.html b/docs/manual/howto/index.html new file mode 100644 index 0000000..9a25dfa --- /dev/null +++ b/docs/manual/howto/index.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: index.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: index.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: index.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: index.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: index.html.zh-cn.utf8 +Content-Language: zh-cn +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/howto/index.html.en b/docs/manual/howto/index.html.en new file mode 100644 index 0000000..adee64c --- /dev/null +++ b/docs/manual/howto/index.html.en @@ -0,0 +1,170 @@ + + + + + +How-To / Tutorials - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    How-To / Tutorials

    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko  | + zh-cn 

    +
    +
    +
    top
    +
    +

    How-To / Tutorials

    + + + +
    +
    Authentication and Authorization
    +
    +

    Authentication is any process by which you verify that + someone is who they claim they are. Authorization is any + process by which someone is allowed to be where they want to + go, or to have information that they want to have.

    + +

    See: Authentication, Authorization

    +
    +
    + +
    +
    Access Control
    +
    +

    Access control refers to the process of restricting, or + granting access to a resource based on arbitrary criteria. There + are a variety of different ways that this can be + accomplished.

    + +

    See: Access Control

    +
    +
    + +
    +
    Dynamic Content with CGI
    +
    +

    The CGI (Common Gateway Interface) defines a way for a web + server to interact with external content-generating programs, + which are often referred to as CGI programs or CGI scripts. It + is a simple way to put dynamic content on + your web site. This document will be an introduction to setting + up CGI on your Apache web server, and getting started writing + CGI programs.

    + +

    See: CGI: Dynamic Content

    +
    +
    + +
    +
    .htaccess files
    +
    +

    .htaccess files provide a way to make configuration + changes on a per-directory basis. A file, containing one or more + configuration directives, is placed in a particular document directory, + and the directives apply to that directory, and all subdirectories thereof.

    + +

    See: .htaccess files

    +
    +
    + +
    +
    HTTP/2 with httpd
    +
    +

    HTTP/2 is the evolution of the world's most successful application layer protocol, HTTP. + It focuses on making more efficient use of network resources without changing the semantics of HTTP. + This guide explains how HTTP/2 is implemented in httpd, showing basic configurations tips and + best practices. +

    + +

    See: HTTP/2 guide

    +
    +
    + + +
    +
    Introduction to Server Side Includes
    +
    +

    SSI (Server Side Includes) are directives that are placed in + HTML pages, and evaluated on the server while the pages are + being served. They let you add dynamically generated content to + an existing HTML page, without having to serve the entire page + via a CGI program, or other dynamic technology.

    + +

    See: Server Side Includes (SSI)

    +
    +
    + +
    +
    Per-user web directories
    +
    +

    On systems with multiple users, each user can be permitted to have a + web site in their home directory using the UserDir directive. Visitors + to a URL http://example.com/~username/ will get content + out of the home directory of the user "username", out of + the subdirectory specified by the UserDir directive.

    + +

    See: User web directories (public_html)

    +
    +
    + +
    +
    Reverse Proxy guide
    +
    +

    Apache httpd has extensive capabilities as a reverse proxy server using the + ProxyPass directive as well as + BalancerMember to create sophisticated + reverse proxying implementations which provide for high-availability, load + balancing and failover, cloud-based clustering and dynamic on-the-fly reconfiguration.

    + +

    See: Reverse proxy guide

    +
    +
    + +
    +
    Rewriting URLs with mod_rewrite
    +
    +

    Rewriting URLs with (and without) + mod_rewrite tends to be one of the most + frequently asked topics on our mailing lists and IRC channels. + We have devoted and entire section of our + documentation to howtos and recipes around this topic.

    +
    +
    + +
    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko  | + zh-cn 

    +
    + \ No newline at end of file diff --git a/docs/manual/howto/index.html.es b/docs/manual/howto/index.html.es new file mode 100644 index 0000000..4ab633a --- /dev/null +++ b/docs/manual/howto/index.html.es @@ -0,0 +1,163 @@ + + + + + +How-To / Tutoriales - Servidor HTTP Apache Versión 2.4 + + + + + + + +
    <-
    +

    How-To / Tutoriales

    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + zh-cn 

    +
    +
    +
    top
    +
    +

    How-To / Tutoriales

    + + + +
    +
    Autenticación y Autorización
    +
    +

    Autenticación es un proceso en el cual se verifica + que alguien es quien afirma ser. Autorización es cualquier + proceso en el que se permite a alguien acceder donde quiere ir, + o a obtener la información que desea tener.

    + +

    Ver: Autenticación, Autorización

    +
    +
    + +
    +
    Control de Acceso
    +
    +

    Control de acceso hace referencia al proceso de restringir, o + garantizar el acceso a un recurso en base a un criterio arbitrario. + Esto se puede conseguir de distintas formas.

    + +

    Ver: Control de Acceso

    +
    +
    + +
    +
    Contenido Dinámico con CGI
    +
    +

    El CGI (Common Gateway Interface) es un método por el cual + un servidor web puede interactuar con programas externos de + generación de contenido, a ellos nos referimos comúnmente como + programas CGI o scripts CGI. Es un método sencillo para mostrar + contenido dinámico en tu sitio web. Este documento es una + introducción para configurar CGI en tu servidor web Apache, y de + inicio para escribir programas CGI.

    + +

    Ver: CGI: Contenido Dinámico

    +
    +
    + +
    +
    Ficheros .htaccess
    +
    +

    Los ficheros .htaccess facilitan una forma de + hacer configuraciones por-directorio. Un archivo, que + contiene una o más directivas de configuración, se coloca en un + directorio específico y las directivas especificadas solo aplican + sobre ese directorio y los subdirectorios del mismo.

    + +

    Ver: .htaccess files

    +
    +
    + +
    +
    HTTP/2 con httpd
    +
    +

    HTTP/2 es la evolución del protocolo de capa de aplicación más conocido, HTTP. + Se centra en hacer un uso más eficiente de los recursos de red sin cambiar la + semántica de HTTP. Esta guía explica como se implementa HTTP/2 en httpd, + mostrando buenas prácticas y consejos de configuración básica. +

    + +

    Ver: Guía HTTP/2

    +
    +
    + + +
    +
    Introducción a los SSI
    +
    +

    Los SSI (Server Side Includes) son directivas que se colocan + en las páginas HTML, y son evaluadas por el servidor mientras + éste las sirve. Le permiten añadir contenido generado + dinámicamente a una página HTML existente, sin tener que servir + la página entera a través de un programa CGI u otro método + dinámico.

    + +

    Ver: Server Side Includes (SSI)

    +
    +
    + +
    +
    Directorios web Por-usuario
    +
    +

    En sistemas con múltiples usuarios, cada usuario puede tener + su directorio "home" compartido usando la directiva + UserDir. Aquellos + que visiten la URL http://example.com/~username/ + obtendrán contenido del directorio del usuario "username" + que se encuentra en el directorio "home" del sistema.

    + +

    Ver: + Directorios Web de Usuario (public_html)

    +
    +
    + +
    +
    Guía de Proxy Inverso
    +
    +

    Apache httpd ofrece muchas posibilidades como proxy inverso. Usando la + directiva ProxyPass así como + BalancerMember puede crear + sofisticadas configuraciones de proxy inverso que proveen de alta + disponibilidad, balanceo de carga, clustering basado en la nube y + reconfiguración dinámica en caliente.

    + +

    Ver: Guía de Proxy Inverso

    +
    +
    + +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + zh-cn 

    +
    + \ No newline at end of file diff --git a/docs/manual/howto/index.html.fr.utf8 b/docs/manual/howto/index.html.fr.utf8 new file mode 100644 index 0000000..3f4a5a0 --- /dev/null +++ b/docs/manual/howto/index.html.fr.utf8 @@ -0,0 +1,178 @@ + + + + + +How-To / Tutoriels - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    How-To / Tutoriels

    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko  | + zh-cn 

    +
    +
    +
    top
    +
    +

    How-To / Tutoriels

    + + + +
    +
    Authentification et autorisation
    +
    +

    L'authentification représente tout processus par lequel vous + vérifiez si quelqu'un correspond bien à la personne qu'il + prétend être. L'autorisation représente tout processus + permettant de savoir si une personne est autorisée à aller là où + elle veut aller, ou à obtenir les informations qu'elle demande.

    + +

    Voir Authentification, Autorisation

    +
    +
    + +
    +
    Contrôle d'accès
    +
    +

    Le contrôle d'accès se réfère au processus permettant + d'interdire ou d'accorder l'accès à une ressource en fonction de + certains critères, et il existe de nombreuses façons d'y + parvenir.

    + +

    Voir Contrôle d'accès

    +
    +
    + +
    +
    Contenu dynamique avec CGI
    +
    +

    L'interface CGI (Common Gateway Interface) + fournit au serveur web une méthode d'interaction avec des + programmes externes générateurs de contenu, souvent nommés + programmes CGI ou scripts CGI. Il s'agit d'une méthode + simple permettant d'ajouter du contenu + dynamique à votre site web. Ce document se veut une introduction + à la configuration de CGI sur votre serveur web Apache et à + l'écriture de programmes CGI.

    + +

    Voir CGI : contenu dynamique

    +
    +
    + +
    +
    Fichiers .htaccess
    +
    +

    Les fichiers .htaccess permettent de modifier la + configuration du serveur au niveau de chaque répertoire. À cet + effet, un fichier est placé dans un répertoire particulier du site + web, et les directives de configuration qu'il contient s'appliquent à ce + répertoire et à tous ses sous-répertoires.

    + +

    Voir Fichiers .htaccess

    +
    +
    + +
    +
    HTTP/2 avec httpd
    +
    +

    HTTP/2 est une évolution du protocole de la couche application le plus + connu au monde, HTTP. Les efforts se sont concentrés sur une amélioration + de l'efficacité de l'utilisation des ressources réseau sans modifier la + sémantique de HTTP. Ce guide explique la manière dont HTTP/2 est + implémenté dans httpd, donne des conseils pour une configuration de base + ainsi qu'une liste de recommandations. +

    + +

    Voir le guide HTTP/2

    +
    +
    + +
    +
    Introduction au Inclusions côté Serveur (Server Side Includes + ou SSI)
    +
    +

    Les SSI sont des directives que l'on place dans des pages + HTML, et qui sont évaluées par le serveur lorsque ces pages sont + servies. Elles vous permettent d'ajouter du contenu généré + dynamiquement à une page HTML existante, sans avoir à servir + l'intégralité de la page via un programme CGI, ou toute autre + technologie dynamique.

    + +

    Voir Server Side Includes (SSI)

    +
    +
    + +
    +
    Répertoires web de l'utilisateur
    +
    +

    Sur les systèmes multi-utilisateurs, vous pouvez permettre à + chaque utilisateur d'avoir un site web dans son répertoire home + via la directive UserDir. Les visiteurs de l'URL + http://example.com/~nom-utilisateur/ vont recevoir + du contenu situé dans le répertoire home de l'utilisateur + "nom-utilisateur", et dans le sous-répertoire + spécifié par la directive UserDir.

    + +

    Voir Répertoires web des utilisateurs (public_html)

    +
    +
    +
    +
    Mandataires inverses
    +
    +

    Apache httpd possède des fonctionnalités évoluées de serveur + mandataire inverse via ses directives ProxyPass et BalancerMember qui permettent + d'implémenter un système de mandataire inverse sophistiqué garantissant + une haute disponibilité, une répartition et une réattribution de charge, + un regroupement de serveurs en grappe (clustering) basé sur le cloud et + une reconfiguration dynamique à la volée.

    + +

    Voir le Guide de configuration des + mandataires inverses

    +
    +
    + +
    +
    Réécriture d'URLs avec mod_rewrite
    +
    +

    La réécriture d'URLs avec (ou sans) mod_rewrite devient + l'une des questions les plus fréquentes posées dans nos listes de + diffusion et nos canaux IRC. C'est pourquoi nous avons dédié une section entière de notre documentation à des + howtos et recettes sur ce sujet.

    +
    +
    + +
    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko  | + zh-cn 

    +
    + \ No newline at end of file diff --git a/docs/manual/howto/index.html.ja.utf8 b/docs/manual/howto/index.html.ja.utf8 new file mode 100644 index 0000000..e09ee2f --- /dev/null +++ b/docs/manual/howto/index.html.ja.utf8 @@ -0,0 +1,132 @@ + + + + + +How-To / ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ« - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    How-To / ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«

    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko  | + zh-cn 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    +
    +
    top
    +
    +

    How-To / ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«

    + + + +
    +
    èªè¨¼ã¨æ‰¿èª
    +
    +

    èªè¨¼ã¨ã¯ã€èª°ã‹ãŒè‡ªåˆ†ã¯èª°ã§ã‚ã‚‹ã‹ã‚’åä¹—ã£ã¦ã„ã‚‹ã‚‚ã®ã‚’検証ã™ã‚‹ + 処ç†ã®ã“ã¨ã§ã™ã€‚承èªã¨ã¯ã€èª°ã‹ãŒæœ›ã¿ã®å ´æ‰€ã«è¾¿ã‚Šç€ã‘ãŸã‚Šã€ + 望ã¿ã®æƒ…報を手ã«å…¥ã‚ŒãŸã‚Šã™ã‚‹ã“ã¨ã‚’許å¯ã™ã‚‹å‡¦ç†ã®ã“ã¨ã§ã™ã€‚

    + +

    å‚ç…§: èªè¨¼ã¨æ‰¿èª

    +
    +
    + +
    +
    アクセス制御
    +
    +

    アクセス制御ã¯ã€ã•ã¾ã–ã¾ãªæ¡ä»¶ã§ãƒªã‚½ãƒ¼ã‚¹ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚»ã‚¹ã‚’ + 許å¯ã—ãŸã‚Šåˆ¶é™ã—ãŸã‚Šã™ã‚‹ã“ã¨ã‚’指ã—ã¾ã™ã€‚ + å®Ÿç¾æ–¹æ³•ã«ã¯æ§˜ã€…ãªç•°ãªã‚‹æ‰‹æ³•ãŒã‚りã¾ã™ã€‚

    + +

    å‚ç…§: アクセス制御

    +
    +
    + +
    +
    CGI ã«ã‚ˆã‚‹å‹•的コンテンツ
    +
    +

    CGI (Common Gateway Interface) ã¯ã‚¦ã‚§ãƒ–サーãƒãŒå¤–部ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ + 生æˆãƒ—ログラムã¨ã©ã®ã‚ˆã†ã«ç›¸äº’動作をã™ã‚‹ã‹ã‚’定義ã—ã¾ã™ã€‚ + ãã®å¤–部プログラムã¯é€šå¸¸ CGI プログラムや CGI スクリプトã¨å‘¼ã°ã‚Œã¾ã™ã€‚ + CGI ã¯ã‚¦ã‚§ãƒ–サイトã«å‹•çš„ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„を追加ã™ã‚‹ãŸã‚ã®ã€ + å˜ç´”ãªæ–¹æ³•ã§ã™ã€‚ã“ã®æ–‡æ›¸ã¯ Apache ウェブサーãƒã« + CGI を設定ã—ã€CGI プログラムを書ãå§‹ã‚ã‚‹ãŸã‚ã®ã‚¤ãƒ³ãƒˆãƒ­ãƒ€ã‚¯ã‚·ãƒ§ãƒ³ã§ã™ã€‚

    + +

    å‚ç…§: CGI: 動的コンテンツ

    +
    +
    + +
    +
    .htaccess ファイル
    +
    +

    .htaccess ファイルã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ¯Žã«è¨­å®šã‚’変更ã™ã‚‹ãŸã‚ã® + 方法をæä¾›ã—ã¾ã™ã€‚è¨­å®šãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ãŒæ›¸ã‹ã‚ŒãŸãƒ•ァイルãŒã€ã‚るドキュメント + ディレクトリã«ç½®ã‹ã‚Œã‚‹ã¨ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã¯ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ + ã™ã¹ã¦ã®ã‚µãƒ–ディレクトリã«é©ç”¨ã•れã¾ã™ã€‚

    + +

    å‚ç…§: .htaccess ファイル

    +
    +
    + +
    +
    Server Side Includes イントロダクション
    +
    +

    SSI (Server Side Includes) 㯠HTML ãƒšãƒ¼ã‚¸ä¸­ã«æ›¸ã‹ã‚Œã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã§ã€ + ページãŒé€ã‚‰ã‚Œã‚‹æ™‚ã«ã‚µãƒ¼ãƒã«ã‚ˆã‚Šè©•価ã•れã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€ãƒšãƒ¼ã‚¸å…¨ä½“ã‚’ + CGI プログラムã§ç”Ÿæˆã—ãŸã‚Šã€ä»–ã®å‹•çš„ãªæŠ€è¡“ã‚’ä½¿ã†ã“ã¨ãªãã€æ—¢å­˜ã® HTML + ページã«å‹•çš„ã«ç”Ÿæˆã•れãŸå†…容を付加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    å‚ç…§: Server Side Includes (SSI)

    +
    +
    + +
    +
    ユーザ毎ã®ã‚¦ã‚§ãƒ–ディレクトリ
    +
    +

    複数ユーザã®å­˜åœ¨ã™ã‚‹ã‚·ã‚¹ãƒ†ãƒ ã§ã¯ã€ãれãžã‚Œã®ãƒ¦ãƒ¼ã‚¶ã¯ UserDir ディレクティブを使ã†ã“ã¨ã«ã‚ˆã£ã¦ + ホームディレクトリ上ã«ã‚¦ã‚§ãƒ–サイトを作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + URL http://example.com/~username/ を訪れãŸäººã¯ + ユーザ "username" ã®ãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ã€UserDir ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã§æŒ‡å®šã•れ㟠+ サブディレクトリã‹ã‚‰ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’å¾—ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚

    + +

    å‚ç…§: ユーザウェブディレクトリ (public_html)

    +
    +
    + +
    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko  | + zh-cn 

    +
    + \ No newline at end of file diff --git a/docs/manual/howto/index.html.ko.euc-kr b/docs/manual/howto/index.html.ko.euc-kr new file mode 100644 index 0000000..715bdcf --- /dev/null +++ b/docs/manual/howto/index.html.ko.euc-kr @@ -0,0 +1,124 @@ + + + + + +How-To / ÅõÅ丮¾ó - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    How-To / ÅõÅ丮¾ó

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + zh-cn 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    +
    +
    top
    +
    +

    How-To / ÅõÅ丮¾ó

    + + + +
    +
    ÀÎÁõ
    +
    +

    ÀÎÁõ(authentication)Àº ÀÚ½ÅÀÌ ´©±¸¶ó°í ÁÖÀåÇÏ´Â »ç¶÷À» + È®ÀÎÇÏ´Â ÀýÂ÷ÀÌ´Ù. ±ÇÇѺο©(authorization)´Â °¡°í ½ÍÀº + °÷À¸·Î °¡µµ·Ï ȤÀº ¿øÇÏ´Â Á¤º¸¸¦ ¾òµµ·Ï Çã¿ëÇÏ´Â °úÁ¤ÀÌ´Ù.

    + +

    Âü°í: ÀÎÁõ, ±ÇÇѺο©, Á¢±ÙÁ¦¾î

    +
    +
    + +
    +
    CGI¸¦ »ç¿ëÇÑ µ¿Àû ÆäÀÌÁö »ý¼º
    +
    +

    CGI (Common Gateway Interface)´Â À¥¼­¹ö°¡ º¸Åë CGI + ÇÁ·Î±×·¥ ȤÀº CGI ½ºÅ©¸³Æ®ÇÏ°í ºÎ¸£´Â, (À¥ÆäÀÌÁö ³»¿ëÀ» + ¸¸µå´Â) ¿ÜºÎ ÇÁ·Î±×·¥°ú »óÈ£ÀÛ¿ëÇÏ´Â ¹æ¹ýÀ» Á¤ÀÇÇÑ´Ù. + À¥»çÀÌÆ®¿¡¼­ µ¿ÀûÀÎ ÆäÀÌÁö¸¦ ¸¸µå´Â °¡Àå ÈçÇÏ°í °£´ÜÇÑ + ¹æ¹ýÀÌ´Ù. ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡ À¥¼­¹ö¿¡ CGI¸¦ ±¸¼ºÇÏ´Â ¹æ¹ýÀ» + ¼Ò°³Çϰí, CGI ÇÁ·Î±×·¥À» ÀÛ¼ºÇغ»´Ù.

    + +

    Âü°í: CGI: µ¿Àû ÆäÀÌÁö »ý¼º

    +
    +
    + +
    +
    .htaccess ÆÄÀÏ
    +
    +

    .htaccess ÆÄÀÏÀ» »ç¿ëÇÏ¿© µð·ºÅ丮º°·Î + ¼³Á¤À» º¯°æÇÒ ¼ö ÀÖ´Ù. ¿©·¯ ¼³Á¤ Áö½Ã¾î°¡ ÀÖ´Â ÆÄÀÏÀ» + ƯÁ¤ ¹®¼­ µð·ºÅ丮¿¡ µÎ¸é, ±× µð·ºÅ丮¿Í ¸ðµç ÇÏÀ§µð·ºÅ丮¿¡ + Áö½Ã¾î¸¦ Àû¿ëÇÑ´Ù.

    + +

    Âü°í: .htaccess + ÆÄÀÏ

    +
    +
    + +
    +
    Server Side Includes ¼Ò°³
    +
    +

    SSI (Server Side Includes)´Â HTML ÆäÀÌÁö¿¡ »ç¿ëÇÏ´Â + Áö½Ã¾î·Î, ÆäÀÌÁö¸¦ ¼­ºñ½ºÇÒ¶§ ¼­¹ö°¡ ó¸®ÇÑ´Ù. SSI¸¦ + »ç¿ëÇϸé CGI ÇÁ·Î±×·¥À̳ª ´Ù¸¥ µ¿ÀûÀÎ ±â¼ú·Î ÆäÀÌÁö + Àüü¸¦ ¸¸µé¾î¼­ ¼­ºñ½ºÇÏÁö ¾Ê°íµµ HTML ÆäÀÌÁö¿¡ µ¿ÀûÀ¸·Î + »ý¼ºÇÑ ³»¿ëÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Ù.

    + +

    Âü°í: Server Side Includes (SSI)

    +
    +
    + +
    +
    »ç¿ëÀÚº° À¥µð·ºÅ丮
    +
    +

    ¿©·¯ »ç¿ëÀÚ°¡ ÀÖ´Â ½Ã½ºÅÛ¿¡¼­ UserDir Áö½Ã¾î¸¦ »ç¿ëÇϸé + °¢ »ç¿ëÀÚ´Â ÀÚ½ÅÀÇ È¨µð·ºÅ丮 ¾È¿¡ À¥»çÀÌÆ®¸¦ ¸¸µé ¼ö + ÀÖ´Ù. URL http://example.com/~username/¿¡ + Á¢±ÙÇÏ¸é »ç¿ëÀÚ "username"ÀÇ È¨µð·ºÅ丮¿¡¼­ + UserDir + Áö½Ã¾î·Î ÁöÁ¤ÇÑ ÇÏÀ§µð·ºÅ丮¿¡ ÀÖ´Â ÆäÀÌÁö¸¦ °¡Á®¿À°Ô + µÈ´Ù.

    + +

    Âü°í: »ç¿ëÀÚ À¥µð·ºÅ丮 + (public_html)

    +
    +
    + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + zh-cn 

    +
    + \ No newline at end of file diff --git a/docs/manual/howto/index.html.zh-cn.utf8 b/docs/manual/howto/index.html.zh-cn.utf8 new file mode 100644 index 0000000..8ee18b6 --- /dev/null +++ b/docs/manual/howto/index.html.zh-cn.utf8 @@ -0,0 +1,121 @@ + + + + + +å¸¸è§æ“作/教程 - Apache HTTP æœåС噍 版本 2.4 + + + + + + + +
    <-
    +

    å¸¸è§æ“作/教程

    +
    +

    å¯ç”¨è¯­è¨€:  en  | + es  | + fr  | + ja  | + ko  | + zh-cn 

    +
    +
    此翻译å¯èƒ½è¿‡æœŸã€‚è¦äº†è§£æœ€è¿‘的更改,请阅读英文版。
    +
    +
    top
    +
    +

    å¸¸è§æ“作/教程

    + + + +
    +
    认è¯ä¸ŽæŽˆæƒ
    +
    +

    è®¤è¯æ˜¯ä½ éªŒè¯æŸäººæ˜¯æ‰€å£°ç§°çš„人。 + æŽˆæƒæ˜¯å…许æŸäººæ‰§è¡Œä»–想è¦çš„æ“ä½œï¼Œæˆ–è€…èŽ·å¾—æƒ³è¦çš„ä¿¡æ¯ã€‚

    + +

    å‚è§: 认è¯ï¼ŒæŽˆæƒä¸Žè®¿é—®æŽ§åˆ¶

    +
    +
    + +
    +
    访问控制
    +
    +

    访问控制是æ“作é™åˆ¶ï¼Œæˆ–åŸºäºŽä»»æ„æ¡ä»¶è®¿é—®èµ„æºã€‚è¿™å¯ä»¥é€šè¿‡å¤šç§æ–¹æ³•完æˆã€‚

    + + +
    +
    + +
    +
    CGI 与动æ€å†…容
    +
    +

    CGI (通用网管接å£) 为 web æœåŠ¡å™¨å®šä¹‰äº†ä¸Žå¤–éƒ¨çš„å†…å®¹ç”Ÿæˆç¨‹åºçš„æ“ä½œæŽ¥å£ï¼Œ + 通常称为 CGI ç¨‹åºæˆ– CGI 脚本。它是在 web 站点放入动æ€å†…容的最简å•, + 也最常用的方法。 本文简å•介ç»äº†åœ¨ Apache æœåС噍䏭é…ç½® CGI 的方法, + 以åŠå¦‚何编写 CGI 程åºã€‚

    + +

    å‚è§: CGI 与动æ€å†…容

    +
    +
    + +
    +
    .htaccess 文件
    +
    +

    .htaccess files provide a way to make configuration + changes on a per-directory basis. A file, containing one or more + configuration directives, is placed in a particular document directory, + and the directives apply to that directory, and all subdirectories thereof.

    + +

    See: .htaccess files

    +
    +
    + +
    +
    æœåŠ¡å™¨ç«¯æ’入简介
    +
    +

    SSI (æœåŠ¡å™¨ç«¯æ’å…¥) 是在 HTML 页é¢ä¸­æ”¾å…¥çš„æŒ‡ä»¤ï¼Œåœ¨é¡µé¢è¢«è®¿é—®çš„æ—¶å€™æ‰§è¡Œã€‚ + 它å…许你在现有的 HTML 页é¢å¢žåŠ åŠ¨æ€ç”Ÿæˆçš„内容,ä¸éœ€è¦é€šè¿‡ CGI + ç¨‹åºæˆ–其它动æ€è®¡æ•°æ¥ç”Ÿæˆæ•´ä¸ªé¡µé¢ã€‚

    + +

    å‚è§: æœåŠ¡å™¨ç«¯æ’å…¥ (SSI)

    +
    +
    + +
    +
    用户ç§äººç½‘站目录
    +
    +

    在有多个用户的系统中,使用 UserDir 指令,å¯ä»¥å…许æ¯ä¸ªç”¨æˆ·åœ¨ä»–们的根目录中都有一个 + web 站点。 访问 URL http://example.com/~username/ 会得到ä½äºŽç”¨æˆ· + "username" 根目录中由 UserDir 指定的å­ç›®å½•中的内容。

    + +

    å‚è§: 用户ç§äººç½‘站目录 (public_html)

    +
    +
    + +
    +
    +

    å¯ç”¨è¯­è¨€:  en  | + es  | + fr  | + ja  | + ko  | + zh-cn 

    +
    + \ No newline at end of file diff --git a/docs/manual/howto/public_html.html b/docs/manual/howto/public_html.html new file mode 100644 index 0000000..bd099f3 --- /dev/null +++ b/docs/manual/howto/public_html.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: public_html.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: public_html.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: public_html.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: public_html.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: public_html.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: public_html.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/howto/public_html.html.en b/docs/manual/howto/public_html.html.en new file mode 100644 index 0000000..440e8ae --- /dev/null +++ b/docs/manual/howto/public_html.html.en @@ -0,0 +1,218 @@ + + + + + +Per-user web directories - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Per-user web directories

    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    On systems with multiple users, each user can be permitted to have a + web site in their home directory using the UserDir directive. Visitors + to a URL http://example.com/~username/ will get content + out of the home directory of the user "username", out of + the subdirectory specified by the UserDir directive.

    +

    Note that, by default, access to these directories is not + enabled. You can enable access when using UserDir by uncommenting the line:

    +
    #Include conf/extra/httpd-userdir.conf
    + +

    in the default config file conf/httpd.conf, and adapting the httpd-userdir.conf + file as necessary, or by including the appropriate directives in a + <Directory> block + within the main config file.

    +
    + +
    top
    +
    top
    +
    +

    Setting the file path with UserDir

    + + +

    The UserDir + directive specifies a directory out of which per-user + content is loaded. This directive may take several different forms.

    + +

    If a path is given which does not start with a leading slash, it is + assumed to be a directory path relative to the home directory of the + specified user. Given this configuration:

    + +
    UserDir public_html
    + + +

    the URL http://example.com/~rbowen/file.html will be + translated to the file path + /home/rbowen/public_html/file.html

    + +

    If a path is given starting with a slash, a directory path will be + constructed using that path, plus the username specified. Given this + configuration:

    + +
    UserDir /var/html
    + + +

    the URL http://example.com/~rbowen/file.html will be + translated to the file path /var/html/rbowen/file.html

    + +

    If a path is provided which contains an asterisk (*), a path is used + in which the asterisk is replaced with the username. Given this + configuration:

    + +
    UserDir /var/www/*/docs
    + + +

    the URL http://example.com/~rbowen/file.html will be + translated to the file path + /var/www/rbowen/docs/file.html

    + +

    Multiple directories or directory paths can also be set.

    + +
    UserDir public_html /var/html
    + + +

    For the URL http://example.com/~rbowen/file.html, + Apache will search for ~rbowen. If it isn't found, + Apache will search for rbowen in /var/html. If + found, the above URL will then be translated to the file path + /var/html/rbowen/file.html

    + +
    top
    +
    +

    Redirecting to external URLs

    + +

    The UserDir directive can be + used to redirect user directory requests to external URLs.

    + +
    UserDir http://example.org/users/*/
    + + +

    The above example will redirect a request for + http://example.com/~bob/abc.html to + http://example.org/users/bob/abc.html.

    +
    top
    +
    +

    Restricting what users are permitted to use this + feature

    + + +

    Using the syntax shown in the UserDir documentation, you can restrict + what users are permitted to use this functionality:

    + +
    UserDir disabled root jro fish
    + + +

    The configuration above will enable the feature for all users + except for those listed in the disabled statement. + You can, likewise, disable the feature for all but a few users by + using a configuration like the following:

    + +
    UserDir disabled
    +UserDir enabled rbowen krietz
    + + +

    See UserDir + documentation for additional examples.

    + +
    top
    +
    +

    Enabling a cgi directory for each user

    + + +

    In order to give each user their own cgi-bin directory, you can use + a <Directory> + directive to make a particular subdirectory of a user's home directory + cgi-enabled.

    + +
    <Directory "/home/*/public_html/cgi-bin/">
    +    Options ExecCGI
    +    SetHandler cgi-script
    +</Directory>
    + + +

    Then, presuming that UserDir is set to + public_html, a cgi program example.cgi + could be loaded from that directory as:

    + +

    + http://example.com/~rbowen/cgi-bin/example.cgi +

    + +
    top
    +
    +

    Allowing users to alter configuration

    + + +

    If you want to allows users to modify the server configuration in + their web space, they will need to use .htaccess files to + make these changes. Ensure that you have set AllowOverride to a + value sufficient for the directives that you want to permit the users + to modify. See the .htaccess tutorial for + additional details on how this works.

    + +
    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/public_html.html.es b/docs/manual/howto/public_html.html.es new file mode 100644 index 0000000..60bac3a --- /dev/null +++ b/docs/manual/howto/public_html.html.es @@ -0,0 +1,216 @@ + + + + + +Directorios web por usuario - Servidor HTTP Apache Versión 2.4 + + + + + + + +
    <-
    +

    Directorios web por usuario

    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    En sistemas con múltiples usuarios, cada usuario puede tener un website + en su directorio home usando la directiva UserDir. Los visitantes de una URL + http://example.com/~username/ recibirán el contenido del + directorio home del usuario "username", en el subdirectorio + especificado por la directiva UserDir.

    + +

    Tenga en cuenta que, por defecto, el acceso a estos directorios + NO está activado. Puede permitir acceso cuando usa + UserDir quitando el comentario de la línea:

    + +
    #Include conf/extra/httpd-userdir.conf
    + + +

    En el fichero por defecto de configuración conf/httpd.conf, + y adaptando el fichero httpd-userdir.conf según sea necesario, + o incluyendo las directivas apropiadas en un bloque + <Directory> dentro del fichero + principal de configuración.

    +
    + +
    top
    +
    +

    Directorios web por usuario

    + + +
    top
    +
    +

    Configurando la ruta del fichero con UserDir

    + + +

    La directiva UserDir + especifica un directorio del que cargar contenido por usuario. Esta directiva + puede tener muchas formas distintas.

    + +

    Si se especifica una ruta que no empieza con una barra ("/"), se asume que + va a ser una ruta de directorio relativa al directorio home del usuario + especificado. Dada ésta configuración:

    + +
    UserDir public_html
    + + +

    La URL http://example.com/~rbowen/file.html se traducirá en + la ruta del fichero /home/rbowen/public_html/file.html

    + +

    Si la ruta que se especifica comienza con una barra ("/"), la ruta del + directorio se construirá usando esa ruta, más el usuario especificado en la + configuración:

    + +
    UserDir /var/html
    + + +

    La URL http://example.com/~rbowen/file.html se traducirá en + la ruta del fichero /var/html/rbowen/file.html

    + +

    Si se especifica una ruta que contiene un asterisco (*), se usará una ruta + en la que el asterisco se reemplaza con el nombre de usuario. Dada ésta configuración:

    + +
    UserDir /var/www/*/docs
    + + +

    La URL http://example.com/~rbowen/file.html se traducirá en + la ruta del fichero /var/www/rbowen/docs/file.html

    + +

    También se pueden configurar múltiples directorios o rutas de directorios.

    + +
    UserDir public_html /var/html
    + + +

    Para la URL http://example.com/~rbowen/file.html, + Apache buscará ~rbowen. Si no lo encuentra, Apache buscará + rbowen en /var/html. Si lo encuentra, la URL de más + arriba se traducirá en la ruta del fichero + /var/html/rbowen/file.html

    + +
    top
    +
    +

    Redirigiendo a URLs externas

    + +

    La directiva UserDir puede + usarse para redirigir solcitudes de directorios de usuario a URLs externas.

    + +
    UserDir http://example.org/users/*/
    + + +

    El ejemplo de aquí arriba redirigirá una solicitud para + http://example.com/~bob/abc.html hacia + http://example.org/users/bob/abc.html.

    +
    top
    +
    +

    Restringiendo qué usuarios pueden usar esta característica

    + + +

    Usando la sintaxis que se muestra en la documentación de UserDir, usted + puede restringir a qué usuarios se les permite usar esta funcionalidad:

    + +
    UserDir disabled root jro fish
    + + +

    La configuración de aquí arriba permitirá a todos los usuarios excepto a + los que se listan con la declaración disabled. Usted puede, + del mismo modo, deshabilitar esta característica para todos excepto algunos + usuarios usando una configuración como la siguiente:

    + +
    UserDir disabled
    +UserDir enabled rbowen krietz
    + + +

    Vea la documentación de UserDir para más + ejemplos.

    + +
    top
    +
    +

    Activando un directorio cgi para cada usuario

    + + +

    Para dar a cada usuario su propio directorio cgi-bin, puede usar una directiva + <Directory> + para activar cgi en un subdirectorio en particular del directorio home del usuario.

    + +
    <Directory "/home/*/public_html/cgi-bin/">
    +    Options ExecCGI
    +    SetHandler cgi-script
    +</Directory>
    + + +

    Entonces, asumiendo que UserDir está configurado con la + declaración public_html, un programa cgi example.cgi + podría cargarse de ese directorio así:

    + +

    + http://example.com/~rbowen/cgi-bin/example.cgi +

    + +
    top
    +
    +

    Permitiendo a usuarios cambiar la configuración

    + + +

    Si quiere permitir que usuarios modifiquen la configuración del servidor en + su espacio web, necesitarán usar ficheros .htaccess para hacer + estos cambios. Asegúrese de tener configurado AllowOverride con un valor suficiente que permita a + los usuarios modificar las directivas que quiera permitir. + Vea el tutorial de .htaccess para obtener detalles adicionales sobre cómo funciona.

    + +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comentarios

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/public_html.html.fr.utf8 b/docs/manual/howto/public_html.html.fr.utf8 new file mode 100644 index 0000000..2455e2e --- /dev/null +++ b/docs/manual/howto/public_html.html.fr.utf8 @@ -0,0 +1,235 @@ + + + + + +Répertoires web utilisateurs - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Répertoires web utilisateurs

    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Sur les systèmes multi-utilisateurs, on peut permettre à chaque +utilisateur d'avoir un site web dans son répertoire home à l'aide de la +directive UserDir. Les +visiteurs de l'URL http://example.com/~nom_utilisateur/ +recevront un contenu situé dans le répertoire home de l'utilisateur +"nom_utilisateur", et dans le sous-répertoire spécifié par +la directive UserDir.

    +

    Notez que par défaut, l'accès à ces répertoires n'est +pas permis. Vous pouvez en permettre l'accès à l'aide +de la directive UserDir en +décommentant la ligne :

    +
    #Include conf/extra/httpd-userdir.conf
    + +

    dans le fichier de configuration par défaut + conf/httpd.conf, et en adaptant le + fichier httpd-userdir.conf selon vos besoins, ou en + incluant les directives appropriées dans une section + <Directory> du fichier de + configuration principal.

    +
    + +
    top
    +
    +

    Répertoires web utilisateurs

    + + +
    top
    +
    +

    Définition du chemin des fichiers avec UserDir

    + + +

    La directive UserDir + permet de spécifier un répertoire à partir duquel le contenu de + l'utilisateur pourra être chargé. Elle peut revêtir plusieurs + formes.

    + +

    Si le chemin spécifié ne commence pas par un slash, il sera + interprété comme chemin relatif au répertoire home de l'utilisateur + considéré. Par exemple, avec cette configuration :

    + +
    UserDir public_html
    + + +

    l'URL http://example.com/~rbowen/fichier.html + correspondra au chemin fichier + /home/rbowen/public_html/fichier.html

    + +

    Si le chemin spécifié commence par un slash, le chemin du fichier + sera construit en utilisant ce chemin, suivi du nom de l'utilisateur + considéré. Par exemple, avec cette configuration :

    + +
    UserDir /var/html
    + + +

    l'URL http://example.com/~rbowen/fichier.html + correspondra au chemin fichier + /var/html/rbowen/fichier.html

    + +

    Si le chemin spécifié contient un astérisque (*), ce dernier sera + remplacé par le nom de l'utilisateur dans le chemin du fichier + correspondant. Par exemple, avec cette configuration :

    + +
    UserDir /var/www/*/docs
    + + +

    l'URL http://example.com/~rbowen/fichier.html + correspondra au chemin fichier + /var/www/rbowen/docs/fichier.html

    + +

    On peut aussi définir plusieurs répertoires ou chemins de + répertoires.

    + +
    UserDir public_html /var/html
    + + +

    Avec l'URL http://example.com/~rbowen/fichier.html, + Apache va rechercher ~rbowen. S'il ne le trouve pas, + Apache va rechercher rbowen dans + /var/html. S'il le trouve, l'URL ci-dessus correspondra + au chemin fichier /var/html/rbowen/file.html

    + +
    top
    +
    +

    Redirection vers des URLs externes

    + +

    On peut utiliser la directive UserDir pour rediriger les requêtes + relatives aux répertoires utilisateurs vers des URLs externes.

    + +
    UserDir http://example.org/users/*/
    + + +

    L'exemple ci-dessus va rediriger une requête pour + http://example.com/~bob/abc.html vers + http://exemple.org/users/bob/abc.html.

    +
    top
    +
    +

    Définition de la liste des utilisateurs autorisés à utiliser + cette fonctionnalité

    + + +

    En suivant la syntaxe décrite dans la documentation de UserDir, + vous pouvez définir quels utilisateurs sont autorisés à utiliser + cette fonctionnalité :

    + +
    UserDir disabled root jro fish
    + + +

    La configuration ci-dessus va autoriser l'utilisation de la + fonctionnalité pour tous les utilisateurs, à l'exception de ceux + listés à la suite de l'argument disabled. De même, vous + pouvez interdire l'utilisation de la fonctionnalité à tous les + utilisateurs sauf certains d'entre eux en utilisant une + configuration du style :

    + +
    UserDir disabled
    +UserDir enabled rbowen krietz
    + + +

    Vous trouverez d'autres exemples dans la documentation de + UserDir.

    + +
    top
    +
    +

    Définition d'un répertoire CGI pour chaque utilisateur

    + + +

    Afin de réserver un répertoire cgi-bin pour chaque utilisateur, + vous pouvez utiliser une section <Directory> pour activer CGI dans un + sous-répertoire particulier d'un répertoire home utilisateur.

    + +
    <Directory "/home/*/public_html/cgi-bin/">
    +    Options ExecCGI
    +    SetHandler cgi-script
    +</Directory>
    + + +

    Avec la configuration ci-dessus, et en supposant que + UserDir est défini à public_html, un + programme CGI exemple.cgi pourra être chargé depuis ce + répertoire en passant par l'URL :

    + +

    + http://example.com/~rbowen/cgi-bin/exemple.cgi +

    + +
    top
    +
    +

    Permettre aux utilisateurs de modifier la + configuration

    + + +

    Si vous voulez que vos utilisateurs puissent modifier la + configuration du serveur pour ce qui concerne leur espace web, ils + devront utiliser des fichiers .htaccess pour effectuer + ces modifications. Assurez-vous d'avoir défini la directive + AllowOverride à une valeur + appropriée pour les directives dont vous voulez permettre la + modification aux utilisateurs. Voir le tutoriel .htaccess pour plus de détails sur + la manière dont tout ceci fonctionne.

    + +
    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/public_html.html.ja.utf8 b/docs/manual/howto/public_html.html.ja.utf8 new file mode 100644 index 0000000..9b2407a --- /dev/null +++ b/docs/manual/howto/public_html.html.ja.utf8 @@ -0,0 +1,228 @@ + + + + + +ユーザ毎ã®ã‚¦ã‚§ãƒ–ディレクトリ - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    ユーザ毎ã®ã‚¦ã‚§ãƒ–ディレクトリ

    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + +

    複数ã®ãƒ¦ãƒ¼ã‚¶ã®ã„るシステムã§ã¯ã€UserDir ディレクティブを使ã£ã¦ + å„ユーザãŒãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚¦ã‚§ãƒ–サイトを構築ã§ãるよã†ã«è¨­å®šã™ã‚‹ã“ã¨ãŒ + å¯èƒ½ã§ã™ã€‚URL http://example.com/~username/ を訪れãŸäººã¯ + "username" ã¨ã„ã†ãƒ¦ãƒ¼ã‚¶ã® UserDir ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã§æŒ‡å®šã•れ㟠+ サブディレクトリã‹ã‚‰ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’å¾—ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚

    + +

    in the default config file, and adapting the httpd-userdir.conf + file as necessary, or by including the appropriate directives in a + Directory block within the main config file.

    +

    デフォルトã§ã¯ã“れらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯è¨±å¯ã•れã¦ã„ã¾ã›ã‚“。 + UserDir を使ã£ã¦æœ‰åйã«ã§ãã¾ã™ã€‚ + 有効ã«ã™ã‚‹ã«ã¯ã€ãƒ‡ãƒ•ォルトã®è¨­å®šãƒ•ァイルã§ä»˜éšã™ã‚‹ + httpd-userdir.conf ファイルãŒå¿…è¦ã§ã€ + ãã®ä¸­ã®æ¬¡ã®è¡Œã®ã‚³ãƒ¡ãƒ³ãƒˆã‚¢ã‚¦ãƒˆã‚’外ã—ã¦æœ‰åйã«ã™ã‚‹ã‹ã€ +

    +

    + #Include conf/extra/httpd-userdir.conf +

    +

    ã‚ã‚‹ã„ã¯ã€ãƒ¡ã‚¤ãƒ³ã®è¨­å®šãƒ•ァイル中㮠Directory + ブロックã®ä¸­ã«é©åˆ‡ã«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–を記述ã—ã¦ãŠãã¾ã™ã€‚

    +
    + +
    top
    +
    +

    ユーザ毎ã®ã‚¦ã‚§ãƒ–ディレクトリ

    + + +
    top
    +
    +

    UserDir を使ã£ã¦ãƒ•ァイルã®ãƒ‘スを設定ã™ã‚‹

    + + +

    UserDir ディレクティブ㯠+ ユーザ毎ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒèª­ã¿è¾¼ã¾ã‚Œã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’指定ã—ã¾ã™ã€‚ + ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã¯ã„ã‚ã„ã‚é•ã£ãŸå½¢å¼ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    スラッシュã§å§‹ã¾ã‚‰ãªã„パスãŒä¸Žãˆã‚‰ã‚ŒãŸã¨ãã¯ã€ãƒ¦ãƒ¼ã‚¶ã®ãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª + ã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã¨ã¿ãªã•れã¾ã™ã€‚次ã®è¨­å®šãŒã‚ã£ãŸã¨ãã«:

    + +
    UserDir public_html
    + + +

    URL http://example.com/~rbowen/file.html 㯠+ パス /home/rbowen/public_html/file.html 㸠+ 変æ›ã•れã¾ã™ã€‚

    + +

    パスãŒã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã§å§‹ã¾ã‚‹ã¨ãã¯ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ‘スã¯ãã®ãƒ‘ス㫠+ ユーザåを加ãˆãŸã‚‚ã®ã‹ã‚‰ãªã‚Šã¾ã™ã€‚次ã®è¨­å®šã®ã¨ã:

    + +
    UserDir /var/html
    + + +

    URL http://example.com/~rbowen/file.html 㯠+ パス /var/html/rbowen/file.html ã¸å¤‰æ›ã•れã¾ã™ã€‚

    + +

    アスタリスク (*) ã‚’å«ã‚€ãƒ‘ã‚¹ãŒæŒ‡å®šã•れãŸã¨ãã¯ã€ã‚¢ã‚¹ã‚¿ãƒªã‚¹ã‚¯ã‚’ + ユーザåã§ç½®æ›ã—ãŸã‚‚ã®ãŒä½¿ç”¨ã•れã¾ã™ã€‚ã“ã®ã‚ˆã†ãªè¨­å®šã ã¨:

    + +
    UserDir /var/www/*/docs
    + + +

    URL http://example.com/~rbowen/file.html 㯠+ パス /var/www/rbowen/docs/file.html ã¸å¤‰æ›ã•れã¾ã™ã€‚

    + +

    ディレクトリやディレクトリパスを複数設定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚

    + +
    UserDir public_html /var/html
    + + + +

    http://example.com/~rbowen/file.html ã¨ã„ㆠ+ URL ã«å¯¾ã—ã¦ã¯ ~rbowen を探ã—ã¾ã™ã€‚見ã¤ã‹ã‚‰ãªã‘れã°ã€ + /var/html ã®ä¸‹ã«ã‚ã‚‹ rbowen を探ã—ã¾ã™ã€‚ + ã‚‚ã—見ã¤ã‹ã‚Œã°ä¸Šè¨˜ã® URL 㯠/var/html/rbowen/file.html + ã¨ã„ã†ãƒ•ァイルパスã«å¤‰æ›ã•れã¾ã™ã€‚

    + +
    top
    +
    +

    外部 URL ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã™ã‚‹

    + +

    UserDir + ディレクティブを使ã£ã¦å¤–部 URL ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚

    + +
    UserDir http://example.org/users/*/
    + + + +

    上記例ã§ã¯ http://example.com/~bob/abc.html + ã¸ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ http://example.org/users/bob/abc.html + ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã•れã¾ã™ã€‚

    +
    top
    +
    +

    ã“ã®æ©Ÿèƒ½ã‚’使用ã§ãるユーザを制é™ã™ã‚‹

    + + +

    UserDir ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«ç¤ºã•れã¦ã„る構文を使ã†ã“ã¨ã§ã€ + ã©ã®ãƒ¦ãƒ¼ã‚¶ãŒã“ã®æ©Ÿèƒ½ã‚’使ã†ã“ã¨ãŒã§ãã‚‹ã‹ã‚’制é™ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:

    + +

    + UserDir enabled
    + UserDir disabled root jro fish +

    + +

    上ã®è¨­å®šã¯ dissabled æ–‡ã®ãƒ¦ãƒ¼ã‚¶ä»¥å¤–ã®ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ã« + 対ã—㦠UserDir ã®æ©Ÿèƒ½ã‚’有効ã«ã—ã¾ã™ã€‚åŒæ§˜ã«ã—ã¦ã€ä»¥ä¸‹ã®ã‚ˆã†ã« + æ•°åã®ãƒ¦ãƒ¼ã‚¶ä»¥å¤–ã«å¯¾ã—ã¦ã“ã®æ©Ÿèƒ½ã‚’無効ã«ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™:

    + +
          UserDir disabled
    + UserDir enabled rbowen krietz
    + + +

    ä»–ã®ä¾‹ã¯ UserDir + ã®èª¬æ˜Žã‚’å‚ç…§ã—ã¦ãã ã•ã„。

    + +
    top
    +
    +

    ユーザ毎㮠CGI ディレクトリ

    + + +

    ãれãžã‚Œã®ãƒ¦ãƒ¼ã‚¶ã«å°‚用㮠cgi-bin ディレクトリを与ãˆã‚‹ãŸã‚ã«ã€ + <Directory> + を使ã£ã¦ãƒ¦ãƒ¼ã‚¶ã®ãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®æŒ‡å®šã•れãŸé ˜åŸŸã«å¯¾ã—㦠CGI を有効㫠+ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +
    <Directory /home/*/public_html/cgi-bin/>
    +    Options ExecCGI
    +    SetHandler cgi-script
    +</Directory>
    + + +

    ãã—ã¦ã€UserDir ㌠+ public_html ã«è¨­å®šã•れã¦ã„ã‚‹ã¨ä»®å®šã™ã‚‹ã¨ã€ + ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã® CGI プログラム example.cgi + ã¯ä»¥ä¸‹ã®æ§˜ã«å‘¼ã³å‡ºã•れるã“ã¨ãŒã§ãã¾ã™:

    + +

    + http://example.com/~rbowen/cgi-bin/example.cgi +

    + +
    top
    +
    +

    ユーザã«ã‚ˆã‚‹è¨­å®šå¤‰æ›´ã‚’許å¯

    + + +

    ユーザã«å½¼ã‚‰ã®ã‚¦ã‚§ãƒ–空間ã§ã®ã‚µãƒ¼ãƒã®è¨­å®šã®å¤‰æ›´ã‚’許å¯ã™ã‚‹å ´åˆã€ + ユーザ㯠.htaccess ファイルを使ã£ã¦è¨­å®šã‚’変更ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + AllowOverride ã®å€¤ã‚’ + ユーザãŒå¤‰æ›´ã™ã‚‹ã“ã¨ã‚’許å¯ã—ãŸã„ディレクティブã«å¯¾ã—ã¦å分ãªã‚‚ã®ã« + 設定ã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。ã“ã®æ©Ÿèƒ½ãŒã©ã®ã‚ˆã†ã«ã—ã¦å‹•作ã—ã¦ã„ã‚‹ã‹ + ã®è©³ç´°ã¯ .htaccess ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ« を読ん㧠+ ãã ã•ã„。

    + +
    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/public_html.html.ko.euc-kr b/docs/manual/howto/public_html.html.ko.euc-kr new file mode 100644 index 0000000..2ec34fc --- /dev/null +++ b/docs/manual/howto/public_html.html.ko.euc-kr @@ -0,0 +1,190 @@ + + + + + +»ç¿ëÀÚº° À¥µð·ºÅ丮 - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    »ç¿ëÀÚº° À¥µð·ºÅ丮

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + +

    ¿©·¯ »ç¿ëÀÚ°¡ ÀÖ´Â ½Ã½ºÅÛ¿¡¼­ UserDir Áö½Ã¾î¸¦ »ç¿ëÇϸé + °¢ »ç¿ëÀÚ´Â ÀÚ½ÅÀÇ È¨µð·ºÅ丮 ¾È¿¡ À¥»çÀÌÆ®¸¦ ¸¸µé ¼ö ÀÖ´Ù. + URL http://example.com/~username/¿¡ Á¢±ÙÇϸé + »ç¿ëÀÚ "username"ÀÇ È¨µð·ºÅ丮¿¡¼­ UserDir Áö½Ã¾î·Î ÁöÁ¤ÇÑ + ÇÏÀ§µð·ºÅ丮¿¡ ÀÖ´Â ÆäÀÌÁö¸¦ °¡Á®¿À°Ô µÈ´Ù.

    + +
    + +
    top
    +
    +

    »ç¿ëÀÚº° À¥µð·ºÅ丮

    + + +
    top
    +
    +

    UserDir·Î ÆÄÀϰæ·Î ÁöÁ¤Çϱâ

    + + +

    UserDir + Áö½Ã¾î´Â »ç¿ëÀÚº° ÆäÀÌÁö¸¦ °¡Á®¿Ã µð·ºÅ丮¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ + Áö½Ã¾îÀÇ »ç¿ë¹ýÀº ¿©·¯°¡Áö´Ù.

    + +

    ½½·¡½¬·Î ½ÃÀÛÇÏÁö¾Ê´Â °æ·Î¸¦ ÁöÁ¤ÇÏ¸é °¢ »ç¿ëÀÚÀÇ + Ȩµð·ºÅ丮¿¡ »ó´ëÀûÀÎ µð·ºÅ丮 °æ·Î·Î ó¸®ÇÑ´Ù. ¿¹¸¦ µé¾î, + ¾Æ·¡ ¼³Á¤ÀÇ °æ¿ì:

    + +

    + UserDir public_html +

    + +

    URL http://example.com/~rbowen/file.htmlÀº + ÆÄÀÏ °æ·Î /home/rbowen/public_html/file.htmlÀ» + ¶æÇÑ´Ù.

    + +

    ½½·¡½¬·Î ½ÃÀÛÇÏ´Â °æ·Î¸¦ ÁöÁ¤Çϸé ÁöÁ¤ÇÑ µð·ºÅ丮¿¡ + »ç¿ëÀÚ¸íÀ» ´õÇÑ µð·ºÅ丮 °æ·Î¸¦ »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î, ¾Æ·¡ + ¼³Á¤ÀÇ °æ¿ì:

    + +

    + UserDir /var/html +

    + +

    URL http://example.com/~rbowen/file.htmlÀº + ÆÄÀÏ °æ·Î /var/html/rbowen/file.htmlÀ» ¶æÇÑ´Ù.

    + +

    º°Ç¥ (*)¸¦ Æ÷ÇÔÇÑ °æ·Î¸¦ ÁöÁ¤ÇÏ¸é º°Ç¥¸¦ »ç¿ëÀÚ¸íÀ¸·Î + ´ëüÇÑ °æ·Î¸¦ »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î, ¾Æ·¡ ¼³Á¤ÀÇ °æ¿ì:

    + +

    + UserDir /var/www/*/docs +

    + +

    URL http://example.com/~rbowen/file.htmlÀº + ÆÄÀÏ °æ·Î /var/www/rbowen/docs/file.htmlÀ» + ¶æÇÑ´Ù.

    + +
    top
    +
    +

    ±â´ÉÀ» ÀÌ¿ëÇÒ »ç¿ëÀÚ Á¦ÇÑÇϱâ

    + + +

    UserDir ¹®¼­¿¡ ÀÖ´Â ¹®¹ýÀ» »ç¿ëÇÏ¿© »ç¿ëÀÚº° À¥µð·ºÅ丮 + ±â´ÉÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Â »ç¿ëÀÚ¸¦ Á¦ÇÑÇÒ ¼ö ÀÖ´Ù:

    + +

    + UserDir enabled
    + UserDir disabled root jro fish +

    + +

    À§ ¼³Á¤Àº disabled ¹®Àå¿¡ ¿­°ÅÇÑ »ç¶÷À» + Á¦¿ÜÇÏ°í ¸ðµç »ç¿ëÀÚ¿¡°Ô À¥µð·ºÅ丮 ±â´ÉÀ» Çã¶ôÇÑ´Ù. ¶Ç, + ´ÙÀ½°ú °°ÀÌ ¸î¸î »ç¿ëÀÚ¸¦ Á¦¿ÜÇÏ°í ±â´ÉÀ» Çã¶ôÇÏÁö ¾ÊÀ» + ¼öµµ ÀÖ´Ù:

    + +

    + UserDir disabled
    + UserDir enabled rbowen krietz +

    + +

    UserDir + ¹®¼­¿¡ ÀÖ´Â ´Ù¸¥ ¿¹µéµµ Âü°íÇ϶ó.

    + +
    top
    +
    +

    °¢ »ç¿ëÀÚº° cgi µð·ºÅ丮 ÁöÁ¤Çϱâ

    + + +

    »ç¿ëÀÚ¸¶´Ù cgi-bin µð·ºÅ丮¸¦ ºÎ¿©ÇÏ·Á¸é <Directory> Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© »ç¿ëÀÚ È¨µð·ºÅ丮ÀÇ Æ¯Á¤ ÇÏÀ§µð·ºÅ丮¸¦ cgi °¡´ÉÇÏ°Ô + ¸¸µç´Ù.

    + +

    + <Directory /home/*/public_html/cgi-bin/>
    + Options ExecCGI
    + SetHandler cgi-script
    + </Directory> +

    + +

    UserDirÀÌ public_htmlÀ̶ó°í + °¡Á¤Çϸé, ´ÙÀ½°ú °°ÀÌ ±× ¾È¿¡ ÀÖ´Â cgi ÇÁ·Î±×·¥ + example.cgi¸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Ù.

    + +

    + http://example.com/~rbowen/cgi-bin/example.cgi +

    + +
    top
    +
    +

    »ç¿ëÀÚ°¡ ¼³Á¤À» º¯°æÇÒ ¼ö ÀÖµµ·Ï ¸¸µé±â

    + + +

    »ç¿ëÀÚ°¡ ÀÚ½ÅÀÇ À¥°ø°£¿¡ ´ëÇÑ À¥¼­¹ö ¼³Á¤À» ¼öÁ¤ÇÏ·Á¸é, + .htaccess ÆÄÀÏÀ» »ç¿ëÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. AllowOverride¸¦ »ç¿ëÀÚ°¡ ¼öÁ¤ÇÒ + ¼ö ÀÖ´Â Áö½Ã¾î¿¡ ÀûÇÕÇÑ °ªÀ¸·Î ¼³Á¤Ç϶ó. ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö¿¡ + ´ëÇÑ ÀÚ¼¼ÇÑ Á´º¸´Â .htaccess + ÅõÅ丮¾óÀ» Âü°íÇ϶ó.

    + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/public_html.html.tr.utf8 b/docs/manual/howto/public_html.html.tr.utf8 new file mode 100644 index 0000000..c57b8d2 --- /dev/null +++ b/docs/manual/howto/public_html.html.tr.utf8 @@ -0,0 +1,229 @@ + + + + + +Kullanıcı Dizinleri (public_html) - Apache HTTP Sunucusu Sürüm 2.4 + + + + + + + +
    <-
    +

    Kullanıcı Dizinleri (public_html)

    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Çok kullanıcılı sistemlerde, UserDir yönergesi ile her kullanıcının kendi ev dizininde + bir sitesi olması sağlanabilir. + http://example.com/~kullanıcı/ adresinin ziyaretçileri + "kullanıcı" isimli kullanıcının ev dizininin içeriğini değil, UserDir yönergesinde belirtilen alt + dizinin içeriğini görürler.

    + +

    Öntanımlı olarak bu dizinlere erişimin etkin olmadığını unutmayınız. + UserDir yönergesini + kullanırken conf/httpd.conf öntanımlı yapılandırma + dosyasındaki

    + +
    #Include conf/extra/httpd-userdir.conf
    + + +

    satırını etkin hale getirip, gerekiyorsa httpd-userdir.conf + dosyasını da düzenleyerek veya ana yapılandırma dosyasında bir + <Directory> bloğu içine + uygun yönergeleri yerleştirerek bu dizinlere erişimi etkin hale + getirebilirsiniz.

    +
    + +
    top
    +
    top
    +
    +

    UserDir ile dosya yolunun belirtilmesi

    + + +

    UserDir yönergesinde + kullanıcı sayfalarının yükleneceği dizin belirtilir. Bu yönergeye değeri + çeşitli biçimlerde atanabilir.

    + +

    Başında bölü çizgisi bulunmayan bir dosya yolu belirtilmişse, + kullanıcının ev dizinine göreli bir dizin belirtildiği varsayılır. + Yapılandırmada şöyle bir satır varsa:

    + +
    UserDir public_html
    + + +

    http://example.com/~orhan/dosya.html adresine karşılık + gelen dosya yolu /home/orhan/public_html/dosya.html olarak + çözümlenir.

    + +

    Eğer başında bölü çizgisi bulunan bir dosya yolu belirtilirse, + kullanıcı sayfalarının bu dizinin altında kullanıcı ismini taşıyan + dizinlerde bulunacağı varsayılır. Yapılandırmada şöyle bir satır + varsa:

    + +
    UserDir /var/html
    + + +

    http://example.com/~orhan/dosya.html adresine karşılık + gelen dosya yolu /var/html/orhan/dosya.html olarak + çözümlenir.

    + +

    Eğer belirtilen dosya yolu bir yıldız imi (*) içeriyorsa yıldız iminin + yerine kullanıcı ismi yerleştirilerek elde edilen dosya yolu + kullanılır. Yapılandırmada şöyle bir satır varsa:

    + +
    UserDir /var/html/*/sayfam
    + + +

    http://example.com/~orhan/dosya.html adresine karşılık + gelen dosya yolu /var/html/orhan/sayfam/dosya.html + olarak çözümlenir.

    + +

    Çok sayıda dizin veya dizin yolu belirtmek de mümkündür.

    + +
    UserDir public_html /var/html
    + + +

    http://example.com/~orhan/dosya.html adresini Apache önce + /home/orhan/public_html/dosya.html olarak arayacak, + bulamazsa /var/siteler/orhan/sayfam/dosya.html olarak + arayacak, bulduğunda istenen dosyayı sunacaktır.

    + +
    top
    +
    +

    Harici adreslere yönlendirme

    + +

    UserDir yönergesi + kullanıcı dizini isteklerini harici adreslere yönlendirmek için de + kullanılabilir.

    + +
    UserDir http://example.org/users/*/
    + + +

    Bu yapılandırmaya göre http://example.com/~bob/abc.html + için yapılan bir istek http://example.org/users/bob/abc.html + adresine yönlendirilecektir.

    +
    top
    +
    +

    Bu özelliği kullanacak kullanıcıların sınırlandırılması

    + + +

    UserDir yönergesinin + açıklamasında belirtilen sözdizimini kullanarak bu işlevselliği bazı + kullanıcılara yasaklayabilirsiniz:

    + +
    UserDir disabled root ahmet veli
    + + +

    Bu yapılandırma ile disabled deyiminin bulunduğu + satırdaki kullanıcılar dışında kalan bütün kullanıcılar için bu özellik + etkin olacaktır. Benzer şekilde, aşağıdaki yapılandırma ile + işlevselliğin belli kullanıcılar dışında kullanılmamasını da + sağlayabilirsiniz:

    + +
    UserDir disabled
    +UserDir enabled orhan yasar
    + + +

    Daha fazla örnek için UserDir yönergesinin açıklamasına bakabilirsiniz.

    + +
    top
    +
    +

    Her kullanıcıya bir CGI dizini tahsis etmek

    + + +

    Her kullanıcıya kendine ait bir CGI dizini vermek isterseniz, bir + <Directory> yönergesi + ile kullanıcının ev dizinindeki belli bir dizini CGI-etkin duruma + getirebilirsiniz.

    + +
    <Directory "/home/*/public_html/cgi-bin/">
    +    Options ExecCGI
    +    SetHandler cgi-script
    +</Directory>
    + + +

    UserDir yönergesinde + public_html belirtildiği varsayımıyla + mesela.cgi betiği bu dizinden şöyle bir adresle + yüklenebilir:

    + +

    + http://example.com/~orhan/cgi-bin/mesela.cgi +

    + +
    top
    +
    +

    Kullanıcıların yapılandırmayı değiştirmesine izin vermek

    + + +

    Kullanıcıların kendilerine ayrılan bölge içinde sunucu + yapılandırmasını değiştirebilmelerine izin vermek isterseniz, + .htaccess dosyalarını kullanmalarına izin vermeniz + gerekir. Kullanıcının değiştirmesine izin vereceğiniz yönerge türlerini + AllowOverride yönergesinde + belirtmeyi ihmal etmeyin. .htaccess dosyalarının kullanımı + ile ilgili daha ayrıntılı bilgi için .htaccess + öğreticisine bakınız.

    + +
    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    top

    Yorumlar

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/reverse_proxy.html b/docs/manual/howto/reverse_proxy.html new file mode 100644 index 0000000..a89178e --- /dev/null +++ b/docs/manual/howto/reverse_proxy.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: reverse_proxy.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: reverse_proxy.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/howto/reverse_proxy.html.en b/docs/manual/howto/reverse_proxy.html.en new file mode 100644 index 0000000..2da2d1e --- /dev/null +++ b/docs/manual/howto/reverse_proxy.html.en @@ -0,0 +1,360 @@ + + + + + +Reverse Proxy Guide - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Reverse Proxy Guide

    +
    +

    Available Languages:  en  | + fr 

    +
    + +

    In addition to being a "basic" web server, and providing static and + dynamic content to end-users, Apache httpd (as well as most other web + servers) can also act as a reverse proxy server, also-known-as a + "gateway" server.

    + +

    In such scenarios, httpd itself does not generate or host the data, + but rather the content is obtained by one or several backend servers, + which normally have no direct connection to the external network. As + httpd receives a request from a client, the request itself is proxied + to one of these backend servers, which then handles the request, generates + the content and then sends this content back to httpd, which then + generates the actual HTTP response back to the client.

    + +

    There are numerous reasons for such an implementation, but generally + the typical rationales are due to security, high-availability, load-balancing + and centralized authentication/authorization. It is critical in these + implementations that the layout, design and architecture of the backend + infrastructure (those servers which actually handle the requests) are + insulated and protected from the outside; as far as the client is concerned, + the reverse proxy server is the sole source of all content.

    + +

    A typical implementation is below:

    +

    reverse-proxy-arch

    + +
    + +
    top
    +
    top
    +
    +

    Simple reverse proxying

    + + +

    + The ProxyPass + directive specifies the mapping of incoming requests to the backend + server (or a cluster of servers known as a Balancer + group). The simplest example proxies all requests ("/") + to a single backend: +

    + +
    ProxyPass "/"  "http://www.example.com/"
    + + +

    + To ensure that and Location: headers generated from + the backend are modified to point to the reverse proxy, instead of + back to itself, the ProxyPassReverse + directive is most often required: +

    + +
    ProxyPass "/"  "http://www.example.com/"
    +ProxyPassReverse "/"  "http://www.example.com/"
    + + +

    Only specific URIs can be proxied, as shown in this example:

    + +
    ProxyPass "/images"  "http://www.example.com/"
    +ProxyPassReverse "/images"  "http://www.example.com/"
    + + +

    In the above, any requests which start with the /images + path with be proxied to the specified backend, otherwise it will be handled + locally. +

    +
    top
    +
    +

    Clusters and Balancers

    + + +

    + As useful as the above is, it still has the deficiencies that should + the (single) backend node go down, or become heavily loaded, that proxying + those requests provides no real advantage. What is needed is the ability + to define a set or group of backend servers which can handle such + requests and for the reverse proxy to load balance and failover among + them. This group is sometimes called a cluster but Apache httpd's + term is a balancer. One defines a balancer by leveraging the + <Proxy> and + BalancerMember directives as + shown: +

    + +
    <Proxy balancer://myset>
    +    BalancerMember http://www2.example.com:8080
    +    BalancerMember http://www3.example.com:8080
    +    ProxySet lbmethod=bytraffic
    +</Proxy>
    +
    +ProxyPass "/images/"  "balancer://myset/"
    +ProxyPassReverse "/images/"  "balancer://myset/"
    + + +

    + The balancer:// scheme is what tells httpd that we are creating + a balancer set, with the name myset. It includes 2 backend servers, + which httpd calls BalancerMembers. In this case, any requests for + /images will be proxied to one of the 2 backends. + The ProxySet directive + specifies that the myset Balancer use a load balancing algorithm + that balances based on I/O bytes. +

    + +

    Hint

    +

    + BalancerMembers are also sometimes referred to as workers. +

    +
    + +
    top
    +
    +

    Balancer and BalancerMember configuration

    + + +

    + You can adjust numerous configuration details of the balancers + and the workers via the various parameters defined in + ProxyPass. For example, + assuming we would want http://www3.example.com:8080 to + handle 3x the traffic with a timeout of 1 second, we would adjust the + configuration as follows: +

    + +
    <Proxy balancer://myset>
    +    BalancerMember http://www2.example.com:8080
    +    BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
    +    ProxySet lbmethod=bytraffic
    +</Proxy>
    +
    +ProxyPass "/images"  "balancer://myset/"
    +ProxyPassReverse "/images"  "balancer://myset/"
    + + +
    top
    +
    +

    Failover

    + + +

    + You can also fine-tune various failover scenarios, detailing which workers + and even which balancers should be accessed in such cases. For example, the + below setup implements three failover cases: +

    +
      +
    1. + http://spare1.example.com:8080 and + http://spare2.example.com:8080 are only sent traffic if one + or both of http://www2.example.com:8080 or + http://www3.example.com:8080 is unavailable. (One spare + will be used to replace one unusable member of the same balancer set.) +
    2. +
    3. + http://hstandby.example.com:8080 is only sent traffic if + all other workers in balancer set 0 are not available. +
    4. +
    5. + If all load balancer set 0 workers, spares, and the standby + are unavailable, only then will the + http://bkup1.example.com:8080 and + http://bkup2.example.com:8080 workers from balancer set + 1 be brought into rotation. +
    6. +
    +

    + Thus, it is possible to have one or more hot spares and hot standbys for + each load balancer set. +

    + +
    <Proxy balancer://myset>
    +    BalancerMember http://www2.example.com:8080
    +    BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
    +    BalancerMember http://spare1.example.com:8080 status=+R
    +    BalancerMember http://spare2.example.com:8080 status=+R
    +    BalancerMember http://hstandby.example.com:8080 status=+H
    +    BalancerMember http://bkup1.example.com:8080 lbset=1
    +    BalancerMember http://bkup2.example.com:8080 lbset=1
    +    ProxySet lbmethod=byrequests
    +</Proxy>
    +
    +ProxyPass "/images/"  "balancer://myset/"
    +ProxyPassReverse "/images/"  "balancer://myset/"
    + + +

    + For failover, hot spares are used as replacements for unusable workers in + the same load balancer set. A worker is considered unusable if it is + draining, stopped, or otherwise in an error/failed state. Hot standbys are + used if all workers and spares in the load balancer set are + unavailable. Load balancer sets (with their respective hot spares and + standbys) are always tried in order from lowest to highest. +

    + +
    top
    +
    +

    Balancer Manager

    + + +

    + One of the most unique and useful features of Apache httpd's reverse proxy is + the embedded balancer-manager application. Similar to + mod_status, balancer-manager displays + the current working configuration and status of the enabled + balancers and workers currently in use. However, not only does it + display these parameters, it also allows for dynamic, runtime, on-the-fly + reconfiguration of almost all of them, including adding new BalancerMembers + (workers) to an existing balancer. To enable these capability, the following + needs to be added to your configuration: +

    + +
    <Location "/balancer-manager">
    +    SetHandler balancer-manager
    +    Require host localhost
    +</Location>
    + + +

    Warning

    +

    Do not enable the balancer-manager until you have secured your server. In + particular, ensure that access to the URL is tightly + restricted.

    +
    + +

    + When the reverse proxy server is accessed at that url + (eg: http://rproxy.example.com/balancer-manager/, you will see a + page similar to the below: +

    +

    balancer-manager page

    + +

    + This form allows the devops admin to adjust various parameters, take + workers offline, change load balancing methods and add new works. For + example, clicking on the balancer itself, you will get the following page: +

    +

    balancer-manager page

    + +

    + Whereas clicking on a worker, displays this page: +

    +

    balancer-manager page

    + +

    + To have these changes persist restarts of the reverse proxy, ensure that + BalancerPersist is enabled. +

    + +
    top
    +
    +

    Dynamic Health Checks

    + + +

    + Before httpd proxies a request to a worker, it can "test" if that worker + is available via setting the ping parameter for that worker using + ProxyPass. Oftentimes it is + more useful to check the health of the workers out of band, in a + dynamic fashion. This is achieved in Apache httpd by the + mod_proxy_hcheck module. +

    + +
    top
    +
    +

    BalancerMember status flags

    + + +

    + In the balancer-manager the current state, or status, of a worker + is displayed and can be set/reset. The meanings of these statuses are as follows: +

    + + + + + + + + + + + + +
    FlagStringDescription
     OkWorker is available
     InitWorker has been initialized
    DDisWorker is disabled and will not accept any requests; will be + automatically retried.
    SStopWorker is administratively stopped; will not accept requests + and will not be automatically retried
    IIgnWorker is in ignore-errors mode and will always be considered available.
    RSparWorker is a hot spare. For each worker in a given lbset that is unusable + (draining, stopped, in error, etc.), a usable hot spare with the same lbset will be used in + its place. Hot spares can help ensure that a specific number of workers are always available + for use by a balancer.
    HStbyWorker is in hot-standby mode and will only be used if no other + viable workers or spares are available in the balancer set.
    EErrWorker is in an error state, usually due to failing pre-request check; + requests will not be proxied to this worker, but it will be retried depending on + the retry setting of the worker.
    NDrnWorker is in drain mode and will only accept existing sticky sessions + destined for itself and ignore all other requests.
    CHcFlWorker has failed dynamic health check and will not be used until it + passes subsequent health checks.
    +
    +
    +

    Available Languages:  en  | + fr 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/reverse_proxy.html.fr.utf8 b/docs/manual/howto/reverse_proxy.html.fr.utf8 new file mode 100644 index 0000000..89558b6 --- /dev/null +++ b/docs/manual/howto/reverse_proxy.html.fr.utf8 @@ -0,0 +1,381 @@ + + + + + +Guide de configuration d'un mandataire inverse - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Guide de configuration d'un mandataire inverse

    +
    +

    Langues Disponibles:  en  | + fr 

    +
    + +

    En plus de ses fonctions de serveur web "basique", à savoir fournir du + contenu statique et dynamique à l'utilisateur, Apache httpd (comme la + plupart des autres serveurs web) peut aussi assurer les fonctions de serveur + mandataire inverse, connu aussi sous le nom de serveur "passerelle".

    + +

    Dans un tel scénario, httpd ne génère et n'héberge pas lui-même les + données, le contenu étant en général obtenu à partir d'un ou plusieurs serveurs + d'arrière-plan qui n'ont normalement aucune connexion directe avec le réseau + externe. Lorsque httpd reçoit une requête en provenance d'un client, la + requête proprement dite est mandatée vers un de ces serveurs + d'arrière-plan qui traite la requête, génère le contenu et l'envoie à httpd, + ce dernier générant la véritable réponse HTTP à destination du client.

    + +

    De nombreuses raisons peuvent vous motiver à utiliser cette + fonctionnalité, mais elles sont souvent du domaine de la sécurité, de + la haute disponibilité, de la répartition de charge et de + l'authentification/autorisation centralisée. Il est alors indispensable que + l'organisation, la conception et l'architecture de l'infrastructure + d'arrière-plan (les serveurs qui traitent au sens propre les requêtes) soient + isolées et protégées de l'extérieur ; vu du client, le serveur mandataire + inverse est le seul serveur accessible pouvant lui fournir du + contenu.

    + +

    Voici un exemple typique d'implémentation de cette fonctionnalité :

    +

    reverse-proxy-arch

    + +
    + +
    top
    +
    +

    Mandataire inverse

    + + +
    top
    +
    +

    Mandatement inverse simple

    + + +

    + La directive ProxyPass permet de + rediriger les requêtes entrantes vers un serveur d'arrière-plan (ou un + cluster de serveurs plus connu sous le nom de groupe + Balancer). Dans cet exemple le plus simple, toutes les + requêtes ("/") sont redirigées vers un serveur d'arrière-plan + unique : +

    + +
    ProxyPass "/"  "http://www.example.com/"
    + + +

    + Pour être sur que cette redirection soit effectuée et que les en-têtes + Location: générés par le serveur d'arrière-plan soient + modifiés pour pointer vers le mandataire inverse, et non vers le serveur + d'arrière-plan, la directive ProxyPassReverse est souvent requise : +

    + +
    ProxyPass "/"  "http://www.example.com/"
    +ProxyPassReverse "/"  "http://www.example.com/"
    + + +

    Seules des URIs spécifiques peuvent être mandatées, comme le montre + l'exemple suivant :

    + +
    ProxyPass "/images"  "http://www.example.com/"
    +ProxyPassReverse "/images"  "http://www.example.com/"
    + + +

    Dans l'exemple précédent, si le chemin d'une requête commence par + /images, elle sera redirigée vers le serveur d'arrière-plan + spécifié ; dans le cas contraire, elle sera traitée localement. +

    +
    top
    +
    +

    Clusters et Balancers

    + + +

    + Utiliser un serveur d'arrière-plan unique n'est cependant pas une solution + idéale car ce dernier peut devenir indisponible ou surchargé, et le + mandatement inverse vers ce serveur ne présente alors plus aucun avantage. + La solution réside dans la définition d'un groupe de serveurs + d'arrière-plan qui vont se partager le traitement des requêtes via un + mécanisme de répartition de charge et de gestion des indisponibilités pris + en charge par le mandataire. Ce groupe de répartition est plus connu sous le nom de + cluster, mais dans la terminologie d'Apache httpd, on utilise + plutôt le terme de balancer. Un balancer se définit en + utilisant les directives <Proxy> et BalancerMember comme suit : +

    + +
    <Proxy balancer://myset>
    +    BalancerMember http://www2.example.com:8080
    +    BalancerMember http://www3.example.com:8080
    +    ProxySet lbmethod=bytraffic
    +</Proxy>
    +
    +ProxyPass "/images/"  "balancer://myset/"
    +ProxyPassReverse "/images/"  "balancer://myset/"
    + + +

    + Le protocole balancer:// indique à httpd que l'on souhaite + créer un balancer nommé myset. Ce balancer comporte deux serveurs + d'arrière-plan référencés dans la terminologie httpd sous le nom de + BalancerMembers. Avec cet exemple, toute requête dont le chemin + commence par /images sera mandatée vers un des deux + serveurs d'arrière-plan. La directive ProxySet définit ici pour le balancer + myset un algorithme de + répartition de charge basé sur le trafic entrées/sorties. +

    + +

    Remarque

    +

    + Les BalancerMembers sont aussi souvent référencés sous le terme + workers. +

    +
    + +
    top
    +
    +

    Configuration du Balancer et des BalancerMembers

    + + +

    + Vous pouvez configurer de manière détaillée les balancers et + workers via les nombreux paramètres de la directive ProxyPass. Par exemple, si vous souhaitez + que http://www3.example.com:8080 traite avec un facteur 3 le + trafic avec un timeout d'une seconde, utilisez la configuration suivante : +

    + +
    <Proxy balancer://myset>
    +    BalancerMember http://www2.example.com:8080
    +    BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
    +    ProxySet lbmethod=bytraffic
    +</Proxy>
    +
    +ProxyPass "/images"  "balancer://myset/"
    +ProxyPassReverse "/images"  "balancer://myset/"
    + + +
    top
    +
    +

    Gestion des indisponibilités (Failover)

    + + +

    + Vous pouvez aussi définir finement des scénarios pour les cas + d'indisponibilité d'un ou plusieurs serveurs d'arrière-plan en spécifiant + quels serveurs doivent alors prendre le relai. Dans l'exemple suivant, + trois scénarios sont envisagés : +

    +
      +
    1. + http://spare1.example.com:8080 et + http://spare2.example.com:8080 ne sont sollicités que si + http://www2.example.com:8080 ou + http://www3.example.com:8080 est indisponible (un serveur + de remplacement sera utilisé à la place d'un membre indisponible du même + jeu de serveurs cibles). +
    2. +
    3. + http://hstandby.example.com:8080 n'est sollicité que si + tous les autres serveurs cibles du jeu de serveurs 0 sont + indisponibles. +
    4. +
    5. + Les serveurs http://bkup1.example.com:8080 et + http://bkup2.example.com:8080 du jeu 1 ne seront sollicités que si + tous les serveurs du jeu 0, tous les serveurs de + remplacement et tous les serveurs de standby sont indisponibles. +
    6. +
    +

    + Il est ainsi possible de définir un ou plusieurs serveurs de remplacement + ou de standby pour chaque jeu de serveurs du répartiteur de charge. +

    + +
    <Proxy balancer://myset>
    +    BalancerMember http://www2.example.com:8080
    +    BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
    +    BalancerMember http://spare1.example.com:8080 status=+R
    +    BalancerMember http://spare2.example.com:8080 status=+R
    +    BalancerMember http://hstandby.example.com:8080 status=+H
    +    BalancerMember http://bkup1.example.com:8080 lbset=1
    +    BalancerMember http://bkup2.example.com:8080 lbset=1
    +    ProxySet lbmethod=byrequests
    +</Proxy>
    +
    +ProxyPass "/images/"  "balancer://myset/"
    +ProxyPassReverse "/images/"  "balancer://myset/"
    + + +

    + Les serveurs de remplacement à chaud remplacent les serveurs indisponibles + du même jeu de serveurs du répartiteur de charge. Un serveur est + considéré comme indisponible s'il est en maintenance, arrêté ou en erreur. + Les serveurs de standby à chaud sont utilisés si tous les serveurs et + serveurs de remplacement du jeu de serveurs du répartiteur de charge sont + indisponibles. Les jeux de serveurs du répartiteur de charge (avec leurs + serveurs de standby et de remplacement à chaud respectifs) sont toujours + sollicités dans l'ordre du plus bas lbset vers le plus haut. +

    + +
    top
    +
    +

    Gestion du répartiteur de charge

    + + +

    + L'application balancer-manager fournie avec le mandataire inverse + d'Apache httpd en est un des outils les plus utiles. Comme + mod_status, balancer-manager affiche la + configuration et l'activité actuelles des balancers actifs. L'affichage de + ces informations n'est cependant pas sa seule fonction ; il permet aussi de + modifier la plupart d'entre elles et même d'ajouter des membres au groupe + de répartition de charge en temps réel. Pour activer ces fonctionnalités, + vous devez ajouter les lignes suivantes à votre fichier de configuration : +

    + +
    <Location "/balancer-manager">
    +    SetHandler balancer-manager
    +    Require host localhost
    +</Location>
    + + +

    Avertissement

    +

    N'activez le balancer-manager que si vous avez déjà sécurisé votre serveur. + Assurez-vous en particulier que l'accès à l'URL soit fortement restreint.

    +
    + +

    + Lorsque vous accédez au serveur mandataire avec une adresse du style + http://rproxy.example.com/balancer-manager/, la page suivante + s'affiche : +

    +

    balancer-manager page

    + +

    + Ce formulaire permet à l'administrateur de modifier certains paramètres, + de désactiver ou d'ajouter certains serveurs d'arrière-plan, et de + modifier les règles de répartition de charge. Par exemple, si on clique + sur le répartiteur, la page suivante s'affiche : +

    +

    balancer-manager page

    + +

    + Si on clique sur un membre du groupe de répartition de charge, la page + suivante s'affiche : +

    +

    balancer-manager page

    + +

    + Si vous souhaitez que ces modifications soient conservées après un + redémarrage du serveur, assurez-vous que la directive BalancerPersist soit définie à On. +

    + +
    top
    +
    +

    Vérification dynamique du bon fonctionnement d'un serveur + d'arrière-plan

    + + +

    + Avant que le mandataire httpd ne fasse appel à un serveur d'arrière-plan, il + peut "tester" si ce dernier est disponible en définissant le + paramètre ping de ce serveur via la directive ProxyPass. Cependant, il est souvent plus + judicieux de vérifier le bon fonctionnement d'un serveur hors + bande et de manière dynamique via le module + mod_proxy_hcheck d'Apache httpd. +

    + +
    top
    +
    +

    Drapeaux d'état d'un membre du groupe de répartition de charge

    + + +

    + balancer-manager permet d'afficher et de modifier l'état d'un + membre du groupe de répartition de charge. Les différents états et leurs + significations sont les suivants : +

    + + + + + + + + + + + + +
    DrapeauSigleDescription
     OkLe serveur est disponible
     InitLe serveur a été initialisé
    DDisLe serveur est + désactivé et n'accepte aucune requête ; il sera retesté automatiquement.
    SStopLe serveur a été + arrêté par l'administrateur ; il n'accepte aucune requête et il ne sera + pas retesté automatiquement.
    IIgnLes erreurs + concernant ce serveur sont ignorées et il sera donc toujours considéré + comme disponible.
    RSparLe serveur cible sert de remplaçant à + chaud. Lorsqu'un serveur cible avec un lbset donné est inutilisable + (maintenance, arrêt, en erreur, etc...), un serveur de remplacement à + chaud libre de même lbset sera utilisé à sa place. Les remplaçants à + chaud permettent de s'assurer qu'un nombre déterminé de serveurs cibles + sera toujours disponible pour un répartiteur de charge.
    HStbyLe serveur est en + mode hot-standby et ne sera donc utilisé que si aucun autre serveur ou + serveur de remplacement n'est disponible dans le jeu de serveurs du + répartiteur de charge.
    EErrLe serveur est en + erreur, en général suite à un test préalable à une requête ; aucune + requête ne lui sera soumise, mais il sera retesté en fonction de la + valeur de son paramètre retry.
    NDrnLe serveur est en + mode drain ; il n'acceptera de requêtes que dans le cadre des sessions + persistantes qui lui sont réservées et ignorera toutes les autres.
    CHcFlLe serveur a échoué + au test dynamique de bon fonctionnement et ne sera utilisé que lorsqu'il + aura réussi un test ultérieur.
    +
    +
    +

    Langues Disponibles:  en  | + fr 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/ssi.html b/docs/manual/howto/ssi.html new file mode 100644 index 0000000..e3d279f --- /dev/null +++ b/docs/manual/howto/ssi.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: ssi.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: ssi.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: ssi.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 + +URI: ssi.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: ssi.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/docs/manual/howto/ssi.html.en b/docs/manual/howto/ssi.html.en new file mode 100644 index 0000000..d3d1160 --- /dev/null +++ b/docs/manual/howto/ssi.html.en @@ -0,0 +1,503 @@ + + + + + +Apache httpd Tutorial: Introduction to Server Side Includes - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    Apache httpd Tutorial: Introduction to Server Side Includes

    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko 

    +
    + +

    Server-side includes provide a means to add dynamic content to +existing HTML documents.

    +
    + +
    top
    +
    +

    Introduction

    + + +

    This article deals with Server Side Includes, usually called + simply SSI. In this article, I'll talk about configuring your + server to permit SSI, and introduce some basic SSI techniques + for adding dynamic content to your existing HTML pages.

    + +

    In the latter part of the article, we'll talk about some of + the somewhat more advanced things that can be done with SSI, + such as conditional statements in your SSI directives.

    + +
    top
    +
    +

    What are SSI?

    + +

    SSI (Server Side Includes) are directives that are placed in + HTML pages, and evaluated on the server while the pages are + being served. They let you add dynamically generated content to + an existing HTML page, without having to serve the entire page + via a CGI program, or other dynamic technology.

    + +

    For example, you might place a directive into an existing HTML + page, such as:

    + +

    + <!--#echo var="DATE_LOCAL" --> +

    + +

    And, when the page is served, this fragment will be evaluated and replaced with its value:

    + +

    + Tuesday, 15-Jan-2013 19:28:54 EST +

    + +

    The decision of when to use SSI, and when to have your page + entirely generated by some program, is usually a matter of how + much of the page is static, and how much needs to be + recalculated every time the page is served. SSI is a great way + to add small pieces of information, such as the current time - shown + above. But if a majority of your page is being generated at the time + that it is served, you need to look for some other solution.

    +
    top
    +
    +

    Configuring your server to permit SSI

    + + +

    To permit SSI on your server, you must have the following + directive either in your httpd.conf file, or in a + .htaccess file:

    +
    Options +Includes
    + + +

    This tells Apache that you want to permit files to be parsed + for SSI directives. Note that most configurations contain + multiple Options directives + that can override each other. You will probably need to apply the + Options to the specific directory where you want SSI + enabled in order to assure that it gets evaluated last.

    + +

    Not just any file is parsed for SSI directives. You have to + tell Apache which files should be parsed. There are two ways to + do this. You can tell Apache to parse any file with a + particular file extension, such as .shtml, with + the following directives:

    +
    AddType text/html .shtml
    +AddOutputFilter INCLUDES .shtml
    + + +

    One disadvantage to this approach is that if you wanted to + add SSI directives to an existing page, you would have to + change the name of that page, and all links to that page, in + order to give it a .shtml extension, so that those + directives would be executed.

    + +

    The other method is to use the XBitHack directive:

    +
    XBitHack on
    + + +

    XBitHack + tells Apache to parse files for SSI + directives if they have the execute bit set. So, to add SSI + directives to an existing page, rather than having to change + the file name, you would just need to make the file executable + using chmod.

    +

    + chmod +x pagename.html +

    + +

    A brief comment about what not to do. You'll occasionally + see people recommending that you just tell Apache to parse all + .html files for SSI, so that you don't have to + mess with .shtml file names. These folks have + perhaps not heard about XBitHack. The thing to + keep in mind is that, by doing this, you're requiring that + Apache read through every single file that it sends out to + clients, even if they don't contain any SSI directives. This + can slow things down quite a bit, and is not a good idea.

    + +

    Of course, on Windows, there is no such thing as an execute + bit to set, so that limits your options a little.

    + +

    In its default configuration, Apache does not send the last + modified date or content length HTTP headers on SSI pages, + because these values are difficult to calculate for dynamic + content. This can prevent your document from being cached, and + result in slower perceived client performance. There are two + ways to solve this:

    + +
      +
    1. Use the XBitHack Full configuration. This + tells Apache to determine the last modified date by looking + only at the date of the originally requested file, ignoring + the modification date of any included files.
    2. + +
    3. Use the directives provided by + mod_expires to set an explicit expiration + time on your files, thereby letting browsers and proxies + know that it is acceptable to cache them.
    4. +
    +
    top
    +
    +

    Basic SSI directives

    + +

    SSI directives have the following syntax:

    +

    + <!--#function attribute=value attribute=value ... --> +

    + +

    It is formatted like an HTML comment, so if you don't have + SSI correctly enabled, the browser will ignore it, but it will + still be visible in the HTML source. If you have SSI correctly + configured, the directive will be replaced with its + results.

    + +

    The function can be one of a number of things, and we'll talk + some more about most of these in the next installment of this + series. For now, here are some examples of what you can do with + SSI

    + +

    Today's date

    + +

    + <!--#echo var="DATE_LOCAL" --> +

    + +

    The echo function just spits out the value of a + variable. There are a number of standard variables, which + include the whole set of environment variables that are + available to CGI programs. Also, you can define your own + variables with the set function.

    + +

    If you don't like the format in which the date gets printed, + you can use the config function, with a + timefmt attribute, to modify that formatting.

    + +

    + <!--#config timefmt="%A %B %d, %Y" -->
    + Today is <!--#echo var="DATE_LOCAL" --> +

    + + +

    Modification date of the file

    + +

    + This document last modified <!--#flastmod file="index.html" --> +

    + +

    This function is also subject to timefmt format + configurations.

    + + +

    Including the results of a CGI program

    + +

    This is one of the more common uses of SSI - to output the + results of a CGI program, such as everybody's favorite, a ``hit + counter.''

    + +

    + <!--#include virtual="/cgi-bin/counter.pl" --> +

    + + +
    top
    +
    +

    Additional examples

    + + +

    Following are some specific examples of things you can do in + your HTML documents with SSI.

    + +

    When was this document +modified?

    + +

    Earlier, we mentioned that you could use SSI to inform the + user when the document was most recently modified. However, the + actual method for doing that was left somewhat in question. The + following code, placed in your HTML document, will put such a + time stamp on your page. Of course, you will have to have SSI + correctly enabled, as discussed above.

    +

    + <!--#config timefmt="%A %B %d, %Y" -->
    + This file last modified <!--#flastmod file="ssi.shtml" --> +

    + +

    Of course, you will need to replace the + ssi.shtml with the actual name of the file that + you're referring to. This can be inconvenient if you're just + looking for a generic piece of code that you can paste into any + file, so you probably want to use the + LAST_MODIFIED variable instead:

    +

    + <!--#config timefmt="%D" -->
    + This file last modified <!--#echo var="LAST_MODIFIED" --> +

    + +

    For more details on the timefmt format, go to + your favorite search site and look for strftime. The + syntax is the same.

    + + +

    Including a standard footer

    + + +

    If you are managing any site that is more than a few pages, + you may find that making changes to all those pages can be a + real pain, particularly if you are trying to maintain some kind + of standard look across all those pages.

    + +

    Using an include file for a header and/or a footer can + reduce the burden of these updates. You just have to make one + footer file, and then include it into each page with the + include SSI command. The include + function can determine what file to include with either the + file attribute, or the virtual + attribute. The file attribute is a file path, + relative to the current directory. That means that it + cannot be an absolute file path (starting with /), nor can it + contain ../ as part of that path. The virtual + attribute is probably more useful, and should specify a URL + relative to the document being served. It can start with a /, + but must be on the same server as the file being served.

    +

    + <!--#include virtual="/footer.html" --> +

    + +

    I'll frequently combine the last two things, putting a + LAST_MODIFIED directive inside a footer file to be + included. SSI directives can be contained in the included file, + and includes can be nested - that is, the included file can + include another file, and so on.

    + + +
    top
    +
    +

    What else can I config?

    + + +

    In addition to being able to config the time + format, you can also config two other things.

    + +

    Usually, when something goes wrong with your SSI directive, + you get the message

    +

    + [an error occurred while processing this directive] +

    + +

    If you want to change that message to something else, you + can do so with the errmsg attribute to the + config function:

    +

    + <!--#config errmsg="[It appears that you don't know how to use SSI]" --> +

    + +

    Hopefully, end users will never see this message, because + you will have resolved all the problems with your SSI + directives before your site goes live. (Right?)

    + +

    And you can config the format in which file + sizes are returned with the sizefmt attribute. You + can specify bytes for a full count in bytes, or + abbrev for an abbreviated number in Kb or Mb, as + appropriate.

    +
    top
    +
    +

    Executing commands

    + + +

    Here's something else that you can do with the exec + function. You can actually have SSI execute a command using the + shell (/bin/sh, to be precise - or the DOS shell, + if you're on Win32). The following, for example, will give you + a directory listing.

    +

    + <pre>
    + <!--#exec cmd="ls" -->
    + </pre> +

    + +

    or, on Windows

    +

    + <pre>
    + <!--#exec cmd="dir" -->
    + </pre> +

    + +

    You might notice some strange formatting with this directive + on Windows, because the output from dir contains + the string ``<dir>'' in it, which confuses + browsers.

    + +

    Note that this feature is exceedingly dangerous, as it will + execute whatever code happens to be embedded in the + exec tag. If you have any situation where users + can edit content on your web pages, such as with a + ``guestbook'', for example, make sure that you have this + feature disabled. You can allow SSI, but not the + exec feature, with the IncludesNOEXEC + argument to the Options directive.

    +
    top
    +
    +

    Advanced SSI techniques

    + + +

    In addition to spitting out content, Apache SSI gives you + the option of setting variables, and using those variables in + comparisons and conditionals.

    + +

    Setting variables

    + +

    Using the set directive, you can set variables + for later use. We'll need this later in the discussion, so + we'll talk about it here. The syntax of this is as follows:

    +

    + <!--#set var="name" value="Rich" --> +

    + +

    In addition to merely setting values literally like that, you + can use any other variable, including environment variables or the variables + discussed above (like LAST_MODIFIED, for example) to + give values to your variables. You will specify that something is + a variable, rather than a literal string, by using the dollar sign + ($) before the name of the variable.

    + +

    <!--#set var="modified" value="$LAST_MODIFIED" --> +

    + +

    To put a literal dollar sign into the value of your + variable, you need to escape the dollar sign with a + backslash.

    +

    + <!--#set var="cost" value="\$100" --> +

    + +

    Finally, if you want to put a variable in the midst of a + longer string, and there's a chance that the name of the + variable will run up against some other characters, and thus be + confused with those characters, you can place the name of the + variable in braces, to remove this confusion. (It's hard to + come up with a really good example of this, but hopefully + you'll get the point.)

    +

    + <!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" --> +

    + + +

    Conditional expressions

    + + +

    Now that we have variables, and are able to set and compare + their values, we can use them to express conditionals. This + lets SSI be a tiny programming language of sorts. + mod_include provides an if, + elif, else, endif + structure for building conditional statements. This allows you + to effectively generate multiple logical pages out of one + actual page.

    + +

    The structure of this conditional construct is:

    +

    + <!--#if expr="test_condition" -->
    + <!--#elif expr="test_condition" -->
    + <!--#else -->
    + <!--#endif --> +

    + +

    A test_condition can be any sort of logical + comparison - either comparing values to one another, or testing + the ``truth'' of a particular value. (A given string is true if + it is nonempty.) For a full list of the comparison operators + available to you, see the mod_include + documentation.

    + +

    For example, if you wish to customize the text on your web page + based on the time of day, you could use the following recipe, placed + in the HTML page:

    + +

    + Good + <!--#if expr="%{TIME_HOUR} <12" -->
    + morning!
    + <!--#else -->
    + afternoon!
    + <!--#endif -->
    +

    + +

    Any other variable (either ones that you define, or normal + environment variables) can be used in conditional statements. + See Expressions in Apache HTTP Server for + more information on the expression evaluation engine.

    + +

    With Apache's ability to set environment variables with the + SetEnvIf directives, and other related directives, + this functionality can let you do a wide variety of dynamic content + on the server side without resorting a full web application.

    + +
    top
    +
    +

    Conclusion

    + +

    SSI is certainly not a replacement for CGI, or other + technologies used for generating dynamic web pages. But it is a + great way to add small amounts of dynamic content to pages, + without doing a lot of extra work.

    +
    +
    +

    Available Languages:  en  | + es  | + fr  | + ja  | + ko 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/ssi.html.es b/docs/manual/howto/ssi.html.es new file mode 100644 index 0000000..d49f43d --- /dev/null +++ b/docs/manual/howto/ssi.html.es @@ -0,0 +1,361 @@ + + + + + +Tutorial de Apache httpd: Introducción a los Server Side Includes + - Servidor HTTP Apache Versión 2.4 + + + + + + + +
    <-
    +

    Tutorial de Apache httpd: Introducción a los Server Side Includes +

    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko 

    +
    + +

    Los Server Side Includes (Inclusiones en la parte Servidor) facilitan un método para añadir contenido dinámico a documentos HTML existentes.

    +
    + +
    top
    +
    +

    Introducción

    + + +

    Este artículo trata sobre los Server Side Includes, generalmente llamados SSI. + En este artículo, hablaremos sobre cómo configurar su servidor para permitir SSI, + y de técnicas básicas de SSI para añadir contenido dinámico a sus páginas + HTML existentes.

    + +

    Más adelante también hablaremos de algunas técnicas más avanzadas que + pueden usarse con SSI, tales como declaraciones condicionales en sus directivas SSI.

    + +
    top
    +
    +

    ¿Qué son los SSI?

    + +

    SSI (Server Side Includes) son directivas que se introducen en páginas HTML y son + evaluadas por el servidor mientras éste las sirve. Le permiten añadir + contenido generado de manera dinámica a sus páginas HTML existentes sin tener + que servir una página entera a través de un programa CGI, u otra tecnología + para generar contenido dinámico.

    + +

    Por ejemplo, podría colocar una directiva en una página existente de HTML + de esta manera:

    + +

    + <!--#echo var="DATE_LOCAL" --> +

    + +

    Y, cuando se sirve la página, este fragmento será evaluado y sustituido con su resultado:

    + +

    + Tuesday, 15-Jan-2013 19:28:54 EST +

    + +

    La decisión sobre cuándo usar SSI, o de cuándo generar una página al completo con algún programa, suele depender generalmente de la cantidad de contenido estático que contiene, y cuánto de esa página tiene que ser recalculado cada vez que ésta se sirve. SSI es un buen método para añadir pequeñas partes de información, tales como la hora actual - como se ha mostrado más arriba. Pero si la mayoría de su página se tiene que generar en el momento en el que se está sirviendo, necesita buscar otra opción más adecuada que no sea SSI.

    +
    top
    +
    +

    Configurar su servidor para permitir SSI

    + + +

    Para permitir SSI en su servidor, debe tener la siguiente directiva en su fichero httpd.conf , o en un fichero + .htaccess:

    +
    Options +Includes
    + + +

    Esto le dice a Apache que quiere permitir que se examinen los ficheros buscando directivas SSI. Tenga en cuenta que la mayoría de las configuraciones contienen múltiples directivas Options que pueden sobreescribirse las unas a las otras. Probablemente necesitará aplicar Options al directorio específico donde quiere SSI activado para asegurarse de que se evalúa en último lugar y por tanto se acabará aplicando.

    + +

    No todos los ficheros se examinan buscando directivas SSI. Usted Le tiene que indicar a Apache qué ficheros se tienen que examinar. Hay dos formas de hacer esto. Puede decirle a Apache que examine cualquier fichero con una extensión determinada, como por ejemplo .shtml, con las siguientes directivas:

    +
    AddType text/html .shtml
    +AddOutputFilter INCLUDES .shtml
    + + +

    Una desventaja de este método es que si quisiera añadir directivas SSI a una página ya existente, tendría que cambiar el nombre de la página, y todos los enlaces que apuntasen a esa página, todo para poder darle la extensión .shtml y que esas directivas sean interpretadas.

    + +

    El otro método es usar la directiva XBitHack :

    +
    XBitHack on
    + + +

    XBitHack le dice a Apache que examine ficheros buscando directivas SSI si los ficheros tienen el bit de ejecución configurado. Asi que para añadir directivas SSI a una página existente, en lugar de tener que cambiarle el nombre, solo tendría que convertirla en ejecutable usando chmod.

    +

    + chmod +x pagename.html +

    + +

    Una breve recomendación de qué no hay que hacer. Ocasionalmente vemos gente recomendar que le diga a Apache que examine todos los ficheros + .html para activar SSI, para no tener que lidiar renombrando los ficheros a .shtml. Quizás estas personas no hayan oido hablar de XBitHack. Lo que hay que tener en cuenta, es que haciendo eso, está pidiendo al Apache que lea cada uno de los ficheros que manda al cliente, incluso si no contenien directivas SSI. Esto puede ralentizar bastante el servidor, y no es una buena idea.

    + +

    Por supuesto, en Windows, no hay tal cosa como la configuración del bit de ejecución, así que esto limita las opciones un poco.

    + +

    En su configuración por defecto, Apache no envía la fecha de última modificación o la longitud de contenido de páginas SSI porque es dificil calcular estos valores para contenido dinámico. Esto puede impedir que se cachee un documento, y dar como resultado en apareciencia un rendimiento más lento del cliente. Hay dos maneras de solucionar esto:

    + +
      +
    1. Usando la configuración XBitHack Full. Esto le indica a apache que determine la fecha de última modificación mirando sólo la fecha del fichero que se ha solicitado originalmente, obviando la modificación de cualquier otro fichero al que se hace referencia mediante SSI.
    2. + +
    3. Use las directivas facilitadas por mod_expires para configurar una expiración específica de tiempo en sus ficheros, y así hacer saber a proxies o navegadores web que es aceptable cachearlos.
    4. +
    +
    top
    +
    +

    Directivas SSI básicas

    + +

    Las directivas SSI tienen la sintaxis siguiente:

    +

    + <!--#function attribute=value attribute=value ... --> +

    + +

    Se formatean como comentarios HTML, así si no tiene SSI habilitado correctamente, el navegador las obviará, pero todavía serán visibles en el fichero HTML. Si tiene SSI configurado correctamente, la directiva será reemplazada con su propio resultado.

    + +

    Esta función es una de tantas, y hablaremos de algunas de ellas más adelante. Por ahora, aquí mostramos unos ejemplos de lo que puede hacer con SSI.

    + +

    La fecha de hoy

    + +

    + <!--#echo var="DATE_LOCAL" --> +

    + +

    La función echo sencillamente muestra el valor de una variable. Hay muchas variables estándar que incluyen un conjunto de variables de entorno disponibles para programas CGI. También puede definir sus propias variables con la función set.

    + +

    Si no le gusta el formato en el que se imprime la fecha, puede usar la función config, con un atributo + timefmt para modificar ese formato.

    + +

    + <!--#config timefmt="%A %B %d, %Y" -->
    + Today is <!--#echo var="DATE_LOCAL" --> +

    + + +

    Fecha de modificación del fichero

    + +

    + La última modificación de este documento <!--#flastmod file="index.html" --> +

    + +

    Esta función también está sujeta a configuraciones de formato de + timefmt.

    + + +

    Incluyendo los resultados de un programa CGI

    + +

    Este es uno de los usos más comunes de SSI - para sacar el resultado de un programa CGI, tal y como ocurre con el que fuera el programa favorito de todos, un ``contador de visitas.''

    + +

    + <!--#include virtual="/cgi-bin/counter.pl" --> +

    + + +
    top
    +
    +

    Más ejemplos

    + + +

    A continuación hay algunos ejemplos específicos de cosas que puede hacer con SSI en sus documentos HTML.

    + +

    ¿Cuándo fue modificado este documento?

    + +

    Antes mencionamos que puede usar SSI para informar al usuario cuando el documento ha sido modificado por última vez. Aun así, el método actual para hacerlo se dejó en cuestión. El código que se muestra a continuación, puesto en un documento HTML, pondrá ese sello de tiempo en su página. Por descontado, tendrá que tener SSI habilitado correctamente, como se indicó más arriba.

    +

    + <!--#config timefmt="%A %B %d, %Y" -->
    + Ultima modificación de este fichero <!--#flastmod file="ssi.shtml" --> +

    + +

    Obviamente, necesitará sustituir el nombre de fichero + ssi.shtml con el nombre real del fichero al que usted hace referencia. Esto puede ser inconveniente si solo está buscando un trozo genérico de código que pueda copiar y pegar en cualquier fichero, asi que probablemente necesite usar la variable LAST_MODIFIED en su lugar:

    +

    + <!--#config timefmt="%D" -->
    + Última modificación de este fichero <!--#echo var="LAST_MODIFIED" --> +

    + +

    Para más detalles sobre el formato timefmt, vaya a su buscador favorito y busque strftime. La sintaxis es la misma.

    + + +

    Incluyendo un pie de página estándar

    + + +

    Si gestiona un sitio que tiene más de unas cuantas páginas, probablemente se de cuenta de que modificar todas esa páginas es un auténtico engorro, especialmente si trata de mantener una apareciencia homogénea en todas ellas.

    + +

    Si usa un Include de fichero para la cabecera y/o pie de página puede reducir la carga de trabajo de estas actualizaciones. Solo tiene que hacer un sólo pie de página, y después incluirlo en cada página con el comando SSI include. La función include + puede determinar qué fichero incluir cuando usa el atributo + file, o el atributo virtual. El atributo file es una ruta de fichero, relativa al directorio actual. Eso significa que no puede ser una ruta de fichero absoluta (que comienza con /), ni tampoco puede contener ../ como parte de la ruta. El atributo virtual es probablemente más útil, y debería especificar una URL relativa al documento que se está sirviendo. Puede empezar con una /, pero debe estar en el mismo servidor que el fichero que se está sirviendo.

    +

    + <!--#include virtual="/footer.html" --> +

    + +

    Frecuentemente combinaremos las dos últimas, poniendo una directiva + LAST_MODIFIED dentro de un fichero de pie de página que va a ser incluido. Se pueden encontrar directivas SSI en el fichero que se incluye, las inclusiones pueden anidarse - lo que quiere decir, que el fichero incluido puede incluir otro fichero, y así sucesivamente.

    + + +
    top
    +
    +

    ¿Qué más puedo configurar?

    + + +

    Además de poder configurar el formato de la hora, también puede configurar dos cosas más.

    + +

    Generalmente, cuando algo sale mal con sus directivas SSI, obtiene el mensaje (ha ocurrido un error procesando esta directiva)

    +

    + [an error occurred while processing this directive] +

    + +

    Si quiere cambiar ese mensaje por otra cosa, puede hacerlo con el atributo errmsg para la función + config:

    +

    + <!--#config errmsg="[Parece que no sabe cómo usar SSI]" --> +

    + +

    Afortunadamente, los usuarios finales nunca verán este mensaje, porque habrá resuelto todos los problemas con sus directivas SSI antes de publicar su página web. (¿Verdad?)

    + +

    Y puede configurar el formato en el que los tamaños de fichero se muestran con el formato sizefmt. Puede especificar + bytes para un recuento total en bytes, o + abbrev para un número abreviado en Kb o Mb, según sea necesario.

    +
    top
    +
    +

    Ejecutando comandos

    + + +

    Puede usar la función exec para ejecutar comandos. Y SSI puede ejecutar un comando usando la shell (/bin/sh, para ser más precisos - o la shell de DOS , si está en Win32). Lo siguiente, por ejemplo, le dará un listado de ficheros en un directorio.

    +

    + <pre>
    + <!--#exec cmd="ls" -->
    + </pre> +

    + +

    o, en Windows

    +

    + <pre>
    + <!--#exec cmd="dir" -->
    + </pre> +

    + +

    Notará un formato estraño con esta directiva en Windows, porque el resultado de dir contiene la cadena de caracterers ``<dir>'' ,que confunde a los navegadores.

    + +

    Tenga en cuenta de que esta característica es muy peligrosa, puesto que ejecutará cualquier código que esté especificado con la etiqueta + exec. Si tiene una situación en la que los usuarios pueden editar contenido en sus páginas web, tales como por ejemplo un ``registro de visitas'', asegúrese de tener esta característica deshabilitada. Puede permitir SSI, pero no la característica exec, con el argumento IncludesNOEXEC en la directiva Options.

    +
    top
    +
    +

    Técnicas avanzadas de SSI

    + + +

    Además de mostrar contenido, SSI en Apache da la opción de configurar variables y usar esas variables en comparaciones y condicionales.

    + +

    Configurando Variables

    + +

    Usando la directiva set, puede configurar variables para su uso posterior. La sintaxis es como sigue:

    +

    + <!--#set var="name" value="Rich" --> +

    + +

    Además de configurar valores literales como esto, puede usar cualquier otra variable, incluyendo variables de entorno o las variables que se han mencionado antes (como por ejemplo LAST_MODIFIED) para dar valores a sus variables. Podrá especificar que algo es una vaiable, en lugar de una cadena de caracters literal, usando el símbolo del dolar ($) antes del nombre de la variable.

    + +

    <!--#set var="modified" value="$LAST_MODIFIED" --> +

    + +

    Para poner el símbolo del dolar de manera literal en un valor de su variable tendrá que escapar el símbolo del dolar con una barra "\".

    +

    + <!--#set var="cost" value="\$100" --> +

    + +

    Por último, si quiere poner una variable entre medias de una cadena de caracteres más larga, y se da la coincidencia de que el nombre de la variable se encontrará con otros caracteres, y de esta manera se confundirá con otros caracteres, puedes poner el nombre de la variable entre llaves, y así eliminar la confusión. (Es dificil encontrar un buen ejemplo para esto, pero con éste a lo mejor entiende lo que tratamos de transmitir.)

    +

    + <!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" --> +

    + + +

    Expresiones condicionales

    + + +

    Ahora que tenemos variables, y somos capaces de comparar sus valores, podemos usarlas para expresar condicionales. Esto permite a SSI ser un cierto tipo de lenguaje de programación diminuto. + mod_include provee una estrucura if, + elif, else, endif + para construir declaraciones condicionales. Esto le permite generar de manera efectiva multitud de páginas lógicas desde tan solo una página.

    + +

    La estructura de este sistema condicional es:

    +

    + <!--#if expr="test_condition" -->
    + <!--#elif expr="test_condition" -->
    + <!--#else -->
    + <!--#endif --> +

    + +

    Una test_condition puede ser cualquier tipo de comparación lógica - o bien comparando valores entre ellos, o probando la ``verdad'' (o falsedad) de un valor en particular. (Una cadena de caracteres cualquiera es verdadera si no está vacía.) Para una lista completa de operadores de comparación, vea la documentación de mod_include.

    + +

    Por ejemplo, si quiere personalizar el texto en su página web basado en la hora actual, puede usar la siguiente receta, colocada en su página HTML:

    + +

    + Good + <!--#if expr="%{TIME_HOUR} <12" -->
    + morning!
    + <!--#else -->
    + afternoon!
    + <!--#endif -->
    +

    + +

    Cualquier otra variable (o bien las que defina usted, o variables de entorno normales) puede usarse en declaraciones condicionales. + Vea Expresiones en el Servidor Apache HTTP para más información sobre el motor de evaluación de expresiones.

    + +

    Con la habilidad de Apache de configurar variables de entorno con directivas SetEnvIf, y otras directivas relacionadas, + esta funcionalidad puede llevarle a hacer una gran variedad de contenido dinámico en la parte de servidor sin tener que depender de una aplicación web al completo.

    + +
    top
    +
    +

    Conclusión

    + +

    Desde luego SSI no es un reemplazo para CGI u otras tecnologías que se usen para generar páginas web dinámicas. Pero es un gran método para añadir pequeñas cantidaddes de contenido dinámico a páginas web, sin hacer mucho más trabajo extra.

    +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko 

    +
    top

    Comentarios

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/ssi.html.fr.utf8 b/docs/manual/howto/ssi.html.fr.utf8 new file mode 100644 index 0000000..3647246 --- /dev/null +++ b/docs/manual/howto/ssi.html.fr.utf8 @@ -0,0 +1,518 @@ + + + + + +Tutoriel Apache httpd : Introduction aux "Inclusions Côté Serveur" +(Server Side Includes - SSI) - Serveur HTTP Apache Version 2.4 + + + + + + + +
    <-
    +

    Tutoriel Apache httpd : Introduction aux "Inclusions Côté Serveur" +(Server Side Includes - SSI)

    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko 

    +
    + +

    Les SSI permettent d'ajouter du contenu dynamique à des documents +HTML préexistants.

    +
    + +
    top
    +
    +

    Introduction

    + + +

    Cet article traite des Inclusions Côté Serveur (Server Side + Includes), plus communément appelés SSI. Vous trouverez ici la + manière de configurer votre serveur pour permettre les SSI, ainsi + qu'une introduction à quelques techniques SSI de base permettant + d'ajouter du contenu dynamique à vos pages HTML préexistantes.

    + +

    La dernière partie de cet article sera consacrée aux + configurations SSI plus avancées, telles que les expressions + conditionnelles dans les directives SSI.

    + +
    top
    +
    +

    Qu'est-ce que SSI ?

    + +

    SSI (Server Side Includes) est constitué de directives placées dans + des pages HTML, et évaluées par le serveur au moment où les pages + sont servies. Elles vous permettent d'ajouter du contenu généré + dynamiquement à une page HTML préexistante, sans avoir à servir la + page entière via un programme CGI, ou toute autre technologie de + contenu dynamique.

    + +

    Par exemple, vous pouvez insérer la directive suivante dans une + page HTML existante :

    + +

    + <!--#echo var="DATE_LOCAL" --> +

    + +

    Ainsi, lorsque la page sera servie, la directive sera évaluée et + remplacée par sa valeur :

    + +

    + Tuesday, 15-Jan-2013 19:28:54 EST +

    + +

    Le choix entre l'utilisation des SSI et la génération entière de + la page par un programme quelconque, est en général dicté par la + proportion de contenu statique et de contenu devant être généré + chaque fois que la page est servie. SSI est idéal pour ajouter de + petites quantités d'information, comme l'heure courante dans + l'exemple précédent. Mais si la + plus grande partie de votre page est générée au moment où elle est + servie, vous devez vous tourner vers une autre solution.

    +
    top
    +
    +

    Configurer votre serveur pour permettre les SSI

    + + +

    Pour permettre l'utilisation des SSI sur votre serveur, vous + devez ajouter la directive suivante dans votre fichier + httpd.conf, ou dans un fichier .htaccess + :

    +
    Options +Includes
    + + +

    Cette directive indique à Apache que vous désirez permettre la + recherche de directives SSI lors de l'interprétation des fichiers. + Notez cependant que la plupart des configurations contiennent de + nombreuses directives Options + qui peuvent s'écraser les unes les autres. Vous devrez probablement + appliquer ces directives Options au répertoire + spécifique pour lequel vous voulez activer les SSI, afin d'être sûr + qu'elles y seront bien activées.

    + +

    Tout fichier ne fera cependant pas l'objet de recherche de + directives SSI. Vous devez indiquer à Apache quels fichiers seront + concernés. Vous pouvez y parvenir en indiquant une extension, comme + .shtml, à l'aide des directives suivantes :

    +
    AddType text/html .shtml
    +AddOutputFilter INCLUDES .shtml
    + + +

    Un des désavantages de cette approche réside dans le fait que si + vous voulez ajouter des directives SSI à une page préexistante, vous + devrez changer le nom de cette page, et donc tout lien qui la + contient, de façon à ce qu'elle possède l'extension + .shtml, condition nécessaire pour que les directives + SSI qu'elle contient soient traitées.

    + +

    Une autre méthode consiste à utiliser la directive XBitHack :

    +
    XBitHack on
    + + +

    La directive XBitHack + indique à Apache qu'il doit rechercher des directivves SSI dans les + fichiers si leur bit d'exécution est positionné. Il n'est ainsi plus + nécessaire de changer le nom du fichier pour ajouter des directives + SSI à une page préexistante ; vous devez simplement attribuer les + droits d'exécution au fichier à l'aide de chmod.

    +

    + chmod +x pagename.html +

    + +

    Un bref commentaire sur ce qu'il ne faut pas faire. Certaines + personnes peuvent vous conseiller de tout simplement indiquer à + Apache de rechercher des directives SSI dans tous les fichiers + .html, ce qui vous évite d'avoir à gérer les noms de + fichiers avec extension .shtml. Ils n'ont probablement + pas entendu parler de la directive XBitHack. En effet, vous devez + garder à l'esprit qu'en faisant ceci, Apache va devoir rechercher + des directives SSI dans chaque fichier qu'il sert, même s'il n'en + contient aucune. Ce n'est donc pas une bonne idée car les + performances peuvent en être sensiblement affectées.

    + +

    Bien entendu, sous Windows, il n'y a pas de bit d'exécution à + positionner, ce qui limite un peu vos choix.

    + +

    Dans sa configuration par défaut, Apache n'envoie pas la date de + dernière modification ou les en-têtes HTTP relatifs à la taille des + contenus dans les pages SSI, car ses valeurs sont difficiles à + calculer pour les contenus dynamiques. Ceci peut induire une + impression de diminution des performances côté client, en empêchant + la mise en cache de votre document. Il existe deux méthodes pour + résoudre ce problème :

    + +
      +
    1. Utilisez la configuration XBitHack Full. Elle + indique à Apache de déterminer la date de dernière modification en + ne regardant que la date du fichier à l'origine de la requête, + tout en ignorant la date de modification de tout fichier inclus.
    2. + +
    3. Utilisez les directives fournies par le module + mod_expires pour définir de manière explicite la + date d'expiration de vos fichiers, laissant par la-même + aux navigateurs et aux mandataires le soin de déterminer s'il est + opportun ou non de les mettre en cache.
    4. +
    +
    top
    +
    +

    Directives SSI de base

    + +

    Les directives SSI adoptent la syntaxe suivante :

    +

    + <!--#fonction attribut=valeur attribut=valeur ... --> +

    + +

    Le format d'une directive SSI étant similaire à celui d'un + commentaire HTML, si vous n'avez pas activé correctement SSI, le + navigateur l'ignorera, mais elle sera encore visible dans le source + HTML. Si SSI est correctement configuré, la directive sera remplacée + par ses résultats.

    + +

    "fonction" peut prendre de nombreuses formes, et nous décrirons + plus précisément la plupart d'entre eux dans la prochaine version de + ce document. Pour le moment, voici quelques exemples de ce que vous + pouvez faire avec SSI.

    + +

    La date courante

    + +

    + <!--#echo var="DATE_LOCAL" --> +

    + +

    La fonction echo permet d'afficher la valeur d'une + variable. Il existe un grand nombre de variables standards, y + compris l'ensemble des variables d'environnement disponibles pour + les programmes CGI. De plus, vous pouvez définir vos propres + variables à l'aide de la fonction set.

    + +

    Si vous n'aimez pas le format sous lequel la date s'affiche, vous + pouvez utiliser la fonction config avec un attribut + timefmt, pour le modifier.

    + +

    + <!--#config timefmt="%A %B %d, %Y" -->
    + Today is <!--#echo var="DATE_LOCAL" --> +

    + + +

    Date de modification du fichier

    + +

    + Dernière modification du document <!--#flastmod file="index.html" --> +

    + +

    Le format peut là aussi être modifié à l'aide de l'attribut + timefmt.

    + + +

    Inclusion des résultats d'un programme CGI

    + +

    C'est le cas le plus courant d'utilisation des SSI - afficher les + résultats d'un programme CGI, comme l'universellement adoré + "compteur d'accès".

    + +

    + <!--#include virtual="/cgi-bin/counter.pl" --> +

    + + +
    top
    +
    +

    Exemples additionnels

    + + +

    Vous trouverez dans ce qui suit quelques exemples spécifiques de + ce que vous pouvez faire de vos documents HTML avec SSI.

    + +

    Quand ce document a-t-il été modifié ?

    + +

    Nous avons mentionné plus haut que vous pouviez utiliser SSI pour + informer l'utilisateur de la date de dernière modification du + document. Cependant, la méthode pour y parvenir n'a pas été vraiment + abordée. Placé dans votre document HTML, le code suivant va insérer + un repère de temps dans votre page. Bien entendu, SSI devra avoir + été correctement activé, comme décrit plus haut.

    +

    + <!--#config timefmt="%A %B %d, %Y" -->
    + Dernière modification du fichier <!--#flastmod file="ssi.shtml" --> +

    + +

    Bien entendu, vous devez remplacer ssi.shtml par le + nom du fichier auquel vous faites référence. Ceci ne conviendra pas + si vous recherchez un morceau de code générique que vous pourrez + insérer dans tout fichier ; dans ce cas, il est préférable + d'utiliser la variable LAST_MODIFIED :

    +

    + <!--#config timefmt="%D" -->
    + This file last modified <!--#echo var="LAST_MODIFIED" --> +

    + +

    Pour plus de détails sur le format timefmt, tapez + strftime dans votre moteur de recherche préferé. La + syntaxe est identique.

    + + +

    Inclusion d'un pied de page standard

    + + +

    Si le site que vous gérez comporte plus que quelques pages, vous + allez vite vous apercevoir qu'effectuer des modifications sur toutes + ces pages peut devenir très contraignant, en particulier si vous + voulez qu'elles conservent un aspect homogène.

    + +

    Inclure un fichier pour un en-tête et/ou un pied de page peut + simplifier cette corvée de mises à jour. Il vous suffit de + confectionner un fichier de pied de page, et de l'inclure dans + chaque page à l'aide de l'élément SSI include. Pour + définir le fichier à inclure, la fonction include peut + utiliser soit l'attribut file, soit l'attribut + virtual. L'attribut file est un chemin de + fichier relatif au répertoire courant. C'est à dire qu'il + ne peut ni avoir pour valeur un chemin absolu (commençant par /), ni + comporter "../" dans son chemin. L'attribut virtual est + probablement plus commode, et peut spécifier une URL relative au + document servi. Elle peut commencer par un /, mais le fichier inclus + et le fichier servi doivent résider sur le même serveur.

    +

    + <!--#include virtual="/footer.html" --> +

    + +

    Je combinerai souvent ces deux derniers points, en ajoutant une + directive LAST_MODIFIED dans un fichier de pied de page + destiné à être inclus. Le fichier inclus peut contenir des + directives SSI, et les inclusions peuvent être imbriquées - à + savoir, le fichier inclus peut inclure un autre fichier, etc...

    + + +
    top
    +
    +

    Que puis-je configurer d'autre ?

    + + +

    En plus du format de date, vous pouvez utiliser l'élément + config pour configurer deux autres choses.

    + +

    En général, lorsque quelque chose se passe mal avec votre + directive SSI, vous recevez le message :

    +

    + [an error occurred while processing this directive] +

    + +

    Pour modifier ce message, vous pouvez utiliser l'attribut + errmsg avec la fonction config :

    +

    + <!--#config errmsg="[Il semblerait que vous ne sachiez pas + utiliser les SSI]" --> +

    + +

    Il est cependant probable que les utilisateurs finaux ne voient + jamais ce message, car vous aurez résolu tous les problèmes issus de + vos directives SSI avant que votre site ne soit mis en production. + (N'est-ce pas ?)

    + +

    Vous pouvez aussi modifier le format sous lequel les tailles de + fichiers sont affichées à l'aide de l'attribut sizefmt. + Vous pouvez spécifier bytes pour un affichage en + octets, ou abbrev pour un affichage plus concis en Ko + ou Mo, selon le cas.

    +
    top
    +
    +

    Exécution de commandes

    + + +

    Voici autre chose que vous pouvez faire avec la fonction + exec. Vous pouvez vraiment faire exécuter une commande + par SSI en utilisant le shell (/bin/sh, pour être plus + précis - ou le shell DOS, si vous êtes sous Win32). Par exemple, ce + qui suit vous permet d'afficher le contenu d'un répertoire.

    +

    + <pre>
    + <!--#exec cmd="ls" -->
    + </pre> +

    + +

    ou, sous Windows

    +

    + <pre>
    + <!--#exec cmd="dir" -->
    + </pre> +

    + +

    Vous noterez probablement l'étrange formatage provoqué par cette + directive sous Windows, car la sortie de dir contient + la chaîne de caractères "<dir>", ce qui trompe le + navigateur.

    + +

    Notez que cette fonctionnalité est très dangereuse, car elle va + permettre d'exécuter tout code associé à l'élément + exec. Si vous êtes dans la situation où les + utilisateurs peuvent éditer le contenu de vos pages web, dans le cas + d'un "livre d'or" par exemple, assurez-vous de désactiver cette + fonctionnalité. Vous pouvez, tout en permettant les SSI, désactiver + la fonctionnalité exec à l'aide de l'argument + IncludesNOEXEC de la directive + Options.

    +
    top
    +
    +

    Techniques SSI avancées

    + + +

    Outre l'affichage de contenu, les SSI d'Apache vous permettent de + définir des variables, et de les utiliser dans des comparaisons et + des conditions.

    + +

    Définition de variables

    + +

    Avec l'élément set, vous pouvez définir des + variables pour un usage ultérieur. Comme nous en aurons besoin plus + loin, nous allons en parler tout de suite. La syntaxe se présente + comme suit :

    +

    + <!--#set var="name" value="Rich" --> +

    + +

    Pour affecter une valeur à vos variables, en plus de la + définition littérale de l'exemple ci-dessus, vous pouvez utiliser + une autre variable, y compris les variables d'environnement, ou les variables + décrites plus haut (comme LAST_MODIFIED par exemple). + Pour indiquer qu'il s'agit d'une variable et non d'une chaîne, vous + devez utiliser le symbole dollar ($) devant le nom de la + variable.

    + +

    <!--#set var="modified" value="$LAST_MODIFIED" --> +

    + +

    Pour insérer un caractère $ dans la valeur de votre variable, + vous devez l'échapper à l'aide d'un backslash.

    +

    + <!--#set var="cost" value="\$100" --> +

    + +

    Enfin, si vous voulez insérer une variable dans une chaîne, et + s'il y a une chance pour que le nom de la variable se confonde avec + le reste de la chaîne, vous pouvez l'entourer d'accolades pour + eviter toute confusion (Il est difficile de trouver un bon exemple + pour illustrer ceci, mais j'espère que vous comprendrez).

    +

    + <!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" --> +

    + + +

    Expressions conditionnelles

    + + +

    Maintenent que nous avons des variables, et que nous pouvons + définir et comparer leurs valeurs, nous sommes à même de les + utiliser dans des expressions conditionnelles. Ceci confère à SSI le + statut de petit langage de programmation. + mod_include fournit une structure if, + elif, else, endif pour la + construction d'expressions conditionnelles, ce qui vous permet de + générer plusieurs pages logiques à partir d'une seule vraie + page.

    + +

    La structure de l'expression conditionnelle est :

    +

    + <!--#if expr="condition" -->
    + <!--#elif expr="condition" -->
    + <!--#else -->
    + <!--#endif --> +

    + +

    Une condition peut revêtir la forme de toute comparaison + logique - soit une comparaison de valeurs avec une autre, soit une + vérification de la "vérité" d'une valeur particulière (Une chaîne + donnée est vraie si elle n'est pas vide). Pour une liste exhaustive + des opérateurs de comparaison disponibles, voir la documentation du + module mod_include.

    + +

    Par exemple, spour insérer l'heure du jour dans votre page web, + vous pouvez ajouter ces lignes dans la page HTML :

    + +

    + Good + <!--#if expr="%{TIME_HOUR} <12" -->
    + morning!
    + <!--#else -->
    + afternoon!
    + <!--#endif -->
    +

    + +

    Toute autre variable (que vous avez définie, ou une variable + d'environnement normale) peut être utilisée dans les expressions + conditionnelles. Voir le document Expressions + rationnelles dans le serveur HTTP Apache pour plus de détails à + propos du fonctionnement du moteur d'évaluation des expressions + rationnelles.

    + +

    Associée à la possibilité avec Apache de définir + des variables d'environnement à l'aide de directives + SetEnvIf, ainsi que d'autres directives en rapport, + cette fonctionnalité vous permet d'ajouter une grande variété + de contenus dynamiques côté serveur sans avoir à concevoir une + application web de A à Z.

    + +
    top
    +
    +

    Conclusion

    + +

    SSI ne remplace certainement pas CGI, ou d'autres technologies + utilisées pour la génération de pages web dynamiques. Mais c'est une + bonne méthode pour ajouter des petits contenus dynamiques à vos + pages, sans devoir fournir un gros effort supplémentaire.

    +
    +
    +

    Langues Disponibles:  en  | + es  | + fr  | + ja  | + ko 

    +
    top

    Commentaires

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/ssi.html.ja.utf8 b/docs/manual/howto/ssi.html.ja.utf8 new file mode 100644 index 0000000..4461a2e --- /dev/null +++ b/docs/manual/howto/ssi.html.ja.utf8 @@ -0,0 +1,515 @@ + + + + + +Apache ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«: Server Side Includes 入門 - Apache HTTP サームãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.4 + + + + + + + +
    <-
    +

    Apache ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«: Server Side Includes 入門

    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko 

    +
    +
    ã“ã®æ—¥æœ¬èªžè¨³ã¯ã™ã§ã«å¤ããªã£ã¦ã„ã‚‹ + å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 最近更新ã•れãŸå†…容を見るã«ã¯è‹±èªžç‰ˆã‚’ã”覧下ã•ã„。 +
    + +

    サーãƒã‚µã‚¤ãƒ‰ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã«ã‚ˆã£ã¦ã€æ—¢å­˜ã® HTML +ドキュメントã«å‹•çš„ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„を追加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    +
    + +
    top
    +
    +

    ã¯ã˜ã‚ã«

    + + +

    ã“ã®è¨˜äº‹ã¯ã€é€šå¸¸ã¯å˜ã« SSI ã¨å‘¼ã°ã‚Œã‚‹ Server Side Includes + を扱ã„ã¾ã™ã€‚ã“ã®è¨˜äº‹ã«ãŠã„ã¦ã¯ã€ã‚µãƒ¼ãƒã§ã® SSI を許å¯ã™ã‚‹ãŸã‚ã®è¨­å®šã¨ã€ + ç¾åœ¨ã® HTML ページã«å‹•çš„ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„を加ãˆã‚‹ãŸã‚ã®ã„ãã¤ã‹ã®åŸºæœ¬çš„㪠+ SSI 技術を紹介ã—ã¾ã™ã€‚

    + +

    記事ã®å¾ŒåŠã§ã¯ã€SSI ディレクティブ㧠SSI + ã¨å…±ã«å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã‚‹æ¡ä»¶æ–‡ã®ã‚ˆã†ãª + 幾分高度ãªäº‹æŸ„ã«ã¤ã„ã¦è¿°ã¹ã¦ã„ã¾ã™ã€‚

    + +
    top
    +
    +

    SSI ã¨ã¯ ?

    + +

    SSI (Server Side Includes) ã¯ã€HTML + ページ中ã«é…ç½®ã•れるディレクティブã§ã‚り〠+ サーãƒã§ãƒšãƒ¼ã‚¸ã‚’æä¾›ã™ã‚‹æ™‚ã«è©•価ã•れã¾ã™ã€‚SSI ã¯ã€CGI + プログラムやãã®ä»–ã®å‹•çš„ãªæŠ€è¡“ã§å…¨ã¦ã®ãƒšãƒ¼ã‚¸ã‚’æä¾›ã›ãšã«ã€ + å‹•çš„ã«ç”Ÿæˆã•れãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’ç¾åœ¨ã® HTML ページã«åŠ ãˆã¾ã™ã€‚

    + +

    ã©ã†ã„ã†å ´åˆã« SSI を使ã„ã€ã©ã†ã„ã†å ´åˆã«ãƒ—ログラム㧠+ ページを完全ã«ç”Ÿæˆã™ã‚‹ã‹ã¯ã€ãƒšãƒ¼ã‚¸ã®ã†ã¡ã©ã®ç¨‹åº¦ãŒé™çš„ã§ã‚り〠+ ãƒšãƒ¼ã‚¸ãŒæä¾›ã•れるãŸã³ã«å†è¨ˆç®—ã™ã‚‹å¿…è¦ãŒã©ã®ç¨‹åº¦ã‚ã‚‹ã‹ã§é€šå¸¸ã¯æ±ºå®šã—ã¾ã™ã€‚ + SSI ã¯ç¾åœ¨æ™‚刻ã®ã‚ˆã†ãªå°ã•ã„æƒ…報を加ãˆã‚‹ã«ã¯ã†ã£ã¦ã¤ã‘ã®æ–¹æ³•ã§ã™ã€‚ + ã—ã‹ã—ã€ãã®ãƒšãƒ¼ã‚¸ã®ã»ã¨ã‚“ã©ã®éƒ¨åˆ†ãŒæä¾›æ™‚ã«ç”Ÿæˆã•れる場åˆã¯ã€ + ä»–ã®æ–¹æ³•を探ã™å¿…è¦ãŒã‚りã¾ã™ã€‚

    +
    top
    +
    +

    SSI を許å¯ã™ã‚‹ãŸã‚ã®ã‚µãƒ¼ãƒã®è¨­å®š

    + + +

    サーãƒã§ SSI を許å¯ã™ã‚‹ã«ã¯ã€httpd.conf + ファイルã¾ãŸã¯ .htaccess + ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–を指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™:

    +

    + Options +Includes +

    + +

    ã“ã®æŒ‡å®šã¯ã€ãƒ•ァイルを SSI + ディレクティブã§è§£æžã•ã›ã‚‹ã“ã¨ã‚’許å¯ã™ã‚‹ã¨ã„ã†ã“ã¨ã‚’ Apache + ã«ä¼ãˆã¾ã™ã€‚ã»ã¨ã‚“ã©ã®è¨­å®šã§ã¯ãŠäº’ã„を上書ãã§ãã‚‹ã€è¤‡æ•°ã® + Options ãŒã‚ã‚‹ã“ã¨ã« + 注æ„ã—ã¦ãã ã•ã„。ãŠãらãã€è¨­å®šãŒæœ€å¾Œã«è©•価ã•れるã“ã¨ã‚’ + ä¿è¨¼ã•れるãŸã‚ã«ã€SSI を使用ã—ãŸã„ディレクトリ㫠Options + ディレクティブをé©ç”¨ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã§ã—ょã†ã€‚

    + +

    å…¨ã¦ã®ãƒ•ァイル㌠SSI + ディレクティブã§è§£æžã•れるã¨ã„ã†ã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“。 + ã©ã®ãƒ•ァイルãŒè§£æžã•れるã‹ã‚’ Apache ã«ä¼ãˆã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + ã“れを行ãªã†ã«ã¯äºŒã¤æ–¹æ³•ãŒã‚りã¾ã™ã€‚ + 次ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–を使ã†ã“ã¨ã§ã€ä¾‹ãˆã° .shtml + ã®ã‚ˆã†ãªç‰¹åˆ¥ãªãƒ•ァイル拡張å­ã‚’æŒã¤ãƒ•ァイルを解æžã™ã‚‹ã‚ˆã† + Apache ã«ä¼ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™:

    +

    + AddType text/html .shtml
    + AddOutputFilter INCLUDES .shtml +

    + +

    ã“ã®æ–¹æ³•ã®æ¬ ç‚¹ã¯ã€ã‚‚ã—ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã« SSI ディレクティブを加ãˆãŸã„å ´åˆã€ + ãれらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ãŒå®Ÿè¡Œã•れるよã†ã« + .shtml æ‹¡å¼µå­ã«ã™ã‚‹ãŸã‚ã€ãã®ãƒšãƒ¼ã‚¸ã®åå‰ã¨ã€ + ãã®ãƒšãƒ¼ã‚¸ã¸ã®å…¨ã¦ã®ãƒªãƒ³ã‚¯ã‚’変更ã—ãªã‘れã°ãªã‚‰ãªã„ã“ã¨ã§ã™ã€‚

    + +

    ã‚‚ã†ä¸€ã¤ã®æ–¹æ³•ã¯ã€XBitHack + ディレクティブを使用ã™ã‚‹ã“ã¨ã§ã™:

    +

    + XBitHack on +

    + +

    XBitHack + ã¯ã€ãƒ•ァイルã®å®Ÿè¡Œãƒ“ットãŒç«‹ã£ã¦ã„ã‚‹å ´åˆã€ + SSI ディレクティブã«ã‚ˆã‚Šè§£æžã™ã‚‹ã“ã¨ã‚’ Apache ã«ä¼ãˆã¾ã™ã€‚ + 従ã£ã¦ã€SSI ディレクティブをç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã«åŠ ãˆã‚‹ãŸã‚ã«ã¯ã€ + ファイルåを変更ã—ãªãã¦ã‚‚よãã€å˜ã« chmod + を使用ã—ã¦ãƒ•ァイルを実行å¯èƒ½ã«ã™ã‚‹ã ã‘ã§æ¸ˆã¿ã¾ã™ã€‚

    +

    + chmod +x pagename.html +

    + +

    行ãªã†ã¹ãã§ã¯ãªã„ã“ã¨ã«é–¢ã™ã‚‹çŸ­ã„コメント。時々誰ã‹ãŒã€å…¨ã¦ã® + .html ファイルを SSI ã§è§£æžã™ã‚‹ã‚ˆã† Apache ã«ä¼ãˆã‚Œã°ã€ + ã‚ã–ã‚ã– .shtml ã¨ã„ã†ãƒ•ァイルåã«ã™ã‚‹å¿…è¦ãŒãªã„ã¨ã„ã£ã¦ + è–¦ã‚ã‚‹ã®ã‚’見るã“ã¨ã§ã—ょã†ã€‚ã“ã†ã„ã†äººãŸã¡ã¯ã€ãŠãらã + XBitHack + ã«ã¤ã„ã¦èžã„ãŸã“ã¨ãŒãªã„ã®ã§ã—ょã†ã€‚ + ã“ã®æ–¹æ³•ã«ã¤ã„ã¦æ³¨æ„ã™ã‚‹ã“ã¨ã¯ã€ãŸã¨ãˆ SSI + ディレクティブを全ãå«ã¾ãªã„å ´åˆã§ã‚‚ã€Apache ãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã« + é€ã‚‹å…¨ã¦ã®ãƒ•ァイルを最後ã¾ã§èª­ã¿è¾¼ã¾ã›ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ + ã“ã®æ–¹æ³•ã¯ã‹ãªã‚Šå‡¦ç†ã‚’é…ãã™ã‚‹ã‚‚ã®ã§ã‚りã€è‰¯ããªã„アイデアã§ã™ã€‚

    + +

    ã‚‚ã¡ã‚ã‚“ã€Windows ã§ã¯ãã®ã‚ˆã†ãªå®Ÿè¡Œãƒ“ットをセット + ã™ã‚‹ã‚ˆã†ãªã‚‚ã®ã¯ã‚りã¾ã›ã‚“ã®ã§ã‚ªãƒ—ションãŒå°‘ã—制é™ã•れã¦ã„ã¾ã™ã€‚

    + +

    デフォルトã®è¨­å®šã§ã¯ã€Apache 㯠SSI ページã«ã¤ã„ã¦æœ€çµ‚変更時刻や + コンテンツã®é•·ã•ã‚’ HTTP ヘッダã«é€ã‚Šã¾ã›ã‚“。 + å‹•çš„ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã§ã‚ã‚‹ãŸã‚ã€ãれらã®å€¤ã‚’計算ã™ã‚‹ã®ãŒé›£ã—ã„ã‹ã‚‰ã§ã™ã€‚ + ã“ã®ãŸã‚ドキュメントãŒã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れãªããªã‚Šã€ + çµæžœã¨ã—ã¦ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®æ€§èƒ½ãŒé…ããªã£ãŸã‚ˆã†ã«æ„Ÿã˜ã•ã›ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ + ã“れを解決ã™ã‚‹æ–¹æ³•ãŒäºŒã¤ã‚りã¾ã™:

    + +
      +
    1. XBitHack Full 設定を使用ã™ã‚‹ã€‚ + ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã‚‚ã¨ã‚‚ã¨è¦æ±‚ã•れãŸãƒ•ã‚¡ã‚¤ãƒ«ã®æ™‚刻をå‚ç…§ã—〠+ 読ã¿è¾¼ã¾ã‚Œã‚‹ãƒ•ァイルã®å¤‰æ›´æ™‚刻を無視ã—ã¦æœ€çµ‚変更時刻を決定ã™ã‚‹ã‚ˆã† + Apache ã«ä¼ãˆã¾ã™ã€‚
    2. + +
    3. mod_expires + ã§æä¾›ã•れã¦ã„るディレクティブを使用ã—ã¦ã€ + ファイルãŒç„¡åйã«ãªã‚‹æ™‚刻を明示ã—ã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€ + ブラウザã¨ãƒ—ロキシã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãŒæœ‰åйã§ã‚ã‚‹ã“ã¨ã‚’通知ã—ã¾ã™ã€‚
    4. +
    +
    top
    +
    +

    基本的㪠SSI ディレクティブ

    + +

    SSI ディレクティブã¯ä»¥ä¸‹ã®æ–‡æ³•ã§è¨˜è¿°ã—ã¾ã™:

    +

    + <!--#element attribute=value attribute=value ... --> +

    + +

    HTML ã®ã‚³ãƒ¡ãƒ³ãƒˆã®ã‚ˆã†ãªæ›¸å¼ã‚’ã—ã¦ã„ã‚‹ã®ã§ã€ã‚‚ã— SSI + ã‚’æ­£ã—ã動作å¯èƒ½ã«ã—ãªã‘れã°ã€ãƒ–ラウザã¯ãれを無視ã™ã‚‹ã§ã—ょã†ã€‚ + ã—ã‹ã—ã€HTML ソース中ã§ã¯è¦‹ãˆã¾ã™ã€‚ã‚‚ã— SSI ã‚’æ­£ã—ã設定ã—ãŸãªã‚‰ã€ + ディレクティブã¯ãã®çµæžœã¨ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚

    + +

    element ã¯ãŸãã•ã‚“ã‚ã‚‹ã‚‚ã®ã‹ã‚‰ä¸€ã¤æŒ‡å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + 指定ã§ãã‚‹ã‚‚ã®ã®å¤§å¤šæ•°ã«ã¤ã„ã¦ã¯ã€æ¬¡å›žã‚‚ã†å°‘ã—詳ã—ã説明ã—ã¾ã™ã€‚ + ã“ã“ã§ã¯ã€SSI ã§è¡Œãªã†ã“ã¨ãŒã§ãる例をã„ãã¤ã‹ç¤ºã—ã¾ã™ã€‚

    + +

    ä»Šæ—¥ã®æ—¥ä»˜

    + +

    + <!--#echo var="DATE_LOCAL" --> +

    + +

    echo è¦ç´ ã¯å˜ã«å¤‰æ•°ã®å€¤ã‚’出力ã—ã¾ã™ã€‚ + CGI プログラムã«åˆ©ç”¨å¯èƒ½ãªç’°å¢ƒå¤‰æ•°ã®å…¨ã¦ã® + セットをå«ã‚€å¤šãã®æ¨™æº–変数ãŒã‚りã¾ã™ã€‚ã¾ãŸã€set + è¦ç´ ã‚’用ã„ã‚‹ã“ã¨ã§ã€ç‹¬è‡ªã®å¤‰æ•°ã‚’定義ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +

    + +

    出力ã•ã‚Œã‚‹æ—¥ä»˜ã®æ›¸å¼ãŒå¥½ãã§ã¯ãªã„å ´åˆã€ãã®æ›¸å¼ã‚’修正ã™ã‚‹ãŸã‚ã«ã€ + config è¦ç´ ã« timefmt + 属性を使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    + <!--#config timefmt="%A %B %d, %Y" -->
    + Today is <!--#echo var="DATE_LOCAL" --> +

    + + +

    ファイルã®å¤‰æ›´æ—¥

    + +

    + This document last modified <!--#flastmod file="index.html" --> +

    + +

    ã“ã®è¦ç´ ã‚‚ timefmt + フォーマットã®è¨­å®šã«å¾“ã„ã¾ã™ã€‚

    + + +

    CGI プログラムã®çµæžœã‚’å–り込む

    + +

    ã“れã¯ã€å…¨ã¦ã®äººã®ãŠæ°—ã«å…¥ã‚Šã§ã‚ã‚‹ ``ヒットカウンタ'' ã®ã‚ˆã†ãª + CGI プログラムã®çµæžœã‚’出力ã™ã‚‹ SSI + ã®ã‚ˆã‚Šä¸€èˆ¬çš„ãªä½¿ç”¨ã®ã†ã¡ã®ä¸€ã¤ã§ã™ã€‚

    + +

    + <!--#include virtual="/cgi-bin/counter.pl" --> +

    + + +
    top
    +
    +

    追加ã®ä¾‹

    + + +

    以下ã¯ã€SSI を使用ã—㦠HTML + ドキュメントã«ãŠã„ã¦ã§ãã‚‹ã“ã¨ã®ã„ãã¤ã‹ã®ç‰¹åˆ¥ãªä¾‹ã§ã™ã€‚

    + +

    ã„ã¤ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ä¿®æ­£ã•れãŸã®ã‹ +?

    + +

    å…ˆã«ã€ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆãŒæœ€å¾Œã«å¤‰æ›´ã•れãŸã®ã¯ã„ã¤ã‹ã‚’ + ユーザã«é€šçŸ¥ã™ã‚‹ãŸã‚ã« SSI を使用ã™ã‚‹ã“ã¨ãŒã§ãã‚‹ã“ã¨ã‚’è¿°ã¹ã¾ã—ãŸã€‚ + ã—ã‹ã—ãªãŒã‚‰ã€å®Ÿéš›ã®æ–¹æ³•ã¯ã€ã„ãã¶ã‚“å•題ã®ã¾ã¾ã«ã—ã¦ãŠãã¾ã—ãŸã€‚ + HTML ドキュメントã«é…ç½®ã•ã‚ŒãŸæ¬¡ã®ã‚³ãƒ¼ãƒ‰ã¯ã€ãƒšãƒ¼ã‚¸ã«ãã®ã‚ˆã†ãª + タイムスタンプを入れるã§ã—ょã†ã€‚ã‚‚ã¡ã‚ã‚“ã€ä¸Šè¿°ã®ã‚ˆã†ã«ã€ + SSI ã‚’æ­£ã—ã動作å¯èƒ½ã«ã—ã¦ãŠãå¿…è¦ãŒã‚りã¾ã™ã€‚

    +

    + <!--#config timefmt="%A %B %d, %Y" -->
    + This file last modified <!--#flastmod file="ssi.shtml" --> +

    + +

    ã‚‚ã¡ã‚ã‚“ã€ssi.shtml + ã®éƒ¨åˆ†ã‚’実際ã®å½“該ファイルåã¨ç½®ãæ›ãˆã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + ã‚‚ã—ã€ã‚らゆるファイルã«å¼µã‚‹ã“ã¨ãŒã§ãる一般的ãªã‚³ãƒ¼ãƒ‰ã‚’探ã—ã¦ã„ã‚‹ãªã‚‰ã€ + ã“れã¯ä¸ä¾¿ã§ã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。ãŠãらããã®å ´åˆã¯ã€ + ãã†ã™ã‚‹ä»£ã‚りã«å¤‰æ•° LAST_MODIFIED + を使用ã—ãŸã„ã¨è€ƒãˆã‚‹ã§ã—ょã†:

    +

    + <!--#config timefmt="%D" -->
    + This file last modified <!--#echo var="LAST_MODIFIED" --> +

    + +

    timefmt + 書å¼ã«ã¤ã„ã¦ã®ã‚ˆã‚Šè©³ç´°ã«ã¤ã„ã¦ã¯ã€ãŠå¥½ã¿ã®æ¤œç´¢ã‚µã‚¤ãƒˆã«è¡Œã〠+ strftime ã§æ¤œç´¢ã—ã¦ã¿ã¦ãã ã•ã„。文法ã¯åŒã˜ã§ã™ã€‚

    + + +

    標準ã®ãƒ•ッタを挿入ã™ã‚‹

    + + +

    ã‚‚ã—æ•°ãƒšãƒ¼ã‚¸ã‚’è¶…ãˆã‚‹ãƒšãƒ¼ã‚¸ã‚’æŒã¤ã‚µã‚¤ãƒˆã‚’管ç†ã—ã¦ã„ã‚‹ãªã‚‰ã°ã€ + 全ページã«å¯¾ã—ã¦å¤‰é …を行ãªã†ã“ã¨ãŒæœ¬å½“ã«è‹¦ç—›ã¨ãªã‚Šå¾—ã‚‹ã“ã¨ãŒ + 分ã‹ã‚‹ã§ã—ょã†ã€‚å…¨ã¦ã®ãƒšãƒ¼ã‚¸ã«æ¸¡ã£ã¦ã‚ã‚‹ç¨®ã®æ¨™æº–çš„ãªå¤–観を + ç¶­æŒã—よã†ã¨ã—ã¦ã„ã‚‹ãªã‚‰ã°ç‰¹ã«ãã†ã§ã—ょã†ã€‚

    + +

    ãƒ˜ãƒƒãƒ€ã‚„ãƒ•ãƒƒã‚¿ç”¨ã®æŒ¿å…¥ç”¨ãƒ•ァイルを使用ã™ã‚‹ã“ã¨ã§ã€ + ã“ã®ã‚ˆã†ãªæ›´æ–°ã«ã‹ã‹ã‚‹è² æ‹…を減らã™ã“ã¨ãŒã§ãã¾ã™ã€‚ + 一ã¤ã®ãƒ•ッタファイルを作æˆã—ã€ãれを include + SSI コマンドã§å„ページã«å…¥ã‚Œã‚‹ã ã‘ã§æ¸ˆã¿ã¾ã™ã€‚include + è¦ç´ ã¯ã€file 属性ã¾ãŸã¯ virtual + 属性ã®ã„ãšã‚Œã‹ã‚’使用ã—ã¦ã©ã®ãƒ•ァイルを挿入ã™ã‚‹ã‹ã‚’決ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + file 属性ã¯ã€ã‚«ãƒ¬ãƒ³ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã§ç¤ºã•れ㟠+ ファイルパスã§ã™ã€‚ + ãれ㯠/ ã§å§‹ã¾ã‚‹çµ¶å¯¾ãƒ•ァイルパスã«ã¯ã§ããšã€ã¾ãŸã€ãã®ãƒ‘スã®ä¸€éƒ¨ã« ../ + ã‚’å«ã‚€ã“ã¨ãŒã§ããªã„ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚virtual + 属性ã¯ã€ãŠãらãより便利ã ã¨æ€ã„ã¾ã™ãŒã€æä¾›ã™ã‚‹ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‹ã‚‰ã®ç›¸å¯¾ + URL ã§æŒ‡å®šã™ã¹ãã§ã™ã€‚ãれ㯠/ ã§å§‹ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ãŒã€ + æä¾›ã™ã‚‹ãƒ•ァイルã¨åŒã˜ã‚µãƒ¼ãƒä¸Šã«å­˜åœ¨ã—ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“。

    +

    + <!--#include virtual="/footer.html" --> +

    + +

    ç§ã¯æœ€å¾Œã®äºŒã¤ã‚’組ã¿åˆã‚ã›ã¦ã€LAST_MODIFIED + ディレクティブをフッタファイルã®ä¸­ã«ç½®ãã“ã¨ãŒã‚ˆãã‚りã¾ã™ã€‚ + SSI ディレクティブã¯ã€æŒ¿å…¥ç”¨ã®ãƒ•ァイルã«å«ã¾ã›ãŸã‚Šã€ + 挿入ファイルã®ãƒã‚¹ãƒˆã‚’ã—ãŸã‚Šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã™ãªã‚ã¡ã€ + 挿入用ã®ãƒ•ァイルã¯ä»–ã®ãƒ•ァイルをå†å¸°çš„ã«æŒ¿å…¥ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + + +
    top
    +
    +

    ä»–ã«ä½•ãŒè¨­å®šã§ãã‚‹ã®ã‹ ?

    + + +

    時刻書å¼ã‚’ config ã§è¨­å®šã§ãã‚‹ã“ã¨ã«åŠ ãˆã¦ã€ + æ›´ã«äºŒã¤ config ã§è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    通常ã€SSI ディレクティブã§ä½•ã‹ãŒã†ã¾ãã„ã‹ãªã„ã¨ãã¯ã€ + 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå‡ºåŠ›ã•れã¾ã™ã€‚

    +

    + [an error occurred while processing this directive] +

    + +

    ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ä»–ã®ã‚‚ã®ã«ã—ãŸã„å ´åˆã€config + è¦ç´ ã® errmsg 属性ã§å¤‰æ›´ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:

    +

    + <!--#config errmsg="[It appears that you don't know how to use SSI]" --> +

    + +

    ãŠãらãã€ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã¯ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’決ã—ã¦è¦‹ã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。 + ãªãœãªã‚‰ã€ãã®ã‚µã‚¤ãƒˆãŒç”ŸããŸçŠ¶æ…‹ã«ãªã‚‹å‰ã« SSI ディレクティブã«é–¢ã™ã‚‹ + å…¨ã¦ã®å•題を解決ã—ã¦ã„ã‚‹ã¯ãšã ã‹ã‚‰ã§ã™ã€‚(ãã†ã§ã™ã‚ˆã­?)

    + +

    ãã—ã¦ã€config ã«ãŠã„㦠sizefmt + 属性を使用ã™ã‚‹ã“ã¨ã§ã€ + è¿”ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºã®æ›¸å¼ã‚’設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ãƒã‚¤ãƒˆæ•°ã«ã¯ bytes ã‚’ã€é©å½“ã« Kb ã‚„ Mb + ã«çŸ­ç¸®ã•ã›ã‚‹ã«ã¯ abbrev を指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    +
    top
    +
    +

    コマンドã®å®Ÿè¡Œ

    + + +

    今後数ヶ月ã®ã†ã¡ã«ã€å°ã•㪠CGI プログラム㨠SSI + を使用ã™ã‚‹è¨˜äº‹ã‚’出ã—ãŸã„ã¨è€ƒãˆã¦ã„ã¾ã™ã€‚ã“ã“ã§ã¯ãれã¨ã¯åˆ¥ã«ã€ + exec è¦ç´ ã«ã‚ˆã£ã¦è¡Œãªã†ã“ã¨ãŒã§ãã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚ + SSI ã«ã‚·ã‚§ãƒ« (正確ã«ã¯ /bin/sh。Win32 ãªã‚‰ã° DOS シェル) + を使用ã—ã¦ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + 下記ã®ä¾‹ã§ã¯ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒªã‚¹ãƒˆå‡ºåŠ›ã‚’è¡Œãªã„ã¾ã™ã€‚

    +

    + <pre>
    + <!--#exec cmd="ls" -->
    + </pre> +

    + +

    Windows 上ã§ã¯ã€

    +

    + <pre>
    + <!--#exec cmd="dir" -->
    + </pre> +

    + +

    Windows 上ã§ã¯ã€ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã«ã‚ˆã£ã¦ã„ãã¤ã‹ã®å¥‡å¦™ãª + 書å¼ã«æ°—ã¥ãã§ã—ょã†ã€‚ãªãœãªã‚‰ dir ã®å‡ºåŠ›ãŒæ–‡å­—列 + ``<dir>'' ã‚’å«ã¿ã€ãƒ–ラウザを混乱ã•ã›ã‚‹ã‹ã‚‰ã§ã™ã€‚

    + +

    ã“ã®æ©Ÿèƒ½ã¯éžå¸¸ã«å±é™ºã§ã‚りã€ã©ã‚“ãªã‚³ãƒ¼ãƒ‰ã§ã‚‚ exec + ã‚¿ã‚°ã«åŸ‹ã‚è¾¼ã¾ã‚Œã¦ã—ã¾ãˆã°å®Ÿè¡Œã™ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。例ãˆã° + `` ゲストブック '' ã®ã‚ˆã†ã«ã€ã‚‚ã—〠+ ユーザãŒãƒšãƒ¼ã‚¸ã®å†…容を編集ã§ãる状æ³ã«ã‚ã‚‹ãªã‚‰ã°ã€ + ã“ã®æ©Ÿèƒ½ã‚’ç¢ºå®Ÿã«æŠ‘åˆ¶ã—ã¦ãã ã•ã„。Options + ディレクティブ㮠IncludesNOEXEC 引数を指定ã™ã‚‹ã“ã¨ã§ã€ + SSI ã¯è¨±å¯ã™ã‚‹ã‘れ㩠exec + 機能ã¯è¨±å¯ã—ãªã„よã†ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    +
    top
    +
    +

    高度㪠SSI テクニック

    + + +

    コンテンツを出力ã™ã‚‹ã“ã¨ã«åŠ ãˆã€Apache SSI ã¯å¤‰æ•°ã‚’設定ã—〠+ ãã—ã¦æ¯”è¼ƒã¨æ¡ä»¶åˆ†å²ã«ãã®å¤‰æ•°ã‚’使用ã§ãる機能をæä¾›ã—ã¦ã„ã¾ã™ã€‚ +

    + +

    警告

    + +

    ã“ã®è¨˜äº‹ã§è¿°ã¹ãŸå¤§éƒ¨åˆ†ã®æ©Ÿèƒ½ã¯ã€Apache 1.2 + 以é™ã‚’使用ã—ã¦ã„ã‚‹å ´åˆã®ã¿åˆ©ç”¨å¯èƒ½ã§ã™ã€‚ã‚‚ã¡ã‚ã‚“ã€ã‚‚ã— Apache 1.2 + 以é™ã‚’使用ã—ã¦ãªã„å ´åˆã€ç›´ã¡ã«ã‚¢ãƒƒãƒ—グレードã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + ã•ãã€ä»Šãれを行ãªã„ãªã•ã„。ãれã¾ã§å¾…ã£ã¦ã„ã¾ã™ã€‚

    + + +

    変数を設定ã™ã‚‹

    + +

    set ディレクティブを使用ã—ã¦ã€ + 後ã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã«å¤‰æ•°ã‚’設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã“れã¯å¾Œã®èª¬æ˜Žã§å¿…è¦ã«ãªã‚‹ã®ã§ã€ã“ã“ã§ãれã«ã¤ã„ã¦è¿°ã¹ã¦ã„ã¾ã™ã€‚ + 文法ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šã§ã™:

    +

    + <!--#set var="name" value="Rich" --> +

    + +

    ã“ã®ã‚ˆã†ã«å˜ç´”ã«æ–‡å­—ã©ãŠã‚Šã«è¨­å®šã™ã‚‹ã“ã¨ã«åŠ ãˆã€ + 環境変数や上記ã®å¤‰æ•° + (例ãˆã° LAST_MODIFIED ã®ã‚ˆã†ãª) + ã‚’å«ã‚€ä»–ã®ã‚らゆる変数を値を設定ã™ã‚‹ã®ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + 変数åã®å‰ã«ãƒ‰ãƒ«è¨˜å· ($) を使用ã™ã‚‹ã“ã¨ã§ã€ + ãれãŒãƒªãƒ†ãƒ©ãƒ«æ–‡å­—列ã§ã¯ãªãã¦å¤‰æ•°ã§ã‚ã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚

    +

    + <!--#set var="modified" value="$LAST_MODIFIED" --> +

    + +

    ãƒ‰ãƒ«è¨˜å· ($) を文字ã¨ã—ã¦å¤‰æ•°ã®å€¤ã«å…¥ã‚Œã‚‹ã«ã¯ã€ + ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã«ã‚ˆã£ã¦ãƒ‰ãƒ«è¨˜å·ã‚’エスケープã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚

    +

    + <!--#set var="cost" value="\$100" --> +

    + +

    最後ã«ãªã‚Šã¾ã™ãŒã€é•·ã„文字列ã®ä¸­ã«å¤‰æ•°ã‚’ç½®ããŸã„å ´åˆã§ã€ + 変数åãŒä»–ã®æ–‡å­—ã¨ã¶ã¤ã‹ã‚‹å¯èƒ½æ€§ãŒã‚り〠+ ãã‚Œã‚‰ã®æ–‡å­—ã«ã¤ã„ã¦æ··ä¹±ã—ã¦ã—ã¾ã†å ´åˆã€ã“ã®æ··ä¹±ã‚’å–り除ããŸã‚〠+ 変数åを中括弧ã§å›²ã‚€ã“ã¨ãŒã§ãã¾ã™ + (ã“れã«ã¤ã„ã¦ã®è‰¯ã„例を示ã™ã®ã¯é›£ã—ã„ã®ã§ã™ãŒã€ + ãŠãらã分ã‹ã£ã¦ã„ãŸã ã‘ã‚‹ã§ã—ょã†)。 +

    +

    + <!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" --> +

    + + +

    æ¡ä»¶å¼

    + + +

    ã•ã¦ã€å¤‰æ•°ã‚’æŒã£ã¦ã„ã¦ã€ + ãれらã®å€¤ã‚’設定ã—ã¦æ¯”較ã™ã‚‹ã“ã¨ãŒã§ãã‚‹ã®ã§ã™ã‹ã‚‰ã€ + æ¡ä»¶ã‚’表ã™ãŸã‚ã«ãれらを使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã«ã‚ˆã‚Š + SSI ã¯ã‚る種ã®å°ã•ãªãƒ—ログラミング言語ã«ãªã£ã¦ã„ã¾ã™ã€‚ + mod_include ã¯æ¡ä»¶ã‚’表ç¾ã™ã‚‹ãŸã‚ã« if, + elif, else, endif + 構造をæä¾›ã—ã¦ã„ã¾ã™ã€‚ã“れã«ã‚ˆã£ã¦ã€ + 一ã¤ã®å®Ÿéš›ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰è¤‡æ•°ã®è«–ç†ãƒšãƒ¼ã‚¸ã‚’効果的ã«ç”Ÿæˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +

    æ¡ä»¶æ§‹é€ ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šã§ã™:

    +

    + <!--#if expr="test_condition" -->
    + <!--#elif expr="test_condition" -->
    + <!--#else -->
    + <!--#endif --> +

    + +

    test_condition + ã¯ã‚らゆる種類ã®è«–ç†çš„æ¯”較をã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + 値を比較ã—ãŸã‚Šã€ãã®å€¤ãŒ ``真'' ã‹ã©ã†ã‹ã‚’評価ã—ã¾ã™ + (空ã§ãªã„ãªã‚‰ä¸Žãˆã‚‰ã‚ŒãŸæ–‡å­—列ã¯çœŸã§ã™)。 + 利用å¯èƒ½ãªæ¯”較演算å­ã®å…¨ã¦ã®ãƒªã‚¹ãƒˆã«ã¤ã„ã¦ã¯ã€ + mod_include ドキュメンテーションをå‚ç…§ã—ã¦ãã ã•ã„。 + ã“ã“ã§ã¯ã€ã“ã®æ§‹é€ ã‚’ã©ã†ä½¿ç”¨ã™ã‚‹ã‹ã®ä¾‹ã‚’ã„ãã¤ã‹ç¤ºã—ã¾ã™ã€‚

    + +

    è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã§æ¬¡ã®è¡Œã‚’記述ã—ã¾ã™:

    +

    + BrowserMatchNoCase macintosh Mac
    + BrowserMatchNoCase MSIE InternetExplorer +

    + +

    ã“れã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒ Macintosh + 上ã§ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã‚¨ã‚¯ã‚¹ãƒ—ローラãŒå‹•ã„ã¦ã„ã‚‹å ´åˆã€ç’°å¢ƒå¤‰æ•° + ``Mac'' 㨠``InternetExplorer'' を真ã¨è¨­å®šã—ã¾ã™ã€‚

    + +

    次ã«ã€SSI ãŒå¯èƒ½ã«ãªã£ãŸãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã§ä»¥ä¸‹ã‚’行ãªã„ã¾ã™: +

    +

    + <!--#if expr="${Mac} && ${InternetExplorer}" -->
    + Apologetic text goes here
    + <!--#else -->
    + Cool JavaScript code goes here
    + <!--#endif --> +

    + +

    Mac 上㮠IE ã«å¯¾ã—ã¦ä½•ã‹æ€ã†ã¨ã“ã‚ãŒã‚ã‚‹ã‚ã‘ã§ã‚りã¾ã›ã‚“。 + ä»–ã§ã¯å®Ÿè¡Œã§ãã¦ã„ã‚‹ã„ãã¤ã‹ã® JavaScript ã‚’ Mac 上㮠IE + ã§å®Ÿè¡Œã•ã›ã‚‹ã®ã«ã€å…ˆé€±æ•°æ™‚間苦労ã—ãŸã¨ã„ã†ã ã‘ã®ã“ã¨ã§ã™ã€‚ + 上ã®ä¾‹ã¯ãã®æš«å®šçš„ãªå¯¾å‡¦æ–¹æ³•ã§ã™ã€‚

    + +

    ä»–ã®ã©ã‚“ãªå¤‰æ•° (ã‚ãªãŸãŒå®šç¾©ã™ã‚‹ã‚‚ã®ã€ + ã¾ãŸã¯æ™®é€šã®ç’°å¢ƒå¤‰æ•°ã®ã„ãšã‚Œã‹) ã‚‚ã€æ¡ä»¶æ–‡ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + Apache 㯠SetEnvIf ディレクティブや他ã®é–¢é€£ + ディレクティブを使用ã—ã¦ç’°å¢ƒå¤‰æ•°ã‚’設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã“ã®æ©Ÿèƒ½ã«ã‚ˆã‚Šã€CGI + ã«é ¼ã‚‹ã“ã¨ãªãã‹ãªã‚Šè¤‡é›‘ãªå‹•çš„ãªã“ã¨ã‚’ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    + +
    top
    +
    +

    終ã‚りã«

    + +

    SSI ã¯ç¢ºã‹ã« CGI + ã‚„å‹•çš„ãªã‚¦ã‚§ãƒ–ページを生æˆã™ã‚‹ä»–ã®æŠ€è¡“ã«ä»£ã‚ã‚‹ã‚‚ã®ã§ã¯ã‚りã¾ã›ã‚“。 + ã—ã‹ã—ã€ãŸãã•ã‚“ã®ä½™åˆ†ãªä½œæ¥­ã‚’ã›ãšã«ã€ + å°‘é‡ã®å‹•çš„ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„を加ãˆã‚‹ã«ã¯ã™ãã‚ŒãŸæ–¹æ³•ã§ã™ã€‚

    +
    +
    +

    翻訳済ã¿è¨€èªž:  en  | + es  | + fr  | + ja  | + ko 

    +
    top

    コメント

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/howto/ssi.html.ko.euc-kr b/docs/manual/howto/ssi.html.ko.euc-kr new file mode 100644 index 0000000..398f420 --- /dev/null +++ b/docs/manual/howto/ssi.html.ko.euc-kr @@ -0,0 +1,458 @@ + + + + + +¾ÆÆÄÄ¡ ÅõÅ丮¾ó: Server Side Includes ¼Ò°³ - Apache HTTP Server Version 2.4 + + + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡ ÅõÅ丮¾ó: Server Side Includes ¼Ò°³

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + +

    Server-side includes¸¦ »ç¿ëÇÏ¿© HTML ¹®¼­¿¡ µ¿ÀûÀÎ ³»¿ëÀ» +Ãß°¡ÇÒ ¼ö ÀÖ´Ù.

    +
    + +
    top
    +
    +

    ¼Ò°³

    + + +

    ÀÌ ±ÛÀº º¸Åë SSI¶ó°í ºÎ¸£´Â Server Side Includes¸¦ ¼³¸íÇÑ´Ù. + SSI°¡ °¡´ÉÇϵµ·Ï ¼­¹ö¸¦ ¼³Á¤ÇÏ´Â ¹æ¹ý°ú HTML ÆäÀÌÁö¿¡ µ¿ÀûÀÎ + ³»¿ëÀ» Ãß°¡ÇÏ´Â ±âº»ÀûÀÎ SSI »ç¿ë¹ýÀ» ¼Ò°³ÇÑ´Ù.

    + +

    ÀÌ ±ÛÀÇ µÞºÎºÐÀº SSI Áö½Ã¾î Á¶°Ç¹®°ú °°Àº °í±Þ±â¹ýÀ» + ¼³¸íÇÑ´Ù.

    + +
    top
    +
    +

    SSI°¡ ¹«¾ùÀΰ¡?

    + +

    SSI (Server Side Includes)´Â HTML ÆäÀÌÁö¿¡ »ç¿ëÇÏ´Â Áö½Ã¾î·Î, + ÆäÀÌÁö¸¦ ¼­ºñ½ºÇÒ¶§ ¼­¹ö°¡ ó¸®ÇÑ´Ù. SSI¸¦ »ç¿ëÇϸé CGI + ÇÁ·Î±×·¥À̳ª ´Ù¸¥ µ¿ÀûÀÎ ±â¼ú·Î ÆäÀÌÁö Àüü¸¦ ¸¸µé¾î¼­ + ¼­ºñ½ºÇÏÁö ¾Ê°íµµ HTML ÆäÀÌÁö¿¡ µ¿ÀûÀ¸·Î »ý¼ºÇÑ ³»¿ëÀ» Ãß°¡ÇÒ + ¼ö ÀÖ´Ù.

    + +

    SSI¸¦ »ç¿ëÇÒÁö ¾Æ´Ï¸é ÇÁ·Î±×·¥À¸·Î ÆäÀÌÁö Àüü¸¦ »ý¼ºÇÒÁö + °áÁ¤Àº ÆäÀÌÁö¿¡¼­ Á¤ÀûÀÎ ºÎºÐÀÌ ¸¹ÀºÁö¿Í ÆäÀÌÁö¸¦ ¼­ºñ½ºÇÒ + ¶§¸¶´Ù ¾î´ÀÁ¤µµ¸¦ ´Ù½Ã °è»êÇØ¾ßÇÒÁö¿¡ ´Þ·È´Ù. SSI´Â ÇöÀç + ½Ã°£°ú °°ÀÌ ÀûÀº Á¤º¸¸¦ Ãß°¡Çϴµ¥ ÁÁ´Ù. ±×·¯³ª ÆäÀÌÁö¸¦ + ¼­ºñ½ºÇÒ¶§ ÆäÀÌÁöÀÇ ´ëºÎºÐÀ» »ý¼ºÇØ¾ß ÇÑ´Ù¸é ´Ù¸¥ ¹æ¹ýÀ» + ã¾ÆºÁ¾ß ÇÑ´Ù.

    +
    top
    +
    +

    SSI°¡ °¡´ÉÇϵµ·Ï ¼­¹ö ¼³Á¤Çϱâ

    + + +

    ¼­¹ö°¡ SSI¸¦ ó¸®ÇÏ·Á¸é httpd.conf ÆÄÀÏÀ̳ª + .htaccess ÆÄÀÏ¿¡¼­ ´ÙÀ½ Áö½Ã¾î¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

    +

    + Options +Includes +

    + +

    ±×·¯¸é ¾ÆÆÄÄ¡´Â ÆÄÀÏ¿¡¼­ SSI Áö½Ã¾î¸¦ ó¸®ÇÑ´Ù. ¼³Á¤¿¡´Â + º¸Åë ¿©·¯ Options Áö½Ã¾î°¡ + ÀÖ°í, ÀÌ Áö½Ã¾îµéÀº ¼­·Î µ¤¾î½á¼­ ¹«È¿·Î ¸¸µé´Ù. ±×·¡¼­ + Áö½Ã¾î¸¦ ¸Ç¸¶Áö¸·¿¡ ó¸®ÇϱâÀ§ÇØ º¸Åë SSI¸¦ ¿øÇϴ ƯÁ¤ + µð·ºÅ丮¿¡¼­ Options¸¦ »ç¿ëÇÑ´Ù.

    + +

    ¸ðµç ÆÄÀÏ¿¡¼­ SSI Áö½Ã¾î¸¦ ó¸®ÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. ¾ÆÆÄÄ¡¿¡°Ô + ¾î¶² ÆÄÀÏÀ» ó¸®ÇÒÁö ¾Ë·ÁÁà¾ß ÇÑ´Ù. µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. + Çϳª´Â ´ÙÀ½°ú °°Àº Áö½Ã¾î·Î .shtml°ú °°Àº ƯÁ¤ + ÆÄÀÏ È®ÀåÀÚ¸¦ °¡Áø ÆÄÀÏÀ» ó¸®ÇÏ´Â ¹æ¹ýÀÌ´Ù.

    +

    + AddType text/html .shtml
    + AddOutputFilter INCLUDES .shtml +

    + +

    ÀÌ ¹æ¹ýÀÇ ´ÜÁ¡Àº ÀÌ¹Ì ÀÖ´Â ÆäÀÌÁö¿¡ SSI Áö½Ã¾î¸¦ Ãß°¡ÇÏ´Â + °æ¿ì SSI Áö½Ã¾î¸¦ ó¸®ÇϱâÀ§ÇØ .shtml È®ÀåÀÚ¸¦ + ºÎ¿©Çϱ⶧¹®¿¡ ÆÄÀϸí°ú ÀÌ ÆäÀÌÁöÀÇ ¸ðµç ¸µÅ©¸¦ º¯°æÇØ¾ß + ÇÏ´Â Á¡ÀÌ´Ù.

    + +

    ´Ù¸¥ ¹æ¹ýÀº XBitHack + Áö½Ã¾î¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù.

    +

    + XBitHack on +

    + +

    XBitHack´Â + ½ÇÇà±ÇÇÑÀÌ ÀÖ´Â ÆÄÀÏ¿¡¼­ SSI Áö½Ã¾î¸¦ ó¸®ÇÑ´Ù. ±×·¡¼­ ÀÌ¹Ì + ÀÖ´Â ÆäÀÌÁö¿¡ SSI Áö½Ã¾î¸¦ Ãß°¡ÇÑ´Ù¸é ÆÄÀϸíÀ» º¯°æÇÏÁö + ¾Ê°í chmod·Î ÆÄÀÏ¿¡ ½ÇÇà±ÇÇÑÀ» ÁÖ¸é µÈ´Ù.

    +

    + chmod +x pagename.html +

    + +

    ÇÏÁö ¸»¾Æ¾ß ÇÒ °Í Çϳª. °¡²û .shtml ÆÄÀÏ¸í¿¡ + °ñÄ¡¸¦ ¾ÎÁö¸»°í ¸ðµç .html ÆÄÀÏÀ» SSI ó¸®Ç϶ó°í + Ãæ°íÇÏ´Â »ç¶÷ÀÌ ÀÖ´Ù. ÀÌ »ç¶÷µéÀº ¾Æ¸¶µµ XBitHack¿¡ ´ëÇØ ¸ð¸£´Â + °Í °°´Ù. ¸í½ÉÇÒ Á¡Àº ÀÌ·¸°Ô ÇÏ¸é ¾ÆÆÄÄ¡´Â ÆÄÀÏ¿¡ SSI Áö½Ã¾î°¡ + ¾ø´õ¶óµµ Ŭ¶óÀÌ¾ðÆ®·Î º¸³»´Â ¸ðµç ÆÄÀÏÀ» »ìÆìºÁ¾ß ÇÑ´Ù´Â + °ÍÀÌ´Ù. ¼º´ÉÀÌ ¸Å¿ì ´À·ÁÁú ¼ö ÀÖÀ¸¸ç, ÁÁÀº »ý°¢ÀÌ ¾Æ´Ï´Ù.

    + +

    ¹°·Ð À©µµ¿ìÁî¿¡¼­´Â ½ÇÇà±ÇÇÑÀ̶õ °ÍÀÌ ¾ø±â¶§¹®¿¡ ÈÄÀÚ¸¦ + »ç¿ëÇÒ ¼ö ¾ø´Ù.

    + +

    ³»¿ëÀÌ µ¿ÀûÀÌ¿©¼­ °è»êÇÏ±â ¾î·Æ±â¶§¹®¿¡ ¾ÆÆÄÄ¡ ±âº» ¼³Á¤Àº + SSI ÆäÀÌÁöÀÇ ÃÖ±Ù¼öÁ¤Àϰú content length HTTP Çì´õ¸¦ º¸³»Áö + ¾Ê´Â´Ù. ±×·¡¼­ ¹®¼­¸¦ ij½¬ÇÏÁö ¸øÇϰí Ŭ¶óÀÌ¾ðÆ®°¡ ´À³¢´Â + ¼º´ÉÀÌ ¶³¾îÁø´Ù. µÎ°¡Áö ÇØ°á¹æ¹ýÀÌ ÀÖ´Ù.

    + +
      +
    1. XBitHack Full ¼³Á¤Àº »ç¿ëÇÑ´Ù. ±×·¯¸é + ¾ÆÆÄÄ¡´Â Æ÷ÇÔÇÏ´Â(include) ÆÄÀϵéÀÇ ¼öÁ¤ÀÏÀº ¹«½ÃÇÑü + ¿ø·¡ ¿äûÇÑ ÆÄÀÏÀÇ ³¯Â¥¸¸ º¸°í ÃÖ±Ù¼öÁ¤ÀÏÀ» ¾Ë¾Æ³½´Ù.
    2. + +
    3. mod_expires¿¡ ÀÖ´Â Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© + ÆÄÀÏ¿¡ Á÷Á¢ ¸¸±âÀÏÀ» ¼³Á¤ÇÏ¸é ºê¶ó¿ìÀú¿Í ÇÁ·Ï½Ã°¡ ¹®¼­¸¦ + ij½¬ÇÒ ¼ö ÀÖ´Ù.
    4. +
    +
    top
    +
    +

    ±âº» SSI Áö½Ã¾î

    + +

    SSI Áö½Ã¾îÀÇ »ç¿ë¹ýÀº ´ÙÀ½°ú °°´Ù.

    +

    + <!--#element attribute=value attribute=value ... --> +

    + +

    HTML ÁÖ¼®°°ÀÌ »ý°å±â¶§¹®¿¡ SSI ±â´ÉÀ» °¡µ¿ÇÏÁö ¾Ê¾Æµµ + HTML ¼Ò½º¿¡´Â ³ª¿ÀÁö¸¸ ºê¶ó¿ìÀú´Â ¹«½ÃÇÑ´Ù. SSI¸¦ ¿Ã¹Ù·Î + ¼³Á¤Çϸé Áö½Ã¾î¸¦ °á°ú°ªÀ¸·Î ¹Ù²Û´Ù.

    + +

    element´Â ´ÙÀ½Áß Çϳª´Ù. ´ÙÀ½ ȸ¿¡ ´õ ÀÚ¼¼È÷ ¼³¸íÇÒ °ÍÀÌ´Ù. + Áö±ÝÀº SSI·Î ÇÒ ¼ö ÀÖ´Â ¸î°¡Áö ¿¹¸¦ º¸ÀδÙ

    + +

    ¿À´Ã ³¯Â¥

    + +

    + <!--#echo var="DATE_LOCAL" --> +

    + +

    echo element´Â º¯¼ö°ªÀ» ±×´ë·Î Ãâ·ÂÇÑ´Ù. + CGI ÇÁ·Î±×·¥¿¡ Á¦°øÇϴ ȯ°æº¯¼öµé ¿Ü¿¡µµ ¿©·¯ Ç¥ÁØ º¯¼ö°¡ + ÀÖ´Ù. ¶Ç, set element¸¦ »ç¿ëÇÏ¿© Á÷Á¢ º¯¼ö¸¦ + Á¤ÀÇÇÒ ¼öµµ ÀÖ´Ù.

    + +

    ³¯Â¥ Ãâ·Â Çü½ÄÀÌ ¸¶À½¿¡ µéÁö ¾Ê´Â´Ù¸é, ´ÙÀ½°ú °°ÀÌ + config elementÀÇ timefmt attribute¸¦ + »ç¿ëÇÑ´Ù.

    + +

    + <!--#config timefmt="%A %B %d, %Y" -->
    + Today is <!--#echo var="DATE_LOCAL" --> +

    + + +

    ÆÄÀÏÀÇ ¼öÁ¤ÀÏ

    + +

    + ÀÌ ¹®¼­´Â <!--#flastmod file="index.html" -->¿¡ ¸¶Áö¸·À¸·Î ¼öÁ¤µÇ¾ú´Ù +

    + +

    ÀÌ elementµµ timefmt Çü½Ä ¼³Á¤¿¡ ´Þ·È´Ù.

    + + +

    CGI ÇÁ·Î±×·¥ °á°ú¸¦ Æ÷ÇÔÇϱâ

    + +

    ÀϹÝÀûÀÎ SSI »ç¿ë¹ýÁß Çϳª·Î, ¸¹ÀÌµé ¾Ö¿ëÇÏ´Â ``¹æ¹®¼ö + Ä«¿îÅÍ'' °°Àº CGI ÇÁ·Î±×·¥ °á°ú¸¦ Ãâ·ÂÇÑ´Ù.

    + +

    + <!--#include virtual="/cgi-bin/counter.pl" --> +

    + + +
    top
    +
    +

    Ãß°¡ ¿¹Á¦

    + + +

    ´ÙÀ½Àº HTML ¹®¼­¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ¸î°¡Áö SSI ¿¹Á¦´Ù.

    + +

    ÀÌ ¹®¼­°¡ ¾ðÁ¦ ¸¶Áö¸·À¸·Î +¼öÁ¤µÇ¾ú³ª?

    + +

    ¾Õ¿¡¼­ SSI¸¦ »ç¿ëÇÏ¿© »ç¿ëÀÚ¿¡°Ô ¹®¼­ÀÇ ÃÖ±Ù¼öÁ¤ÀÏÀ» + ¾Ë¸± ¼ö ÀÖ´Ù°í ¸»Çß´Ù. ±×·¯³ª ½ÇÁ¦ ¹æ¹ýÀº ¾Ë·ÁÁÖÁö ¾Ê¾Ò´Ù. + ´ÙÀ½ Äڵ带 HTML ¹®¼­¿¡ »ç¿ëÇÏ¸é ÆäÀÌÁö¿¡ ½Ã°£ ±â·ÏÀ» ³²±ä´Ù. + ¹°·Ð À§¿¡¼­ ¼³¸íÇÑ´ë·Î SSI°¡ ¿Ã¹Ù·Î ÀÛµ¿ÇØ¾ß ÇÑ´Ù.

    +

    + <!--#config timefmt="%A %B %d, %Y" -->
    + ÀÌ ¹®¼­´Â <!--#flastmod file="ssi.shtml" -->¿¡ ¸¶Áö¸·À¸·Î ¼öÁ¤µÇ¾ú´Ù; +

    + +

    ¹°·Ð ssi.shtml´ë½Å ¿øÇÏ´Â ½ÇÁ¦ ÆÄÀϸíÀ» + »ç¿ëÇÑ´Ù. ¾Æ¹« ÆäÀÌÁö¿¡¶óµµ ºÙ¿©³ÖÀ» ¼ö ÀÖ´Â ¹ü¿ëÄڵ带 + ¿øÇÑ´Ù¸é, ÆÄÀÏ¸í ´ë½Å LAST_MODIFIED º¯¼ö¸¦ + »ç¿ëÇÑ´Ù.

    +

    + <!--#config timefmt="%D" -->
    + This file last modified <!--#echo var="LAST_MODIFIED" --> +

    + +

    timefmt Çü½Ä¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â °Ë»ö¿£Áø¿¡¼­ + strftimeÀ» ã¾ÆºÁ¶ó. ¹®¹ýÀº °°´Ù.

    + + +

    Ç¥ÁØ ÆäÀÌÁö ÇÏ´ÜÀ» Æ÷ÇÔÇϱâ

    + + +

    ¿©·¯ ÆäÀÌÁö°¡ ÀÖ´Â »çÀÌÆ®¸¦ °ü¸®ÇÑ´Ù¸é ÆäÀÌÁö Àüü¸¦ + ¼öÁ¤ÇÏ´Â °ÍÀº, ƯÈ÷ ÆäÀÌÁöµéÀÌ Ç¥ÁØ ¿Ü°üÀ» °¡Áöµµ·Ï ¼öÁ¤ÇÏ´Â + °ÍÀº Á¤¸»·Î ±«·Ó´Ù.

    + +

    ÆäÀÌÁö »ó´Ü(header)°ú ÇÏ´Ü(footer)À» ÆÄÀÏ·Î Æ÷ÇÔÇÏ¿© + ÀÌ·± ¼öÁ¤ÀÇ ºÎ´ãÀ» ´ú ¼ö ÀÖ´Ù. ¸ðµç ÆäÀÌÁö¿¡¼­ + include SSI ¸í·É¾î¸¦ »ç¿ëÇÏ¿© ÆäÀÌÁö ÇÏ´Ü ÆÄÀÏ + Çϳª¸¦ Æ÷ÇÔÇÏ¸é µÈ´Ù. include elementÀÇ + file attribute³ª virtual attribute·Î + Æ÷ÇÔÇÒ ÆÄÀÏÀ» ÁöÁ¤ÇÑ´Ù. file attribute´Â ÇöÀç + µð·ºÅ丮¿¡ »ó´ëÀûÀÎ ÆÄÀϰæ·Î´Ù. Áï, (/·Î ½ÃÀÛÇÏ´Â) + Àý´ëÆÄÀϰæ·Î³ª °æ·Î ¾È¿¡ ../¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. ¾Æ¸¶µµ ¼­ºñ½ºÇÏ´Â + ¹®¼­ÀÇ »ó´ë URLÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Â virtual attribute°¡ + ´õ À¯¿ëÇÒ °ÍÀÌ´Ù. °æ·Î¸¦ /·Î ½ÃÀÛÇÒ ¼ö ÀÖÁö¸¸, Æ÷ÇÔÇÏ·Á´Â + ÆÄÀÏÀÌ ¼­ºñ½ºÇÏ´Â ÆÄÀϰú °°Àº ¼­¹ö¿¡ ÀÖ¾î¾ß ÇÑ´Ù.

    +

    + <!--#include virtual="/footer.html" --> +

    + +

    ³ª´Â º¸Åë ÀÌ µÎ°¡Áö¸¦ ÇÕÃļ­ Æ÷ÇÔÇÒ ÆäÀÌÁö ÇÏ´Ü ÆÄÀÏ¿¡ + LAST_MODIFIED Áö½Ã¾î¸¦ ³Ö´Â´Ù. Æ÷ÇÔÇÏ·Á´Â ÆÄÀÏ¿¡µµ + SSI Áö½Ã¾î°¡ ³ª¿Ã ¼ö ÀÖÀ¸¸ç, ÀÌ·¸°Ô Æ÷ÇÔÇÑ ÆÄÀÏÀÌ ´Ù¸¥ ÆÄÀÏÀ» + Æ÷ÇÔÇÏ´Â ½ÄÀ¸·Î ¿©·¯¹ø °è¼Ó Æ÷ÇÔÇÒ ¼öµµ ÀÖ´Ù.

    + + +
    top
    +
    +

    À̿ܿ¡ ¼³Á¤ÇÒ ¼ö ÀÖ´Â °ÍÀº?

    + + +

    ½Ã°£ Çü½Ä config(¼³Á¤) ¿Ü¿¡ µÎ°¡Áö¸¦ ´õ + config(¼³Á¤)ÇÒ ¼ö ÀÖ´Ù.

    + +

    º¸Åë SSI Áö½Ã¾î°¡ À߸øµÇ¸é ´ÙÀ½°ú °°Àº ¹®±¸°¡ ³ª¿Â´Ù

    +

    + [an error occurred while processing this directive] +

    + +

    ÀÌ ¹®±¸¸¦ º¯°æÇÏ°í ½Í´Ù¸é config elementÀÇ + errmsg attribute¸¦ »ç¿ëÇÏ¿© º¯°æÇÑ´Ù.

    +

    + <!--#config errmsg="[It appears that you don't know how to use SSI]" --> +

    + +

    »çÀÌÆ®¸¦ ¼­ºñ½ºÇϱâ Àü¿¡ ¸ðµç SSI Áö½Ã¾î ¹®Á¦¸¦ ÇØ°áÇÏ¿© + »ç¿ëÀÚ°¡ ÀÌ·± ¹®±¸¸¦ º¸Áö ¾Ê±æ ¹Ù¶õ´Ù. (±×·¸Áö?)

    + +

    ±×¸®°í sizefmt attribute°¡ ¹ÝȯÇÏ´Â ÆÄÀÏÅ©±â + Çü½ÄÀ» config(¼³Á¤)ÇÒ ¼ö ÀÖ´Ù. ¹ÙÀÌÆ®·Î Å©±â¸¦ + º¸¿©ÁÖ·Á¸é bytes, ÀûÀýÈ÷ Kb³ª Mb·Î Å©±â¸¦ + º¸¿©ÁÖ·Á¸é abbrev¸¦ »ç¿ëÇÑ´Ù.

    +
    top
    +
    +

    ¸í·É¾î ½ÇÇàÇϱâ

    + + +

    ³ª´Â ´ÙÀ½ ´Þ¿¡ ÀÛÀº CGI ÇÁ·Î±×·¥°ú SSI¸¦ °°ÀÌ »ç¿ëÇÏ´Â + ±ÛÀ» ¾µ ¿¹Á¤ÀÌ´Ù. Áö±ÝÀº exec element·Î ÇÒ + ¼ö ÀÖ´Â ´Ù¸¥ °ÍµéÀ» ¼³¸íÇÒ °ÍÀÌ´Ù. SSI´Â ½ÇÁ¦ ½©À» (Á¤È®È÷´Â + /bin/sh³ª Win32¸¦ »ç¿ëÇÑ´Ù¸é DOS ½©) »ç¿ëÇÏ¿© + ¸í·É¾î¸¦ ½ÇÇàÇÑ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½Àº µð·ºÅ丮 ¸ñ·ÏÀ» º¸¿©ÁØ´Ù.

    +

    + <pre>
    + <!--#exec cmd="ls" -->
    + </pre> +

    + +

    or, on Windows

    +

    + <pre>
    + <!--#exec cmd="dir" -->
    + </pre> +

    + +

    dir Ãâ·Â¿¡ ºê¶ó¿ìÀú°¡ È¥µ¿ÇÒ + ``<dir>'' ¹®ÀÚ¿­ÀÌ Æ÷ÇÔµÇÀֱ⶧¹®¿¡, + À©µµ¿ìÁî¿¡¼­ ÀÌ Áö½Ã¾î¸¦ »ç¿ëÇÏ¸é °á°ú°¡ Á¶±Ý ÀÌ»óÇÒ °ÍÀÌ´Ù.

    + +

    ÀÌ ±â´ÉÀº exec ű׿¡ »ç¿ëÇÑ ¾î¶² ¸í·É¾î¶óµµ + ½ÇÇàÇÒ ¼ö Àֱ⶧¹®¿¡ ¸Å¿ì À§ÇèÇÏ´Ù. ``¹æ¸í·Ï''°ú °°ÀÌ »ç¿ëÀÚ°¡ + À¥ÆäÀÌÁö ³»¿ëÀ» ¼öÁ¤ÇÒ ¼ö Àִ ȯ°æÀ̶ó¸é, ÀÌ ±â´ÉÀ» Àý´ë·Î + »ç¿ëÇØ¼± ¾ÈµÈ´Ù. Options Áö½Ã¾î¿¡ + IncludesNOEXEC ¾Æ±Ô¸ÕÆ®¸¦ »ç¿ëÇÏ¿© SSI¸¦ Çã¿ëÇÏÁö¸¸ + exec ±â´ÉÀ» ¸·À» ¼ö ÀÖ´Ù.

    +
    top
    +
    +

    °í±Þ SSI ±â¹ý

    + + +

    ³»¿ëÀ» Ãâ·ÂÇÏ´Â ±â´É ¿Ü¿¡ ¾ÆÆÄÄ¡ SSI´Â º¯¼ö ¼³Á¤ÀÌ °¡´ÉÇϰí, + ºñ±³¹®°ú Á¶°Ç¹®¿¡ ÀÌ º¯¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    °æ°í

    + +

    ÀÌ ±Û¿¡¼­ ¼³¸íÇÏ´Â ´ëºÎºÐÀÇ ±â´ÉÀº ¾ÆÆÄÄ¡ 1.2 ÀÌÈĺÎÅÍ + »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹°·Ð, ¾ÆÆÄÄ¡ 1.2 ÀÌ»óÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é + ¾Æ¸¶µµ »¡¸® ¾÷±×·¹À̵åÇØ¾ß ÇÑ´Ù. ÇØ¶ó. Áö±Ý ÇØ¶ó. ±â´Ù¸± + °ÍÀÌ´Ù.

    + + +

    º¯¼ö ¼³Á¤

    + +

    set Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ³ªÁß¿¡ »ç¿ëÇÒ º¯¼ö¸¦ + ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ¾ÕÀ¸·Î º¯¼ö°¡ ÇÊ¿äÇϱ⶧¹®¿¡ ¸ÕÀú ¼³¸íÇÑ´Ù. + ¹®¹ýÀº ´ÙÀ½°ú °°´Ù.

    +

    + <!--#set var="name" value="Rich" --> +

    + +

    ´ÙÀ½°ú °°ÀÌ °ªÀ» ¹®ÀÚ±×´ë·Î ¼³Á¤ÇÏÁö ¾Ê°í ȯ°æº¯¼ö³ª À§¿¡¼­ ¼³¸íÇÑ º¯¼ö(¿¹¸¦ + µé¾î, LAST_MODIFIED)¿Í °°ÀÌ ´Ù¸¥ º¯¼ö¸¦ »ç¿ëÇÏ¿© + º¯¼ö°ªÀ» ¼³Á¤ÇÒ ¼öµµ ÀÖ´Ù. À̶§ º¯¼ö¸í ¾Õ¿¡ ´Þ·¯ Ç¥½Ã($)¸¦ + ºÙ¿©¼­ ¹®ÀÚ¿­ÀÌ ¾Æ´Ñ º¯¼öÀÓÀ» Ç¥½ÃÇÑ´Ù.

    + +

    <!--#set var="modified" value="$LAST_MODIFIED" --> +

    + +

    º¯¼ö°ª¿¡ ´Þ·¯ ¹®ÀÚ¸¦ ±×´ë·Î ÀÔ·ÂÇÏ·Á¸é ´Þ·¯ Ç¥½Ã ¾Õ¿¡ + ¹é½½·¡½¬¸¦ »ç¿ëÇÑ´Ù.

    +

    + <!--#set var="cost" value="\$100" --> +

    + +

    ¸¶Áö¸·À¸·Î ±ä ¹®ÀÚ¿­ Áß°£¿¡ º¯¼ö¸¦ »ç¿ëÇϴµ¥ µÚ¿¡ ÀÖ´Â + ¹®ÀÚµµ º¯¼ö¸íÀ¸·Î ¿ÀÀÎÇÏ¿© È¥µ¿µÇ´Â °æ¿ì, º¯¼ö¸íÀ» ´ë°ýÈ£·Î + ¹­¾î¼­ È®½ÇÈ÷ ÇÑ´Ù. (ÁÁÀº ¿¹¸¦ ã±â ÈûµéÁö¸¸, ¹«½¼ ¸»ÀÎÁö + ÀÌÇØÇÏ±æ ¹Ù¶õ´Ù.)

    +

    + <!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" --> +

    + + +

    Á¶°Ç Ç¥Çö½Ä

    + + +

    º¯¼ö¸¦ ¼³Á¤ÇÏ°í ºñ±³ÇÒ ¼ö ÀÖÀ¸´Ï Á¶°Ç¹®ÀÌ °¡´ÉÇÏ´Ù. ÀÌÁ¦ + SSI°¡ ÀÏÁ¾ÀÇ °£´ÜÇÑ ÇÁ·Î±×·¡¹Ö¾ð¾î°¡ µÈ´Ù. + mod_include´Â Á¶°Ç¹®À» ¸¸µå´Â if, + elif, else, endif + ±¸Á¶¸¦ Á¦°øÇÑ´Ù. ½ÇÁ¦ ÇÑ ÆäÀÌÁö·Î ¿©·¯ ³í¸®ÀûÀÎ ÆäÀÌÁö¸¦ + ¸¸µé ¼ö ÀÖ´Ù.

    + +

    Á¶°Ç¹® ±¸Á¶´Â ´ÙÀ½°ú °°´Ù.

    +

    + <!--#if expr="test_condition" -->
    + <!--#elif expr="test_condition" -->
    + <!--#else -->
    + <!--#endif --> +

    + +

    test_condition¿¡´Â ¾î¶² ³í¸®ºñ±³¶óµµ »ç¿ëÇÒ + ¼ö ÀÖ´Ù. °ªÀ» ´Ù¸¥ °ª°ú ºñ±³Çϰųª, ƯÁ¤ °ªÀÌ ``Âü''ÀÎÁö + °Ë»çÇÑ´Ù. (¹®ÀÚ¿­ÀÌ ºñ¾îÀÖÁö ¾ÊÀ¸¸é ÂüÀÌ´Ù.) »ç¿ë°¡´ÉÇÑ + ºñ±³ ¿¬»êÀÚ¸¦ ¸ðµÎ º¸·Á¸é, mod_include + ¹®¼­¸¦ Âü°íÇ϶ó. ´ÙÀ½Àº Á¶°Ç¹®À» »ç¿ëÇÑ ¸î°¡Áö ¿¹Á¦´Ù.

    + +

    ¼³Á¤ÆÄÀÏ¿¡ ´ÙÀ½ ÁÙÀ» Ãß°¡ÇÑ´Ù.

    +

    + BrowserMatchNoCase macintosh Mac
    + BrowserMatchNoCase MSIE InternetExplorer +

    + +

    Ŭ¶óÀÌ¾ðÆ®°¡ ¸ÆÅ²Åä½Ã¿¡¼­ ½ÇÇàÇÏ´Â Internet Explorer¶ó¸é + ȯ°æº¯¼ö ``Mac''°ú ``InternetExplorer'' ¸ðµÎ ÂüÀ¸·Î ¼³Á¤ÇÑ´Ù.

    + +

    ±×¸®°í SSI ¹®¼­¿¡ ´ÙÀ½°ú °°ÀÌ Àû´Â´Ù.

    +

    + <!--#if expr="${Mac} && ${InternetExplorer}" -->
    + ¿©±â¿¡ »ç°ú¹®°¡ ³ª¿Â´Ù
    + <!--#else -->
    + ¿©±â¿¡ ¸ÚÁø JavaScript Äڵ尡 ³ª¿Â´Ù
    + <!--#endif --> +

    + +

    ³»°¡ ¸ÅŲÅä½Ã IE¿¡ ¹Ý°¨ÀÌ ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. ³ª´Â ´ÜÁö + Àú¹øÁÖ¿¡ ´Ù¸¥ °÷¿¡¼­´Â ¹®Á¦°¡ ¾ø´Â JavaScript Äڵ尡 ¸ÅŲÅä½Ã + IE¿¡¼­´Â µ¿ÀÛÇÏÁö ¾Ê¾Æ¼­ ¸î½Ã°£À» °í»ýÇß´Ù. À§´Â Àӽà + ÇØ°áÃ¥ÀÌ´Ù.

    + +

    (Á÷Á¢ Á¤ÀÇÇÏ¿´°Ç ÀÏ¹Ý È¯°æº¯¼öÀ̰Ç) ¾î¶² º¯¼ö¶óµµ Á¶°Ç¹®¿¡ + »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¾Æ¶óÄ¡´Â SetEnvIf³ª ´Ù¸¥ °ü·Ã + Áö½Ã¾î·Î ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÒ ¼ö Àֱ⶧¹®¿¡ CGI ¾øÀ̵µ ¸ÚÁö°Ô + µ¿ÀûÀÎ ³»¿ëÀ» ¸¸µé ¼ö ÀÖ´Ù.

    + +
    top
    +
    +

    °á·Ð

    + +

    SSI´Â È®½ÇÈ÷ CGI³ª µ¿ÀûÀÎ À¥ÆäÀÌÁö¸¦ »ý¼ºÇÏ´Â ´Ù¸¥ ±â¼úÀ» + ´ëüÇÒ ¼ö ¾ø´Ù. ±×·¯³ª ¸¹Àº Ãß°¡ ÀÛ¾÷¾øÀÌ ÆäÀÌÁö¿¡ µ¿ÀûÀÎ + ³»¿ëÀ» Á¶±Ý Ãß°¡Çϱ⿡´Â ÈǸ¢ÇÑ ¹æ¹ýÀÌ´Ù.

    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko 

    +
    top

    Comments

    Notice:
    This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
    +
    + \ No newline at end of file diff --git a/docs/manual/images/apache_header.gif b/docs/manual/images/apache_header.gif new file mode 100644 index 0000000000000000000000000000000000000000..260e421bf4ad3f012db1746809cf4d2fdd5d8cc6 GIT binary patch literal 4084 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 B(}n;5 literal 0 HcmV?d00001 diff --git a/docs/manual/images/bal-man-b.png b/docs/manual/images/bal-man-b.png new file mode 100644 index 0000000000000000000000000000000000000000..941a94888351b6acfa217af836e7e74a329359cf GIT binary patch literal 321860 zcmZ^L2Rz%|_rF%rmeSU))mFu=9dx zP&+|v|2*H{{6F94m-EU?a&zvz=iYPgx#ynu`3TogSG;xe-c1q`l3PkI;S#tWNwU{m>c)bCLi8Jv=-FJ%j}v zU95ml#KpydLLeXr^q9!;*wxDcX6pIa!Ikqr8u_nwH68t!T*2 zkl~U?BqYyBl;obj_Pny$K;dcB| zsbqLL2?-k`cKXDv8q>tF10V7a4-e}=Akal?485P9A39loJmtB;%NElAn^I7u5jBr@ zDkpsc+58g_h)WCdK-Z$P9=>3Ed;11$lt_+B!7*E+Mdeb%`%@E#h|0%$9DJ81`#U1= z!mT*JwiVhYoC=pBPEh{h)M8{O;c-f9RUq@|gKd~N>7q2o- z=NXyX4i@u&`d8PI8t*nsu6!iO%J@r8@4EM>6If}wLKb)PYzKUTx3_j%rXS!NFauvE znGdx58>+Ii?~h<`+AK?c4|9M2K2ReyFmLgSy)jU+)WDoc(;@s()bsxTK?}145*-t! zJS$z*#*i!CDOc!HLl@3wWuCVLEPVWD>g^(>8aB*EHA_t=kJD!xLjnyv(AH*{^jGSYwW&UTbM}DdAG&zC^|68!=ASJX*T(jf|D}eYR~s_d{no_S#Xs6C zg;jNRENW_M+txNV&#kNqD2I6^-(#Kj$+8wcR<)6C)=4p?Vpmqa{QP;FQ!z%)+4)!C zleaqF+@-*EDzDvVf1~CV%$1A2sT!`b=Xz{x8NzF?KS*3Jl0B_x{PCsdix4uRXU|!E zeR?0tA4T=Pwzk%3wU7Drn>RHd>I)0I$;1!!-Mjny-JZv6=FKWQ3t=z|&ObdOlfCC@ zwsxn5Qh_5jlfClMLW_EFXrbjs z>@hcFbw)w(ydt4&IEj{1;_>YRO$xV6X&(j(8g`hd>SqxonJ`t~3d_wX{HmTQ7OLPoHSX^YL60C7&esaQOtQdIyy_s$OIGrEQnvNz9#m7ApqvZxBTyR zB4wPEmlQ@lCC)T4zC|=I_yAMtnREM}Lmy+>_v$2cBL$FyN)m z5{v?2td|xbYghFB*c)hO7xWrgNLz)X9pt;Z*?TDpY|^wuMnpa3zp z>dgb2C6nQS4Bj-h)??5$Ep?+qM}Sf3=8~J6TdJ@Xbx%*vOdiu-Bef#y1=-&=)?fS6 zAdw=Te2ul)^)~8RYM?9msNVWl1h|SH-$q%Wpd);CpBGrU)Ud1aUmdyEne2Euv@r2a_xoroN6qL%`aziAan z=#NsPY5Uhht*4jM!Je#9prr*(ruF!B+TvJ3@3JM%9=`_{f1bu(e3TfeQ$wSpD{d2_ zr_LqDH&9@y3%P4Z2dG|)M=MAGI1nEmU39hFFwe2$*h!(CX-naUuZJb5-8*!{Fy(QG zyIiAW5OA8%eyfy1AMMSdo$Wza30&i$}`^~|L(G+fk~KJ&Rm zf@1FD4w`&ouTmvw*T&VLhLW5aYm8&z2-bw=iv|VR@T3I@=?FC4!CLXKQg~#^Tf3 zFygA!g~bC|OF4{GHZRZKvU;@c($g9a~@WJ$m zWM7C;Abh2920ZoJ`;lx7lqHFNOgK@3^oAO{Q{>L%FY{RjZ}P{(va^kBd~I4`ZC(`s-Q_$}Wtat%pq-=<+r&!iQy{7GiYs0jt)?mFV5^ykc+xMKX^ zPLs7CM|;w@P;5+{zIABH7w{Ab<-Z+<)iY9`M0yrKNIDF%QN#ug#bILGC>h!UQ|TjhFO}3;;7{v^SxPWu4`lAi{w02KsBG=J)vJ=S zKYhYwWm|Pug0};Gx5cI@aV;8&U^Yy7d6Mx~lJ#b$ygKw;*($O{m&0br5a)lgIcqB32A@#hXKr9sO;lN=0OSH(y0XT3I$u zh22>3bqFvLe4y1*gDZA?ZcTB0<03EAIzQCq?dsE~@H0;W8+qf^wpyrc?dx!fLVSBT z?Y92iZ`P!O|K@8gxZs~{-jtx2VSPz7Fdj8&7;;SB&_YH2}OQ+E8|8}VrK1OACqJ_ zfL=(GG9B2>3}2%4+=sI~l2KL>R}H9(xIl}qM2MUZ4^4&T78DH)cOnWmWSy0G0cxMa zSkp_^w}-~vDLX-1^#^WdU7e4+@4bmZCut2%kJ)5?xva<6r}brBxC+);Q`mp%zv1~X z?`xy$){2*mRq19ybhMk5#{6iAGcET+U~hoyQZEW6Cu{iho}OKNdqDe)>V~konB|~= z?FTfcWS-c_+Fi&KOTUJN&i4njLwBL)Wrhy48E(Tp3N0N_-xpoM6A@6B6>h{`OQlet z*qbz5j^}z7Dq}hy zt~Wu^AK1OQ(P6$i;oyG+$B=csT)(MTD21m6aV4kPxHB0EvNYMj7`>KSPqw}BIqq0dvPQ} zyp++XRKL=$#SxBYVXcg9c(Rup+H}6b*4=lm zaink?q-Mv3?mE|BVffoYd|S$?#`C^ASth9ibq4cw*WXc1fhYo$IhD`(S$~op`Kp1} zQg)Wq@*5n*HdVcNHCAVeH)UU$s*pE!rvjv5hE9={K)2J&4DWHi(M%WFwK9=UZ>LS- zYFJ;c2tIU?1nRKYG)$x@N+sYdKnaUvR#_zmdyhuwgJ}lSzcE*y%+3vmt!4R?acFed>~w7QsvRvrH9eeJ3jm6#3f?xV-^aCix}EC?c}%e}e6Y%G z{KEq$G+YMQ<1gB^PlYx7Pr&2F^FgS-s{#h~Oti|BPS!gReN#up*|hh|v7bK#+#5yc)&N|J>I6*0>!yA~}myl}SIO{_LS@(T`^;TS|6Q_4Hfa zUGbK^PaG`R54UF`{?vLeGbA%#8dz9mq+9HrOD}A|vr)Em>M%Nn{5R4umBwdeplh+K ziClj5qMo}2SD{%_>u}|`2|ACEFu->$r`39QrQSClScC~7K|x0#lQT!gSHDld^V1_JVsnjRFl8|)R&#{yqtWnPy8i!R*^NUg|M}{ z=riujHKNA@qi*-I9voM0N-=L%59OYRmoU2xic=j|NpWi(YqUf0*9_zq?5KsHbe1{eq!)KV>}xcs!- zvOVf@ytv76(N=1L3cBOD$tcsY_fCJzUMj+B&X*GZPG=!Wu`$%~;vMCxx?qc=|B3%6 zV+dugi{4(F{}H4%vg^ycdG8;y9t`+*s_h9)M_1tZ6S(TVq+rJjAPaIRvkgf{$xAiAMFg{|k`uVp)mG#UDLp~Di?^~|^N8~ry! zlzN`mYL8N|Xz*K`ppwMwJtnfVT$rx$liWA_E+;`wMm3y(euVzEOhwk^v1h}{&0IJF z9Zgc^aE3?Z9@zNSFZ8UaAR~u+JOU71SjgZzNzP4QcJ$s&_~_ura5A=|)v8P8`4e<* zx9HIit_gEwyE2`-j(KlZm-89yF{s?d?nOSMWy05mET0{D%MQ;9#9XMKVvISa&v#}& z4!G!Qd~_9;PP24*+J#u^pO|lMu|M4n_Qxw$<4=OC$F+N6Cn^@ku!v_qx@08{+Y(W| z?>l#lycoE=CQMLjh_+ddIvQ6%N)B4Psa(z2%8F5Y=D;SZ?|nOJHdMn%BZjSxdV%tC z$x&0PwUK8oJvx74)~slGDQ?UtxL?MHwctI=rzEkv#^;#X>dU~19A7zr5xRmllHZ|o z%fp|^a%E%)Cc@F=z4~}_w(&|jO-2Xe42dvP>foU}oKl7>vbZ};2Nc(B>>WEA1P({t zlR6Na@9abie=-Eo`yXKaKP2^9eQ7A3ZRlb@csdY%R)Xhba?O-nffV;(Gl3gof$O`+ zuaHS>@m;g`1%#X5&96Ezt!uNd#Q7fj8@1JM^M+2q${zVmSK7CIerh`-$689j;aoh} zr15>is2Ji+&38YS!;RJ?vB;e(fo0(z7X;P4?DCDx>*`iFaOL(aH=4rF7*_B;_El%Dw=<(4OhHh4v@mSv5e}-D__!O(vRpL)Ql+ zdQp}PiEg?=qWB&fOyg-&5c87aqAS7w?)*uCv02aB3z$eoXQyKB@G`OkGEZipF+p$ zM)4RlrMAg?*{ALeN7-t3=uDSt#fCISJ|; z==5iXiakz+7nidd9-9kHA_5G34!`tQ4k94V*D1v86`dVuTp|>vuHF1(EJB^o8SO5} zbMFZ`Cul3z#frsgv)RFJ%I&te;cq5gy?}Q<_U5D2HmM-zD7S9AzSJrv?n-vKV!tCQ zFSMuaDZ{cA43jLmQ(27fu)e1oQ1&Fho@u7;?A@cxKl{7JqZ6dpOYh%X`F13iD@9-Y zIxmMyJ;9{TW5<2x3$%h}*BN_Lr;S-k81ckB1n>Vk`Q)M79=sX(#E7z9P_B2T0B>*9 z=qtX8%G@{tGw+V;JJujeY)c!)(fJ6ck>B)5xuPLb|L$s^Z+@(}3ZqUIKN^2FrTrNtQmti ztA(ah2^v*#e=OT9od__7E2VEO44L!iNY7?YR-SPEm~W)LTq(VjRMv|z+mboEx>XsU zX_~-$>rLohdV#k2crjs-Q%s<}^!s70M}vuR>;ghYJ} zT(~p(ZHWDbQQJ3#Y3U~=S1qMi-g-^*jk2Kw%`3kfeHx2c4dJWsfTcY?Yc|Mfn63P5 zI6Y|l5&zK6YsI4)yL}mMr7aV6gG}x1#7q#IW8;V4K1F-crT%Pbzfbp0z8cp72R$k) zv-5w?e(oPL)TiIJZ`%M$1^Yb}KZ?Cv6fT^)xXSM7$=x|u$)r|V(mACj>9i6Bs>f~8 zT4z?Xy7p{hu@Q<3JsXaqhHP)k=Kv%MblLgeS^|bdM}{unla^A5SIH0tLXBfS)%-Cz z0<*Vbj@E=*lDKnMEND+bRq?`12qDvejR^yJ?hMZ!4GzNAV2vqiA){z*<{^h7|2YN$ zvW%c?7k{ECeR{a%s=r~?|9Qn7Qw_JSWzN?6EByO+O39@dzB#y_sv>UP_`1wj9De*N z>t)YM1Vl8|{;d3~fJWX=#;J}9Q_vLM-LZ-3=)J=$HC|egdzl<(*Sg#r!Z|}@ zFy_WbO-}u-Hl7Oz{~!vuL2P+JjLF>ZqMuI6zbFsy7S)wFI|NHiH-64aL&xOAg9MD6 z>9uFjA>zXPLps0dXPJ*v8?0}9Mm2`bpP%S-um6y5EOx?vzOXyR`7#)ri3OHzTA|DE z5x*=h3`FXWsNm;Cp@Z5D^AI{QlwC%2-Ht)HvCRH`>i(i;lwYWjeQQ!`oi*8e>V{y% z1%kuez?9}Qs0%~OAO~W~H^`zqMqmS!+>U1la05|KDzJ`{5Xr=q<>$=}h3bH2~Xbmi6z()RGZz@7FDw{p&BDR)Hy~gKI zG1?ZZ3^n$fiZmQ@=?$0C?yzrUKg7F{e}u(nE6=AZlL)Y!%CFR39l1iadAHwm#pe9! z(~ZgkGbeP$Dtz@ju5W?QpLGw>cJm5$?DyEL**m`QGv`-8EB4-%2~Xbja+Q_VlQfv;fTnX?hOy3RzllLc=Cj+R3%3cr>AflHErTxc6YLiz*GQ_rKyYRdZWr-j~K zRL!}Q;YL1XaAUsSOPE36?ZTWTH*lqs>%i*IVx_0UH*8RInPo3IOvRYh|HHrEmkp?i zaEW((dEbW@T_uKfGko*$Tq-l~O%sD*aFVBq&t&U0(|*u)J@Rs{fC%WKZ>(P`eirb- ze&)|gJ7aUvx7ps<_?6wjW;olxund6H)K3Id8J$YwvmB;zcKek;_QOnY)$n^(hawL| zaVH@)oazVCF$gdL5VE86OSyw53?EOg&KhP`1~;@Vqc>(NTl?qDLib$spL)4$N)u4j zr@NmQSGri!nYu+!r|i-t{8OYRmMf~N9&k!d^rUTbx}Xn79M6uQPIb?FVwLTZ$zo<& z=h2ojmmOm;TeE`VxmAtQJvZiz=N3M$(nh|2G&jL>K`ztd@E?B!wyUw6Z^5=@_{7tW zEBtP$hM54F`J=izyWbO2Tr5h3u1l$#2!HBpcvno?BhDU3ws5O> zyTxmfZM0Z!9B%TbX&@zv81NL&o=Dli7xq2NDt)^vqCb!iX1@j=h@--j%VYdS=n1E|kgDwc86J zR)caH_LVL^^GtAqB=I9vyg2d?o6+Po*UjWmJ6Y-9Bp&D%&4%+cP`Hk-`_EB$<~9atulc~nS@urOeNolS{PrQ8f_U^8>y>WMn1%4T69NE^!Fb`)@=J2Xqd3tPt2&f8j zsN{UE=somv6L#xb+f2M4HL#{fejp>Plzxn+x?4 z9E)0xbU5N%Yx-NSV`xv`)3j&D5QD8deO-#ZKTehEgW?cMm6R#UCFW~bQ(e%tf__L} z%H!(&u&z+rt_AN5zu%Y5A4#{X`uO?z2htPoAP_1cbFw=AyEZSx|6%k8&#n)i4%7$S zS*0?nZta?XxB6#cIA6u^ClV20_Tj-)i^Q$^1G7MFIw_#U|_B^u^0h7>z6X zB-V39Z=)VT7Ud;VW3Ca7FS#~+t$q6ok{n*WDz&>^VC`3JlEW-OSkFCaC%SHD9jlrw z!w0_x6j^*_ezJE^b{a^?iv4DAZT*o z!JOv=AT(mfEFihX;J$8MQ{lYY!6{j4t{11-r zeb0pq3Xt71KL2J{AlG$a)S7 z%UeFm-rMCVhVd|#;=rD-6y;7pWsL~B>Qt>^EZSS-5DpMJ z<~&QBA1eiCzsAZ52sr?I0y=9<{v=v|2|vwQ0jDoje1b}KW-~rYQ5OUatvD1w+GGqM(XE5^^S~#7XfNH`$3l3nhk= z$S`4}4_q2+jJD4K6*B+dFim*aO*Zq5`!OY|{s!W7;yZ3rb`D$W$;*k>*?-z{s|y8& zPxjjtH=Lz{ltkCxFce!93f9vws){(f1V#38MY_C>8P0E&x0&BKu&`Gn_b;syLtPNw z>jTHPEzV_7iUIQ6^}fs%p}f?9ixwB0vO1sM`t9OB%Xj*)j1X!?3FA`Zn1tu4%P&i4 zXrUl+XHR6D!H`gFTStp;R^($9$V&HDaO(bTZi$vNU!i*I{I(P>CL7;s&sQsrM#%7< z+cPN~6e{_O;5~V_>pNIYy)k*(r02eL0KGjxo8tOg#$r#u)HSUYOhU$&;Rydi?_6&l zZd3^P*jWgv0^lZMn2Hj<>DO4)^_O7XfE8!ll1YwLR*V4xQX;_SY=2NgT%EF$Q)WfH>Vx$q_hCT-mri6PlkJ z>$|@DvawW*IypvtI4@UB9nRV}k*4gxXYe}Y53b+DTM3~G2UWwuQp69QJe#;0yWc~N z;C>@+2pLim!xOpt zX5dO7GOVqug?wabsRQ~pV+*+()HQTkrj^7cmKFs*>-du>ja+VDe*^`2BYh-s7L`=; zI(*E|)!?_UIc(xHg@>sDoYWi?EHQHy?j6Y3KzTPKJ85-ARy#0po=X~#%iOt89S=|q z5!>r(kt_8Tsv}Rh)5SrN&HGH$^`T80Zzpj>_fFoCNcIluEjSLJo61RDUewrHfS4Stq{aR>xZW(HZu_R@H z4MoD8P!83v%K-c@i+I5pg(Gmrd24Fq13V5#ZiL8V{o1mr%%yYI=SR$Up+gMFrpCj{ z*cCbJVF*`8t$y{Y#d`uy(^vfYGu#?kvYXSN zgH5G)5l^}$w?4ce9aBvO9$^A zgIjVyk5p=)+;1~jITR%J@+k?H2|8y1!UW43#7(Wh5?s!%7SDfVf(uV+fIL3tQgIr8 z1DL~F&O#xEuVdCQ3juMRDG%6JAeknRhFHR49z80wtL0IOxQ!BLEswg}q93}wqlGAm zGL$J{AMhS~$w;#jrY&Lwj!u zWG=LvRZUax^6X_6(Ju)bUuh(wNsM8-XNJ?A0IZSO0#|A*D6$2B>oX+FC0tNFzAbG*ZEqP|ZZ z)_f&Vx)Pu)>u9VUPP*&y!anvM2L=NO}rKR=~4i<=!^^EM){9_LrKK|lBkDH zMG}{|hx25y_#oWM#+3v5nEV_iaO)WMTI6^KfAt?t?^dD>B3dql&;HrlzQk0hk>=XwD%f#Cg(~#l8gaFXw9aqw_VqX zNZ@95#T|t(a<*Pvi6LAH3L!A}eCjw0Xc{pA8`+kkw0)9*)VSZnf@F0wU?L)xS#;DX&doC?)% zTroFv%;lkZ&$-8}2>+SzPAgMl*lFE! zp<%RX#AYBrd+|5QcHQM=ik3bw6o2ecIpnXvCz>D)KcB6wEF=(pV21}OS85$gH_!YA zEL}kyfD)_DA*|lrd^Ow1y2^r-#Kda*Kc74Dg^cgh0}`|R+x8b>qVxQPrKKMHd*)p+ zZsXyx#~ODJXgX;XX(?DD=3v$bWm>nBm^n47=?L`#(< ztDDihLuT1x<{<6Zo#I{w8E9x{0mlzjFI8MA6rrrcmjRSr;qj{wtX*7|jeANrwK#dV zOEyzk_MrSIB%bE0BTw1OjngPgIBkAq<@iBbYile1-Aw2s{Q-`XE+CE4%lBqey)+9> z!*xG?^lkA(N>Y5wHwaVf>S~-9Oce4BgBjaNhM3Lg4~r*icdfHV^ve!$>Gfb=ke`Zm z8EwupZdf7Nl_44K!|KO&JhdS&P92WScn%Gfr+V{?-xth#U`+PyK}Y$x)9J^Tuh8PJ z#Ty;ZK`VtNl?Cx?Q?RvH$d@4r1}n%lIAZae-NbF#Lq!|l^}%!6wz9@NvG=1qgkNHi z`*NIL`uti1PDS`4L#CH>S4o1)TW4_W|C4{%>?Ganm_DfpouvklAF-t1>N3!g?UxId;G#;RG}pm0ZjPh%G;x;XEdT(cFO9OlZU^}ts@nGXT{P` z#Q7`-s=&#<%2&XzRTi4ih2~^hIj*GY#x|5R<+xe}!J0|VNoF#!t^^6B`_`jv1F>g^ z9|A4{GFoWc2%YO^umD%S2Q;p@-A`ugCYiWnc1f#`ya>|oN(q3PHwTj;k!W0@)R$L# zNOt%gjh+6}{W7I8jLQ%Y!RDGdN)8>swU)z}<==`*qOE9}zdRS6LYvrzTI?RfneP^H zs)x$ZtMM7sj<+Mj0*`UzZKo9iGzv0IMmXPE3(Fxs!us{dae2aNR)M)kB0#SxRrI9n zb)d*)0lWma2zBr{y2?{X{`|fXB1`Dxp|_x1u0g%}&vRl(%7 zB#(;Qw$XzuA&AcP0>7LjDdZl$P@MydPb1S_S(M=(81vJccW5EgVlSAes;a4BCSDJ> zpYqSCgqh#v*a&jHnzm0(Dhk?B;Sxf4DH?A9VNV=|+ zl%R7FXMivgS{dfOCl>BlTUT4Fsilu~-(MjB<*Y39cIUb_j%T281idsr9${h1Otwsi z(9vpVa}6_sw(YNWOaML1)LNkGmWzsn%-UC4o_d#is^)0tEwQoL$aAd%b+;lWk^57( z$C0vL^+OY5V_$y#8Y%`{$KvJKUZi{8R?obbIK+;|OanaC)NTRPGu9;7OdDgWB~0OW z8*tzZ8ZGo^+x0VwufR57B$gm8V}(E7iYS-#R!8l1YSK`v{A*p#EKJeTIfF1JjrA?N zkjK5)A$?LX2vJ>K7vIww`ji1G=}C&Ed@5;H-Q*wDu6MargoY!zKdT7h@$q{? zBs;%7TI#6TUJU#)Un?gul+C4rQ~fTxi#}BC{fW5wyMXVO6jbhe#OCd2JBt!4zAeIZ zHi-MDI5-dJbz2>>$Tc#Mut*-r-F8}b?vglH#UH_G%-WYy;F2h)$C!z0+5NUQypj|J z`zyz#B>}m=zOD~AU`!^{Qcr!w8U=0@e`ki6YVfII@mEV1?QhZAdnxGQXC40x7sM%J zudOcK70cnV6GseKj%>xh&R(igJ9G8|rN8XW%xsjw9OVib$yV?u8Q|I%6IzbgZY-t> z7cM>-eZ-8394FI3-IpV%o@iMvj`Zhx=Ny2=bH2!+xvPr;&23{kM#Q->u|4l3k0iFj zX}QUbbY2;23bGrM`?cr<(|H_$hlFDTPlb}dh2ka!Aze&}K|p0>)7y?`u)fqM*vEP& z5;>N}a5~1~^mpY$o7Wh{#P2u>W=9TFYeT>4*jw~(ycCGkv ze=5i_e)jU-)>P`k$!*4P@t@r&qzhq=cw*PV+rtM!IvM)XC0ShG_5bv--2TA!>x#s! zmFQ6J2*%92&@hC>BgdB+(Ykf+#ggk%i+Jn+$MwxzUx{Cd11ykr^qww(b|o@}u`iBO zF~irL6=Tg3=xda^oMNzdR5tk)Ts^fg(kRw5?&Y&(M=%z#OP}fzMSAoMbj9^s+hLmb zYRD6~hj2VJUxI4nq{CkwU5a{sfG3wypm<9qk1x$&uTay;r~{5~8VId(mmW9v*>C0i zfRUR4$MBa&VH02KJd8(wa~&rlanCNF1pg?f+2cE0Y|9?8E-2GY(XJE=?E(ejw}q_+f596l8_TWwo~^D82{P@Je^fNKzcnT1_+p^a zo=30du6W22U!A1sd8>8l@@XX{!&ur)bvR_heQPTC{FG4lENGw`U2bJQSMNo-Q*`Q` zgL_lJZp`R4yhwYg;W|+j(nGg4a!4|eiTdX9WTXCWNtsihJd~A`hM15pyvOp4)nMZu z-Ydt_Ft<@)$Y~SM&{y-lvcH5Gz7|d(ZQ6-PT#2=_L_LBhlbNHTqiw<2nUWs0BmtsI zF;K?GBjhFIE(Se1eDp6*B#;TJrE5Xh)D%+N%DBc{Ljy1-Z}~5TqdIxlIwzyBA)Yzk z($HI%fsNFhJX+Fy(`m_gj%AJFk~Kmblq2EiC2*=F!6oZ9{E~XQ_kQda_9*j8?QUNO zr+4V)C3g)Z%Chn!h*@PY1@5oq|A5VsmYc0T4t{pDr!+vkt;a7;BOB|i2G|)h6b2rw zqy53Zp0;Jt*NdHs#4Ads4UecOr-L`_6@0p`z}%lckg2-rRYPkxV?wLU@Ke8txA;len#==c$b{3Pz3b9f$HO8wR)8JLJ!uQ9W|J z%Fsej;)4;fDo%(U<3lC&?cKRf*H-Tg-#tF=t)LsUGtv>VwbXOT z)|vWnG;QSzMI0;Yc>}) zud^o7F*2U6eFSmv_zW8fmZAX5DR zzZUXZi3<7%di+VQ{WdpB#f-$Cy8mNki`~Yx1lTcFLuduN{4#mPVpYClCf+*f6mm!4 zd0MA`g6&lbi$k3elX_pJWykpm=bww-JVW|-&tcV|_`RBoR1KkL52qd zZY8VMa^0*Oq(7fn3J$BduX#MIR;_YAk)s~BHgXpt_wY~h#p@r9w|p6#gi6Cr)$4KS zW-CercYTwqhN{G^8H@!@#l$B*ewo<0vv`~GRVtMJ<$-aWwu-S&%+^|f+rqz^cT zJuqgEc1XGRC8xT>Gt{;-}P65nfnx`J-MEX;QQW-!Hfp! zrPY|5gs3I_&Ps~0dt>!Vvi?ka#Tu8)XG#ufngGT1P-CdU6HV#16h^R?*9Yu?%*!GO z7X*_g$1T<6a_fA;VzBBvmowZpAx z>`UfR4T`OW$ye@5F)&_kDHQc~$g@0O zu+pmNIz$WabJwt+t4EW4ALVTrm7Vt7W$vhSH8UH^ktd}!cptc|;z$RF&z_CjN(zEl z>|PytEw9?izKfOS_l_7Gv!ZQ%`yK;ketxN^|KsZj|M74a5zkx7PZy_AcX#G$sIQ+< zn{n>Qz$Q?X8k6sB&ezU)N{>*$VSNSb(F-;(-%D6>3D1RH(rn zM%8*}aT_piOW+g!QXpF1dtGC@EeGd=W{*UAI`$$_PGz8Cnz1w}+GAbv(3X5}|M8Au zVqChdjHJV1QH45V}{NsHY;JbO4}B?Uxt}mkHLn9finSjn8dX8^(I##8{jSL zs!%6$BI-V^3NwYb?l3cdMv9!)qGzn6xn!14gWv+$xu0K%;YGzAg;)_1q;S7ib(^nK{3*AW5 zGC{iplygpIMI40FKeIp24SmeZ&vGkkr1lRn3CGIpEa=y`(J=SBbS@cP6r`SrOqBH_YyWp|tcxO>N5RKGBixA7KsVbg2tadcscbR;Gol$bSEY6>ypDsavM3;FYU&3*tH8y%8=9=Z<8Wb@^SLoGkc> zjTEk%(_x{F0*#fq^!iajzY)p-pDgw@^q6&f$RRQzzUP+FB{zHcW9`>tD>l(zeG3_W zr6cavE3aRtw%MdhSNlk4__eYhc2uftY|||DB|x+N`qR5>&#Coyf1+C=n<5Hy#v-wQEHbw+)v**STI9W(t~uP%v9xn3Ks}DHE_B!l z-PH$@YdXnkZ{OXGF3LL|n0Ub4!;2^r7ysqFq`>$=z_@YdIBUr?E3hMyvCbr7>s`EB z2`I=PxtR?=`AqwjN`txHh7df(vZD4?RGAw-T&^nJb1YT(;|J^t^&XW&47>Cn0MF#* z%ia$He1R2#TsWa$J3`gdwQfZlVxM6Tvd%MVP*o?=_6v`OT7xOsVs^m@l~B8ypL5Yt zlzpx^F|?ms9$U@f_4m&dv6O4}9Fa49>*O0wEgYe+xk0suBdC1+ixt;k$Z{S{)wZyZ z)#YN#NdOt80ZUB}D*Q$kB^UBlrnu>!B8Y+I@hdmu5F%g~)U_zrW*}maXE|-%yXdhtbaP)65?_g6OOW!Jti?(@*3(^H!kR*`Y}WCv36=Va_7uZwP8!EdS@;@ z(_u)cfC@m}=?8r@)sfcTu7KPFj*VKZSw~^S($$ zSg@QY9yK=y<2(msyqE7sC_-Q8I%l1J{;3-yU@qfx!j$E+t(zfXTQ0;8x@?24ap%0mC`H~G>g&p2L;b40=PdOkJP5S0wJPVSj`lFq#YBpjoU*7tM zc#IVS&cOXgk4iQxsk8icrDPlA^JrAG?L=;V18pcxMyE95teR}i*NSs7DF}fgD|xTK zltz0rTWZwa)#%9qh<+Sik*;_5O66M8#!RM1xp3F7$NM!jSW$n%osbKPJPV%Kq_Noj z6(^U)tLU!@A`muR+AXzx$|j0Oc-eqZu^l``G2`U;NX%GieOPfFO>WmcNt@M&Gj6B1 zz}0@7bKl9gFZ*U!pG+-9Ibp-g61bWWTeEwBx$nF!j55we35$eT%1x%*lchyX?20MY z!h>&p?gAkMDRsR|-k;C##Kbw1)x>tj?@wz$_s4HyA~6`)C!qLk;ewU_`dUeB7r6YL+|TE zeKe#huM%clDM0t23%|IH<&3pIlC2(I%%R^e#~>nU44OzvoA$2(fOV7;hMFQynT5A5 zyz6Z}+!HY&f=zsbFh;CVrhy?~aZDvrCF8IF1KrQzbpv z(E|x9Bs&W-Cowy~i>>*K$Bn16JDAdoKc!CdeuSFh;8>XpFuU*WbGyl(SN?heX}Bx` zz8A}raAqU7oi$^r->r)>{(aL>lw{p^g}zR7GeiCJhpf)``%g3FTGlhWkt`o8U!|{9 zTIp|aHp!;k>T}s_kg6J|W5 zc8!&e2(Fro%xB29ooRLl*nL_4B$!08ro;BlB0hxlIk{t>c=J1_j*|#_{uy^Oavy`O zcb`yuEEL~ZW%gL(5lETP;i3$1qdszihI!dlpz{rwdRZJ`e);C%V~Skj|4 z~Ad_|qH@1WB-I*|fc_MN~oFBood z;kI_Ja8o!>B4-Ln&l|8#Hgle2UBqgr9Kf9Ncwvy1I+fTM%I8N4h@)K2)Dosf^1|Y* zB0CcwF1%szo%FPlT_D_Apy5VecLz?MszPt3T?jTQpcUypTWLRa;v~8=^H6T9!P)&b zcC^|Sv8q}NNJe4&*iz@S9DBi^DVy6CI(pF1)PRQiCX5+B!3~UfQFeE<+70G3vTRjj zg1vK~Hg~i%;iRoZ6pk8=@wVF0cJ?^_{=fZaTyf{W$NhKRU_r5M`*G5{@aC&8;&i74 zTwnP-dg_njfd?MI)@jpm-SiSX`_$v8xbCC4{p$JHx8)7|;>qVQqhd1Z_N~LVlWq9o z=f8rI%x3)Lhd;ubnrmM39-FETzn7-E5PLvp5URED!Y{n`xw*aNK z(wGQX`%JdIk7}~Z`ek>t*#|;QMz`%CXlb)|%yn9eYQ$^=1i@<$C{7PW%e_K zJh_%S+gea(ABQL$QG)y&3zqD@U0BF(IhcID)7sUCGP_pzZc2ykg6QhDYs><YTRZ|G1;0u8wxt zcEYS2WSf1ux*F?i(cI4VjJAGh6J*xDt{!`}#dcVeM)yWfAGE zx(pw@`yTU1w)LS5tbXPZ9B%DEp7m|s1N-b9r6!xnZnrOimfCsA?$_IG?=SJopt`Pj z59W=W`gMP9syT+o9(xkgmfwNfu33OXJJ#aSCm+YeN#&SQ+=)kj`xs{4a1TDWe6IC_ z#GqOCb%a1ZDE*Th#=Ru0Q1>foUyod!&-e%oNP z+a?Fx2jDCq$*};q)xNaa^2)1LE<)kxW@L5Qy(-_{5$o8C<_#y%Iq6nloUJg}Ga`GM zJ!5QwvadI>+sxPH>r|P!Y*OyySmwi=2cM%%lF6Lsif|6fNyBGuTw?RsjazC@*mK}H z%)Ie#+-&Fk)c)=G+0P%v=n3Vx`icr0McH*{eX1`b$NFvJx}!Yywc5IRcg>IDb!3yj z9B}knJKH(mSz8lSJSc$T^otD9kY$d;Bh>khOdrZ1Vkw#^Quz$3T6IWBFOmSmF zuIe&zpibKrta8gT+o`}yI-~MZ!JXhC{)@AjuxN_5Rd~|U_q3Dehb!e=A>_(6&ntIB z5YJZ!=m+|hK|0R?$42x|oIc7YoJX7wh$ozOG3T?10R{t8_LaGF=elP&Ck04D8{+iD z!Q$E~IzN|g_8-O;yyp={8o|`J2=jSa_S+@AU_LF|%EW7fE9mYyZ2W9fG>{}r2YE1Ulg`2eom+ITB#r`0V$xAB4PJwbPSHx3?Z$18i=QPpPggzc1F zHZ=>^&9aYo=h;{-afwK*%j5hj0$(p};&sAy^FF{yIZk>o5l33~FFt2n@YoNFwo5X7 zILi$9_4)^8@?3E;i94a`H`z&CG?Cx;nJ?RilTZDGG(0z)EYxHj>ypJ>$(JG7yrvjK zGKoiJ2lW1lCr*wVlo@SZU9Fq6p?`TFX3n^k*C=-{F;?ZI53kWS8;i8t_IB&VRPOZ4 zhV!<#%LX-?29S_RIUDT<=RC1I(R4aHI8U;KlaC#kH;-$tz1BHBPBvu{&Vxw}*F%Lj zSDtLi){T~WNz0r!B;J%cOCcG)9S(TGKei8UdqH1MD<1r(Z{hW~s!*8Ojj=PY#=rgQ z{TP|ihzEc4k669S-gz?k#JShvYhU^#8jo(nx4-iPWEPj1&K7*?tAC6Yl_lnQ&OGxy zgnWGW&;H(mwPQH=)^?1Wdo%vSAAJG2?N#`v?|d7F8|-FdLB)a_KZGyccNf}DAHst_ z{ROIRrmX5zHSYQJ=P@?35j$V~4K~-6c|2MEHX#i z*5&aoc;`T>U__}+FpRScIvZohjmOwh`*gqaZ6?a?C+)_R+U%Tdqu~R!z$O%$YEI(d z>1N#V@sFd-0KlYv;QG3$I;? z8<)*P^^x6p`i0jl(#f{~s{>cxx(X8uGVMbb_Ekvhcqa~Q$5St?MqWXo1?7FX`Hnj= zr385H=_gU&nU8|(Zks7=!_BKch()ueVE>MFczN{}3)p_( zB62BcYi!5$w|@YOrjNrLFFcJsCmLMvUNCwJ?pk#d&K%l~7guj{lL{@i6*{M+ z93TGB2W|4D7Ee9-w0-=+`j8DwC(T-d+iqNemNQ3eE9x_7MLtGa5Z!9Nn6uDc>2XRkXu_YxHoUrSJ4$Tu z&&i?uvD5LPyH=r~w-L`APR?MGa z0fYS%ie2D#i*Sj%B(iOg*k?Ou-n4$Sbe_9I{%G%v-E`Y3%$ih!HLpI8t$R<{L`)WPMvk)`DJyN~!(!Y& za|I@jD>J=)cFmRJjM^Qdd(1XB;@EWH}nE}QQrTPR2O%CojxrDxPM+6>(F#+Kc0BzC3M?lS(gnMmfyGvOJnu6+%sI6>RhiMh+|TAO2Aq;tFQ$_vlnNckAI(l>v_&A92>C9a>c-Rh?)Ob)0a zcp$DXx&H0RV87ua2ggzTDO+wU=Xi|+awe9!lCHrcC&f6%(&C5Y`MLB8Mma3AUviAb z;GByj94Pa;<=9M#_E48#ak50KJgP@L!n1AE&DBlzF@Cg+gKY-q9N%z4fMZbgKk@r= zB};iK9D_C{wuLe!k1&;qRO(&%lNYQ{4HW?a1^oearJm*_^ba9~h|f z9B|=`tLj`GWg?B*AJre#DZK7Gp-aqN^K(3fDhdrPwtwE+Ae!_s3;$NUGA0R z8L;6zmQJxgZBHJmH4`sL$#tIpY^2?6pC&yhNPUI=CY-^f66NwBjmmybdF=b#QNZUI zeabo$Cow2X=aGD=QXD=Nj5cvh!PgY1Q#MkE+9ZC}iDMgS?={z4<0d0?E{RK(B+Jp* zIbd_xwp@#;GHho=hh3xWH|)dO0m7VhPPX%!Ew-4I^t!LmBa|!I7i@8tL4E@SW20$2 zoxt}7sZ7o$4No*_cu)az!gwEl>t(9anWUKC7h9Ft~s*a>(u;;bHT zAk>$3ve~P?EZd5Z*@-t_cntsJm)r2*1K-3L)Z9HW-K=F8d@ME7v zN!xM!+b?_#tFOKS&ATnYIhluV{`EJ|aeOLWJTJb}iH@wjbT zxdqa>m_KJa9{!hq##{4dSzxydQSuq0HJf*0bbgNoV$Y-E>JOTX3aokgX>7FzZ)aTz)@?nA+wT21 zCXeXBzyA0qSXVv?(~G-s!UmhGKJ^(aoK@il%)EJVa+0f`-JQ*N>%dW4nf?N1jLF2m z{NwjgJm&^{;zRdh$LmjF-6q>MHsVTjbZ24Zop)n=UMv2^CQJ6tG5cHX8wf|v;LBgW z2V-(u@bh2%8awvQ!^~2{V0TqFKJ)3108Pj7lLs~-dx1@&ojinRo_`%zuKEKkonD5=fB6f%{^okj zwrBa#s#I=RR)7zE^iK21 zHazt7YAl#P2lac`V8i};eBtw-LT+0%e({UnVuQVBpL@0*$8BfI&3E66lAe0o>ijVF z&7Fm;v-`1OPaQu0rB5TP`6M2HX0^QwSBC0+ThKFN5jXp!VPn z9I0uv)oS~RD(eqi^s`N_@JGO3fnUF$U{FxXWs<0H`U{{=bk}c`C{C& zas{@%_B399V>NQRuD~lVy@ARVx8d4F)9haHw0%fsE4pe&;1!#^x$_gBMdhdrJpSk- zSigNA?z+)F?9$zW^{ZdT&K)~(yuQzNrrhmrOWii@oo(lM{TnZ%rgtPhGOOHfg0|{t zyJynccAy|G5q@Br?7FneHWv8FHW`<;xl$$>JDzPe)hC`n9P}C+qmqW+GqC~ zu2dGbr2m4L8`mJN~y# z)4q3J0zw84d^eSYY2GvWjNrqPleufwtZ~l|KH&9w6II4Nm!hWl4>&#O#LEXD$1}aA zC)1uK1*M~KHp^CscE5>&p7qEq8;hK|a zldA`**=~TS8L@TQ7PX7S3@kYKXj3buVd0{s7&odAJKua3>-N;(Gxz-g@;Yklp7t;{+5lx-PBTg;&&Dk` z**$#ib6CA*9i~mV#U|vBpsZqv3%J)j^Dy={6yS58`UDz|?!rqOw_^M#d*<2hkAjj3 zSZNb^)%!N$A=|YzbM_2O9g|pyt40itS@S&B+h?nb$P8 zKr;#O3I7a3q3|HBCFXchInTD#H?PDK0Y(Xh~ z%zHH_JU9`;u|MxevcZ?_m!0Av{1Y#8^%Lr3d*}nf801w{R5<+%m}#eYr7l_*JT51# z`Yd&5w=d5xasD~xswY=kc`){f;^XA=e5JC-&a$nBkGC>$+si13!5>AO&IlbTP!uwEe`Qn%{G&kW$K|nXd~~Bxz?9?9dR7zPM@cjHn?cl zH%4XUzL9i16;xJMx|uo#&b)94XW~te#_*s4gwrtIFm;lBc`U1u%%e%2gAW(Z4)S2) z1Oe^f%oT4+yoi~2!B9`SiEYd)Dn@Hvwapyw#-IH^->{Wbu5eAlAOFQ);Gci?6ebtf z<8S}|&#=%|4}o%g=b!%peRiR=Hk`2!E^Wc9_I2Hp$If81ZT0Q8Ez~yZGrC@z5$nbO z{Nwwvu#$XZ@R_gt0d{O!kGdl#@r|#4-B!a#1LIfX>;Lhy_9gm#_}I0J@#RTR;-O#u z8jELDV%4qJVB*+Z6ciWP4Su5Anp`nwDaOyR3(2-89y)jkBkbMQh4bg3uVpmWZP|yD zr_W%d4J1#VI)lo&3vk8!nHZUCGjTO`L$wbDHQOp`kFA(4wh4`*%r-Qy*@z>@PN1^L zHmjRI&+C%5goYo^`s3n$_>8^D#?1z39Z^=|9cVGE|NoIcAw zw6zV}Es(COwRdWAN7$m2%??^Xl98Q*3fu11^45NP!0bS6b0=~~W|@yVF|l$UmaSNV zBHKzl-#&73V%<^f-?I+|6Bgj+YnR%<7`W|2pF(?cqpdK$fL7~Mr;i;(Q#PaTJ~Y~@ zcDub}IdkDvxN4EjqTBoO&p-MUnho7y@)xYQ79(s$_X-=FE?6)F#nwHhSIofJx$|rr zektZJS&aR!y@lMOQJ8BJC5H~}L0y(zP`34*?}7K&tmW0$Uypf}i9UA4oC?&QX~b1? z=Gw}!{kp);?dWPcV>fKuy>aFw&NO%9)>XG)tZkbgJ8C&T@WErYYH!;{?PGb?J5YVx z-T^#gJ;Y`YXnSFCA6D4R-GW(D4Qt7^Uax)m1srQF!PoA;2gP~(>5&!}SYBxp9_(E! zZ(WIBKl3Juw5F*IU2PrMx^6v6Y?bkb>z3H=8sLt5KWXm`HR6pIEeKh1ldUpNF*|`z-2Y{_ zJH%D&`wt`RV|mkO%|^#AZXrEv-(gtng7en;6WF}NzD$10y>=a1U$9*keYU&f`s;4N zWUji~anm(b*z)E&d#$CzuEWvTYi(<-ud!|K+){rWo2vHU(2**4&5oHk1J_@@5FfhZ zT0Hs0L)g7}Dsp<;(3X{NH-DS`?rXN!BRX*Boi}6g%yPH;gf_?EOWat z2j*NE@y7hDPJFCCfx5QUPlzY=- zVwx>6?Zy_dckEIWL_mu4CcQ2!EZh5@|MSfG-rd>5`F6jhO76`5zMXSs-ZJydoH_GO zJH%OS3(Dm^e@qMC9ZE}j{gJMzyfU6n>1iyn&a%F6z(coZ5C`Uwbj&Z~Xne9BbMS}h z3R@cOOZWeiH>zWr+5TgIGi76*Brm~xrX0OIltC7jykFBgU!F_9Om?OBlGZgCl&MRU z?ie&qLO+0gQ@_&=`7t!Eb~-fQ!7xpy9j`QYn9|w4#xsoNLQFZx%xhw#^^xVGGK2iV zds}80kJ2-a^?){_4g_fVE1%vg4}Fc}GZh?AR65c$#jA2mDWe>U3eg9}0ok-aSZ8!_ zl+Q9Jk(o}WaTf-^h))`9ycBF>rARn# zz`fsWlu1iEb*$9t!ZNA`y>{3X5Ed$57Ubb9xz408b8I*`l1Ik|noG0TD07B^PBUn3 zn)t`VqVOzWk1i^WO~(q4*;fyHO6@c!VYH*TFkfDM;xXBZXX(lrQ>8K=`$dnGgB&Br z6h>C;`Av%KA(g69vt%{}OBv!J5BS%+_*Qk8*{hXaL&nLEaKPMJjF7&DS@dOFXUczk zdNPa)EXPEnPuCiIkGb=(0yC`3mtltb<6o3fn6;%##InWpSbpx6X3LIa37BQPMsl!> zd&H2w^8Axe$f9@O!(R0RGI-onnRL-0!_&64Coe5sA?+s)MtN1BfiIKJ8Pvd~%||4y z17^l?08l}>Cqr|vPq79|fzcAw<6)KzW64VSart1?cG8({a+JM^DU%a_LG9PO`>80hV2J&vPvdQ^8WqIyP)D zX6dR>O;d4b(*9kWWYd~;7yua}9Wz@=3if3)9ZW(pPP%6bTX|Sf5T6LYMz*Y3Ei2Y+ zmf_>DEGC{Wks?$6O$Fq|XS0m#mUxiucY}vbc1z2D_g29ZI z0gc?jW2Eo+c9KOa7|zsD7~l#A>rVpeYc-bZA33m3iYlM-!qIwMm$VEJ1Hj!PH;qcEp^Tgl&p{ZH5)!9j!sy!bGtYz!FkSF@ZU zA0^tTTu)XlcWjY7oOzIhmpL)UI0o{L<(+&^>*Y`h+W@p#0G9h|J78M~&m~A{JzOprl_rO_ z;!}>;Dxd|x`fu7Q$T0PkX@HBz;9O#>Di~M?G4O{0pTWcM6Y14HRsQ+fLJU9+l@8eU zv0?Q}sY&l9LowJx$7hOr^jSXjj_E;+hwyetPg}Hk>8WjGR*(K@)Uos*=Ky%|d{zb9 zFS1dmYo#-m#eW)0*=v!g)Fh11zV*7KV4FoU_8F&l%9SAlbI~UG8nlh|@6O);`nCfq zS!Ry(B5A z&A?d(ID;Y!-=fW}l%lP*lH8{ft6A^@%^5D$+X_s%po03Rxcf@#RoJ@g10xrjHrrPk z=8fTex6Q!k-gr13e|$HxP)n6&HrnsoXG~8b%&s zMkAGZW&hLeuPPnGm=5+`xffhds#m;}E*70itC+Ej_~Sk0b1;P%aPW?f>7ra3u8Mn5 zPw-xK*glO6!0{ID=vpUq2JV$C11WSyd; z!K^de9Ejjx1?w%H^3d0x)-OZQ%s*nqvSnFuk1+Gd0SWGxW}B;nOiT~yX!CGpm^jns z;lP&Gsb*B27|k@d!hpk}{gS-$Es4iB(6Q$Y`M^vwCYHKY@0N>-SIahBvu`({cbZ_= z5gc)1-;h_lZFo+3+mus`NW*L9pLx{hp83>p#woq+Yq{HDdaZHfrTwOQ7~hg|QF-bc zL6J1;we7PE_zbXpBTq}64j_c_#Uu|pO+7$5@(vv_{Yl!siYEt~hzHv&))_u$@hJQ9 z3Y^`7^R38BJ4N$LtWGe{ZEy_(8U#(8g3F8$1a=Z=r1ODcCxQkt_d2m+(~+M%^jTP8 zj`57s#)mYT24*fdH`jDjm^pQPc-VMwxeKvKi!=(FeY&pso^r@!^pRh_8cd7Kx z>@TTb+1VTpTOf!z12pUag0{GIfS+b{oq`<*i6iMu7U`jGtT{zoutHd2->SSVv} z_=b!fK3JYv_L6Mei;9dta}XA0jjM6kP6-Z_G7cCP=I@uZp(A7vKA-Tnzdk5EzJIG! z9b6~({qb@6&fO2m$^}@)y{|%Uy77~kK|C%O|KT=`MBK)<`0ZpI(?|eS6+QtOQEKtT>EwytHazNG4-8eK5+$c6$$3 z;{ZHD&)!2ab^4{!8GCyd&R-~PXHAyldpF42@2-(q*Ix+ylBB8t zp8{;1Va^g*v~UqVr3S+gGTC`h$3sI>u$92JAQQ3Ib?L&lq|d#6zC!kM8m?!&)qhN^gr(UfX5LqIvVBd;9A!q=ys#X&_#4qqN0R^th6Dang5+ z6>L>@VAK&cN1vSm`mN zn{-OTXBOXl2U{6d%a|d(amGR%2KzFU^_=-!x_HYix5$k*-e{IF&YnHnytvq=zxUpI zrhT6|bEfGy={qRa#Og~flpb|44l4^1dUThntys;`5d*9hM`5huJEYnDu`&gF0*|eb zE|@t_?S~HUx;&}wauptg45`3b5Xo5agPxjrd?&F@X+dW|)74adxOI$s@@eR>)5Lcx zJE!ar^WD2(!2JmH9k3!}n`HF46m57fS-fqr9K|^)%pc!nJcKhoB}cloYa_3} zK2N&baJ3Zf-6(G@--64Sl_CN&{)w|6(VR#wiUu z))g9EtXI6}j38GZvMy;qEt+gQoY#6!9hAj^B+kfFCZBKCS9O$6J?yI~ALHz6r492* zM|qUZz8;No>eXj}df6A{GecjEbKdis1{e)2O;fCTH7&%3m~lBh9cRi_2W1gg>Y|ZA ze4v!v{WZ~=qOux=`$akeN&^HG#YPT+wB6wn{$*wnVe{&A;EzV8l$@~+egEc zZ4hT0i6#5p3}@e*e5#+mo!;hj2II-E^^iXG(+wIl$kb!vu3HUQuUQ9Fx5^6MYj`xD z^t5R>z{A7vxRrqIFIRKXsG=Uem-yUpaE3-a@#nw+>%hs@DW->gz64An#i5T{hnZA# zyzs8UbBoEKI4pJVn^hq6T#%%kNfdN}i{_%L7mu|6>$bXs3UuzXl2SsuJ^j*n?$9b?&Zu*K%F(;ZEx zhAXXUk2p9DJUhWoDUigrAKR8*0)rj6Q!sr?N;-V_a!8oIW1_Ht3Yg zQ3oB7VFSTNnoHbC$MkXpm=%rruw?}G>OE%$+F`GCD}49+qKmJQTd@@N=l^p%jEQO) zaMf*c%@vnPdR?)6Z`)4!*$=-XDLB=7z$LSANZ2eH+_{b1|G*>o1lD_aunJ_t=n=pQ zhq9s5$5Wa4E$DWwBAsC9$-?YuYE~ziHgS{`+_A5mqi(64_E|LZBE|VvY?!@?J?n)}cplx$?>>GWU(QW%v4}*jJq>lcr6S zLEUqt5=*DweBlYaDDjm6bQp(W&vNzQV#sL?d43(!@@EH;VU(MZk?tFO$VWP6j#8k9 zt`*Y2Q_%+v8-(&$gw+Ofq+M33WOwLpPL6Md1EEse__Q?clao>;0SD$?Fr<^bfy2Az z%z45brq%@qr6u8@w=ow_F*v^R(p;SEo+dqdc9t^CJn@rhmyN}z$X^TZr88{B;W_O7B~Z{M{ywohCv^XI)NYu@9*BS|u2)(G(m zaI76ptTqT@iYya`d=h5I>5`I>XDs{g(yJc~hl%pqJM(4hDi{U{>2k%D6Qp+It-E&PY$gr>j~^zflup?}1~eOOK(> z*GkW!m&h1wQ`oQ+``aMHIHaWwUXV#RBVpJuENRE~4VF;?wl}ozIYQ)D*Ut!*gGjM<05?torEMZx{@$hEZt>VO!TG3#*#OjlgHMUXd-U z7Na9oDwAQ{_GpI{NRlQqXH1jV7rZT-KUji;^(JF$1V`!pcCtPpXX(Ojn`xBabI(2U zr7wL+uElu=oT1`U?)&e*Uq1cmPa8wECCOr*>>qWhv-9g!V_QhCTuIoqN2=Ctkd%Ra zu!RS!Evhz3XTI_>uq6eD^;Bly1wN>wl3lzP2`xKTDjVH+L*4-^Ej~7Dk}RAzSGKKfE5+Cz z(HVyq4!@wEq{nxcgV56Mj~}-zmJnd%nuD|I_hU%m7gYLN16Ak zkMXLL*I{}!UgOwTr7jxj45P6~T$wjwOTFAu!2T)qYX6t=)u~M0t6Yr>`kK}t5AT^4 z>QEW#GtQ=0nHr{a8gBcf(OEyHU5ytS=bZ7Q!NJe0U4m_YItW3dNOjVueAPwSdTr}f zI*nHzhVw_=bPQ)2IFrtHjyTg`SKEYi{3)OMhB?Bo*Fm4OnkLo@mL0dtau%JdF!+pc zJ1q?=>ZPs00Ve9B;Z9?oD+}y8PMLHnH>k7mJ@ZO@V2>L+3oDV3ZO<(4^KGU&)+sE3 z?%NyvJUm}~ZvhU-Z;%wG)6SbxDxK{!?ZlGxh-FKsX=ga=n7&`gr$3cx`*xhlU_9~S zz3OF{9k1a*8kMK<3;2E+84wj$d%9c&1rx8;zJdFP5B+Oss6nO@sPlc6*$Kcoyl zUsf3mZPt}t7%1Q%4*N62lEyiGuKY+w|CeV|#U=j|a;>mr9Flcxxa}8!l z(>NQ7MUka=`Qe*RMoKIu?^_3+A1RxoHgcEBEa>`#35$!Da?un97LD3;D*rWuovMi%oE zpO`F}Trx}tEQ?T%oE1)OgFGXFoQbVLgOb8!9$2!&1|GsON(6jR>-c#dJ{&xeo(E^u zKt5+VTazCAW!QIKii5q{U{wG=v!;3q3y(_`zKzAteDU*JHJF93s`2+>nPT;y7(>o- z<{@=e)wSld{&;jW`Q5=dlsOL%t3f$YC(~S2QHt%Q_$Fa$n)$?4JR42Sm=i1RfucHM(n%Zd#n;2f`K@tJYQaa<4qZel?a!OgsBJ&iZHTY zVbY$3lfN;$jPj@jX1;tM$5M2Td6of}ozk&Rq4L8hz)UvwM7K_ZF{yYMipKx^rUIQ4 z;8|2$g6fS96PEGU7>s&*<^w^hE4ur7W&UD8uQ}Eb}Ck z9iOd2?Ah@!h?R-YnxPt)J>+$`Z_WMFz}%D<>J7Ju82aOdrp~i7$a+Fog+Zl4<`th! z<7d{QIc*bIu7yQ~crr0aglClPT{89~Qy!l~)`Mg`hneXO+jB}$AInf5Q&Au7e6vie zYCX)@XVn`ed{&O)Q&gySW)Q&t9358Jpe^G7Mr)QI>nZ9DG2wX(-0o41c(xmy{a5>j zWkZbkIX^DFXO^}7)qI-v3^%1H*Mg!Flnu+E@c~_oJ6^;+_Sgo27s2Ut^|(SPXBYTh z;DD+f9@M9Ce3@~N?4m`BOy`JgI#*{+oH+4>Ha#eV_bP`524^?;{-J)h`-;m6e0(>M z25nOLJeK+BWQ31|1%iByBMDGB7GVZrBs%b?j|q!B_xlFuf~m4-X} zL~Q@KWI8uD*IZMsK0EX&i-rr^T>eN;$8@mIw0QAiqleEP<@5QYF7m0P9Hxb{+uVxC zAMac0D3f}bcFuINAIN<2r)gy;m$DhgK?wE_6${N*OZ6%}Wo!GQpB|$wmJ5wm8hONr z={!|kwhV50p}|O*EWgVxyUbv@aN$CeH0tE3{9M7xvON{uT5j~2S7J>=oC6^2=W}3? z^?>oVL7^C(jL)`_Z5rz;+c=gNou-BLiH=4io#v0&(@0%ms>hbWFuGu2h0)r4jjkbsduUZt7;jh@Wkd@{4E`EqHt6F+ zbz*v(mZc3K8>j|JysE(7@%L7)!vSn#q&rUI^<_7v;a&7}o=6)lq_K>~W#jXN=dCec zH0j~tE#nPK(}{BTY+Z|$1n-;g2v?LANfu7FpE~Ihd{0>iPa1em&>sMp@hp@;vG@WI z#}qZ?g7ucPC+PG8jh--BjpzgE^XbFOB}`VZ0yUByVQ3uI81u$)5$#bhB5hMH3>(rn z*62$J)62XV+Q37jdQXsV=&ffglJ2I`=*zNrBE(_o2@4~+3Fk#fI!{O==}yww`Z{#-}sw3cGJi#!PL8F&5T56!{yNB`7oEquX@2|j64VL=l=1Lu2 zqIh{>WmK8e?B6M+o3~4HZXZdxa1>@SF!+dcn&%RjHYGburyA&d@8v=l->;hfFnT*o zb+OzysI48Wu#QMHnYN6e?B?o2R9*)86LE_FsEgQDKNJ$sG+RoO*Nz=HYejKhxL$koOrU1+fM5f>C{mde@v4uH&;5PiN&Wb>gEA> zeD`pB0_zXMIp9P*S>G6^&)&)C2~7(y18`Eed4p6ho{tr(n1J9xADAFX961)hG1z|& zy9ERJagn^AEXG|iN{?tHc*|T2peWi7abaZNRy{e=htxKA(mS9XC;o@pm}9#jg-EE)DD+oD8FPGw_4k!Nzf zkG=+%w~rZvF9l&RitqA40|%JFk6^mv@X*74^num{@t)UI$WbJnMQ51OYQ{8-8RSDn zQ2Fq(GLt_@Pd@SxNXE0^IU2}^LF0lvszc+o5vB}%SV==?^C}OLe)>UY%V3=0q@D;N;cxb$Ruh(IG zc36y=NVVbRj4@nI61;)xd5 zkPg4j>%G!bpI+NKqlMcvDl3@3pgdca=1*ztIF%h1)}TwNPV`l#9n+Mo*y&l98}N%J zU-Rb2N2lj=enQPbIfT{pXlbO5U|eJUb}CQqn(|d94`<^0fG=!2JeuTaG@53W8;zeY zHNFSfS!D;39S*(}_5Bl+W9}70wxfJGWA#++UVIV;vy2|(7>6xOt?(jE#O!)J3>);! zeB&IES|-ub7Su_34Ab|X&Y!8xwvTb=`;e5Wx&w4|dq~R~fM;djE3({!1=-a%(aFYhs@rVxAmWsSX za(vrXEMCG2Q49*V>58weU{ABh=gp>#)Gb@Skw+zP&4tq#r%go6*dBzvbzB>7vo~D9 zTC9{(Tw011cPDLWaVhRlifeEPmKF-MxCOVO#kFW~iUbdC!4kYk(4bH5bKd7X_vf7R z`@DZ#H;Q$9m|QA710syYn0z=a;)tuG z(3av24`@SJzSKh-ruJ}MyFOHK$jki5D+RXFZ4(n%Ow{83(|m`s@{&dkKsBA1vE@JP zo|(gjlkmwmNUHvJ#Z#*;QcGSXZ~S#;R0}#&4UiUSBu^C;S`3_!Z>hJVHA_FMBcmNI zxOC>^b9gh%cI;}`R;Kf-T)jI;CV~|%ho84|;3Pg?0nuNdA`RUQNMS_s3k|;-JB+Pr zQu)>O9V*wHHa7lU%}QuJ>}b~f%u_IzMw-(QU44AaGI6+OucpU!G^tuf+Z-vQS10s= z5U7?sY-5(di^VTdUU&k>Gob=>pGg0q7FsfLpxt^a&bC-f;`ZbzfM--BJNOgT#23nv zx$}>~E?z?~x8Y}pI0nNwe69WfH@wW+?|YLt%MdS_zq{7&Y5f)Rs6xjV(BJuXgXuSp zZB{j!aMkRS1zEkR$aK(?wa3L19Br%Ax*|CBQ!Xbm6A!111PKdN8 zrEw=97GUTT%QN4a8DlGCz8bEmZ(L?xCYzXtiRdk|i+m2&T>XXZN!g&!H**p&;`;IX z6d}$r_d=yEOzfvpxAC!4f*pfF(GPt51F;3QhY41WEgSQ==_1n(JHUab-bT)R0ba&h zGijR%<=x22uB4G}c{GY|UddUtyaDe?ANf26m$|-uYL<1n+QM%;{Jutg(Ij=DC<&Xn zh};6~K7}R~u@N?ZBbF!p&a(FF_>ke+4tdAp&XH%FkD}bY3NzdZ#Bk^yklYXJ7en}Zbq*R zcBWd0C4^)@le3uf(Zo65OLv)ipvN0)>aI0k z_Ce2`)5w{1cUy{5$RqfQq#_A-etX770}84!+7+sm=Hvb-J%(1c06vuiCxf)-p>t3X z)x-J1yrGp=_(F}aO12JSS5jd;?N}#fL-rtwD?eDxbKaHpC9Hj8i>gwHd$_dZRePrO zm7x`9`6Z3>guOBLPQqDj!<92${h^lj!&}i{j;mZInIY&y2UG>arXIA!e>oIwP1AJ#OY?y$>rVS6%`3iYA|xJ{OQG z|K4%>5qVrq;vi!buBQb;{SsPMt>0tnrI~r@Z&3L5EjLuJ)iTfdw$Uuvt8$O|J zYN5e6NzJLQZ}@ptC(XUQfn^(z%~$9;!nhmJoP^W?sZ9g2VW*bIzx+3~Oh=0($}Zq~ zktX!@8sY&n;k+!N=4IH5h~2`vumL7%&|fi#RhTe~s0tp)sHVrnQ&YFh7s94{Sta#8 zq0=SG;^6*V^*$|pHe+8bBZX=q@t&r9NXF@OFmB`Z8xz^j*H4W2&De$d=crd}yd-)T zgk)Wb}t6hWO*-v&qtnSsigJH$Kr89C8~wnn*n zs8}`?;746P`pyge107(>$iI$TOvy_?x_9|ni5fEDeeWEOaVyi~yBl+^tEzH_HuiPc zwm-*Jp1hskIKf#@k0(#6{MT{){k(1B1jZV6?|MyjB{zllUHlQ{e+i%~Ka9^TZtspt2e z!J3mVvP`--vxpG-r<9y`?T<70$4+sJdGEK{unMaPmbnUzh#Pepc=Gsd)=1xODReU? zAGjuc5ky@dWuY%D{6E(3xZM6A5QD1qe0xDc$w;~OW@b^)v&QGcdc^bnqMe~@0IkGm zXf&TkkS|Dm#<(eT;PO`(?lFynZ{E?|>f6N=Q&09R)ezAS7Q33MuOs}i{z(FlN?~Ym zM$$!nR??xcyk9da%NaCW(9UvHB)`tyc)6Fn0vd0w$w!!O>vP{m%}Y`gG!3>Mem=JN zI~wUGX99j!5=5;YoB=R($Y6~=AJ1S#6g~>w4iKUisocqDBx=Cu6smUfwa)k$Mble{ z9nVK=Q4^6$7~x~xCeTTiD^cx%aHNchma9z2o!Pc_*f8znPa&ABA@Om6@HB0t7R_ZM zS>z0#Q5!mTnxp~r*9E@d3af0}sX74BtG01VvNsfqLDT_hYQ4Cp0$f|U+r*&@{%Ilw zKfHj)voo+FbJ!@hdJH}mlca~LM#W~WVrz5xqbrKVvU9)oZs@e-_+wZ2^q5uH;O-~7 z?#Z~3=o!BSJ;Te+x>;ys%!f)idnF=lz(zks%d{64)4c^5*&qy^bEA?sl;ny`_VDNw z1Ju26qNzj&ohvb(Kt@PNVO8sfZmQz-*M&$tyS(j3d9~fz@vSl<_Imx4$LGe2t$#YN$E3!4VOK4ORnTlD7nmN#?)3kZ9$owi}a zl-y=T%#|hW9A>As^TFpLKrL4h6Ze_KyvxLTjydxa*vwOaiaa(uAx8-OAp<$q=r7#} zv$I$9HH32lr~dU7Zy^ySh$wR`W&F5#y3Q@RZS2fm-m1gyYHVf zH#3fGbirzG$N#rB{)cbypFc0!Bkln>2Xy9!GdYhdBV)z?WK!pomE+YreRR+ldg5pZ zF%OGVx3XT+r;XZN|Ss{>@ zkJgM=U|Oz)v3^_b5q@{~K1XfSb;$^m(?^E&?hMtUnVqn42P(U*G-XD+Aaq&_n|g{? zCKkB~4;6A$FEo@?>}xS@cdTJ^C}XIvf7x{sIvx@-=WFz`sG#nxO3HKM+KDGB7JNJ^ zz*tsx*#nCLE#K2_4}pD4zTtBdeYWtL+m>)KSxg8kpe_?0?twj8XOC z^!1S&6~Q&R+e8WENR}viYqPMU1#|B4e;HS!muxgn`pv=S=I1KPb(hvff@!Adtn9Oi>Uu9AJ%s*_fVT=z?#s2eiS{7K#-`+eSEUKmkyV4HHz8)Y8`Bixqi;4}@JO+xd_C{((7HFAqmF+u_45*&iR`qZ?9GR^%( zoIV!99T4de4OY07-99=p0aIj1!aVUQsGM>{xn$&q_Nl$8nvJQjYMSW|0ZflZ5`6X> zJ?}q!#15tca=GR|Lid&kM$SyzZOV2}k?v?43?K2yM9w5FWDvn$t7_F~7haCr=7os< zk!Mg1{@2r4$`dwN;n;n~PB(gM3ZdnO7GLO}imrT<~R^N{1T|4V+=>kwXX)CR&r6L zmfP6s+aE!diF_=YEmb8pjK#4FK1ULwf0gAh_R>ZH*aiD(BmecWnX*Isaz!K0wNFEj z@K3)jW&d#dZH4D4*WK5vZikgzo4&c#&TITrymcL~F;cXhf1OKI5u+S=gefYINK$>= z(!LS?x*ePR$dB3x^2eHrZIXXIFe>awfXA>A9WpLdq=j9`%Z1)bhnrIYsbYplj|clJ zv(KzEU|P)^mN=)q?nQ`zAuO4ai@6IX7VoPn? z#LGtHuD2DmQX;FWYU3D-)`wmmYH-iQU|sk^p|n9|_oM19DSCm=;}dkla|-e)(N$F& z@SQbv;;&%bp})MrnKU#-y#YMc9(b3S2-k zCqnY>B5<-oX0EcPy53HE1{lo?DQv3m; z*z^B}O8@<=s4s$JPC|>n|2L!gAMpj*gON7?`3}k7|2v75CskxFc+F9vEnfdXqC@;$ z2ldt_fltx&|Fp~hB0={+1WTh~+~q%gum8n*i^&s+J-ng2e=sTW56th7!_p9;*`NO> z5}O3~ZE~`iS27L%w-5ENSZWqaV@a;tMDiajQr0$ImBYyOE5PnaJ(Vyit6m79wm z`X`wp`4=VSMGG8Q+&>y6m6uqd5&Th+@Q)nD-UH7!@{PE_KT3__zoh2>=V3?Q#E`Me zZ~T+k2>$q&*t}|1tH+AXA#co=P0$@0A> zF)@aG!ogzs$$}WrT!?Yl&A$I@i`)N`wv{{92d-Oyr|HU^(9h@}bu{qxFB7<&i9xh#-z^%hXNRom9hy_g@ z6a6vs6>EWluWwpU-)DYd+>ec)$#=XPzdLa$r9GKshb6$*K66x-3AhzA^NW8Fh)td- zE{KEO<%teY-Bevv@zJ(ztT`Ea2RJ{e8vIpOrym}E2-V5?`#mPPr{|TTvalj2sA#$eLR8l|G z-%#f(e}2cA5ZgRYlc*IpIr)O*#rs#n!X}1AuRiP>@7jKGyZbjYbfLgBhJ5Nh@mqGe zfbTA6PdpYVA+t6W9!BypCQF({u>2IX(B!aXt2Y=w!w5-lyJT*>9p3A*KL9TpI7VATZR#f!J`=3GUE1&RxM_3`&4 zBp~Llbr&^n1Hi&PEP$%Ox|DWOhA0^ z)7<6(JRq>8p4Lw6U&B-mPK-+P?ur~F!gdS?92a!GT5qEL*NWN`fPtsS@OsbON%JaR zhTyW>eWx9Iy6c-&Psnf>B^dmxMYJO6 z0D-0!M_4t!g6vUj`=nlDDj1b2N9OP@Yu4qFqz%igyp9sAtqZ+_HBLw9vAbKjLQ|

    WaSR=nt)->1-JkISuFuKvzb#gEHTl6aw#pV+L+p@#T6L_% zxlIktxt*4!3b0citpGLgUs0F6p;QhlD?9wm_u=9nEXfRvvh*JN{h2VHMeJOV|d?DLa#+{Nv|BN9xDE&7KFX zEEa`Fq4opP!sG9xP&6@OZaNbsmV8OM21-o|)ow!Y%$+JQ47Is(#R0pWWe z=OQQ=dE;cS&R`3b?d%PJfV{GRLvI10hP)r=?)Sv|Ib8)Xk;pl=LoLU{H}{gq@T!?i z9wco}oYD$lYlfDYipvvdQJqPQz1SM}5#&V*tuQNb#?RVnt4KtjCM#E9;h$bZ&x_T^ zb(IszF&-;jJ@P@S^UR(HFM>bHjt$4_AzXm>vz5EhcG$9l_!?k@DtbS4H5&4mtNXy2oc2Pe&Xe7DQrp&dK zO-<(Rhkt0;>D1FgpKbS!U$zq5^_R`nzy%46RgV~>2=akJOJJUYk~ijhSkS7Q9Grxp zuc0yjY4_zR=RsoRW$)Rq;%hl&zkKJ9kB=NLshKIJdX$svUpmBCDZQRQf=@cbUn}|9 z?Jy)*SDj%n%PWrYi?PX}v%Pv=H&X(7)QNeh9P{BRLH3w%9e;n$PUFV1T@eNNnR%>- zrB|N7CpEZ)2|+l8Kt7Pu;O<5J?H1a*?vCprd@R-b8NbsS=6sh#OeK{@Bshx0VNuQ@ zJwS<3ez-D<_;{-U9d*P#w9I)2T4;dK-%?Sxc-HWbIXKv>qA^24@m3lw%Kv38u&I6C z|F9RN#TJ{#3?|~Dvlj5mQe+ARXT@#$QYz}8 zLl<7A`uX_)3e4L8?XEif?%&4OCmFU}f*D~bT#QQYkvb*-gGWPd1rvC`{K!AYoWG>H z2&5-*nm47oQ$3M$66JrgouKKgdo zx+_mp_!dPv@x&VGFz;vx0JG7ovaWA1YS@0)n>)H35_v+?tPsx}{3x#ZIY)bA?8(e$ z#&?{KytdbLLeqAoRj!ip4Ms`KH5Sfh78#`37~H12PZ;&*FxJ zRzQTx508uH_%X5|2bo{#J|Ra_({697b#k2FtG8sv*b6e?tY>^Jm=%qOX3pd92<=LGYrIW0o$LF&BV4#4BPcrQhe3>{>l*A!^Uh;U z1yC`d*7PCW_8Jy=3)lYg-LcK)u#4zz5focL2FN$9c`(^cVq)y8o}8BTqWkbMVh)(` z%GrSRkzkmDp?%2@WrZFYF3)P6hXr13{}wkeYT(eEtL?q7abG#lw*8u#0(;t?zziWC z#CJ-na-ex*zoM5!G1wU#hU_1=(EJkz=6h987e_)bsaORc){Fxx;DbAsN_7tZgQeitmfk)i5^>;73fJIy#B4wpKru z_M9gI_AK0`c}TB;r1}0KU)A?Km>m<9Oa?EHKd+dpp{%SlwSDL?(mWK9slo}mFzR?5 zx_6M&RPMhE4aq|%B8B8-nTwYvay)fgLr%z0s*iyN?*s26kKc$t=WPl7p{N)ihl}}3 zGYH)B@zvA~M_uYn#nl|CU<&FLlk7jWhz4Ox0|y;BTm8YjNq859P}XKas4d|iVW za;Z!E3YkSC86oj-H!ajt@`M6z_}I^Y7CFv)DyE%1)UPY+X#~f@hNi#4A8*{3yDza| z;IyDP!(;MFS{T=3@&oh0!9~(KU&mur$t@!mrgpKhh>9BMv&+FD%wuZm)IgIHa;LSt zo6^!#{C8L{5^0NgtGL%y!<`tGKOYE3 zs!@r#LvfbOF{{O5J=`2*Nz8cP!(Cmd_?6UDWdk~Mn8|6@zJCzLJFqW-S>ClRg}%H$ zO15+{E?eMT>1@rSmR?3Tpm;{iYLW9HvMRpoL7gAIMs!GAFl_CMU$e*iW=XGp{#pL< zG-nvg8H?@lUR}dmiG+k%-S_ZliMUBt9RavzUSVd9|IEjBp`NqhT3n9XFG*~D(a3>L zS&*i-X1JSW-0ygzI_b z=l$d~-bo$mv9+k<=I0ePX>+$^PJl%VxR@Lm@0OAIV=MTb6rUWuV z#RK_o6BN&p=@J_H+V)xg6%Q2N8f?@Jc2cvv1>bIkN48f5i7G3~~RrOi;!hfslS^C-mFdW}P4TE0T86%m6P1sJ%h$o(bp{ zLurW!!mY7w+Q&J;6plc3S=E~~E1G-@jmL^gw^OEa-Md**`pym#@$cL!xey+2!buMj zK@ob`9&31cr3xcJjVH|~btnx4A=(cf5s0^wXxYZBtXeQnLY^waC;T{y>@lu^2=4tF048KA)Y$WCFIk9WJmqRkk?(-ptWVXM& zra3fx58~rde>39P<5OOmWCfIA1B12{Il4QwIFs91TSzZL+e@&Bl+T)6CT&wi+zVAw zUE(b3I?c8B2=L$rW|{;uBi?k8^97XvPA~|m$Pso;F=!emjZaHjADOCvp@ez#XG@tw z^N*`I`_CnlJke(n>irMZTVIOvRXmPnNdBQ!2~k|Xgazqk#bJRev~`^k6pHqKnEg>O zli9@{F}&T+FFywFdrTDIlNP7ZbXlV4vcFamml5m1ke}iir7h0~o@^PT&={(y)}&gi zwLf{U$gb1+ZX`uuobH>j>yU%~+)cBj8(ovXq8=G4*?|Su3q>*DtqfbfV|dXS4>sgGI=7EjilI)&)^m@N)a0O~qN1ude1_&E3V+>^=$1N~Rtv z1`O5@cRgI0*CDi8*jLz;$_?!KkUX#zmxl~5weF`#R*kLS<_MJT5bUl2Gd_HGez(p) zum{%(kD*Ukr5uf=P9{w#I5v|LztKXNv~s*uMD7AE3jDW^vmrnI&z`_OfA*ZOT@7g3 zYy%9m1wEdtMm;oW8Ud>%R-ccJ3pgWfQ-wTBjK!TwPC9A=w0b{HOK53na7ApizE+pP z)LkF17F|=T5v1^)(xe96C#tOZ=yf3da@#5X?Mlw{&oW+b0 zx`BtSMg@{2kNu7zO*I}U!@09nwWfVQJ6m?krJK2h?L6160UDoR4cW2(+im9HmVGd} zGBz^OXRaMwIo|4aONgFWmt+C=iEIZ9=(z3bImeBp-mVyMqi^@SKBk!bP*H4OXeRN3u^WC=qDD8q(x~YTY9hPU0PkES;jZvh&XRn^4ADffT9JrBExNFZsMkzwOM=n@4CjH#g|Wl5ff(@7)g2)VyHS zh>`^ySzda4Z0d`YJpcftyADbAX2vhhZ`WDO-XQN*m(rm|g``JzmvzFom5eF7)Q`x- zO+A~=FAkhVU8|Aj=cG~xkg1Eu*U)Jn_1mN5(01i)<8|<+4fyy|g@h-Te} z;mg)%@fZeHww$sds>2mte$1s!8a=m;a?B!)h;5~$tSGB|D8>%+Tg%E8fs0ztpCWhz zFK^_`1<(?}zx)1x)?c#bB!d>JhvTigt-M3_HW&D(ySltZMlmBBmkDN9sosl|d9M$S zuE3wWE=f)XLok2G+JgH?aStzldru4fDk(oRz1*cgMdzC5tpb|PHAq9Dt1~udP3^ZE zIJe5ZB&DRvYNJOr6SOe9{yyNT*9HX*_2pjR;l{-2NeO4#9nkD9wc*b8$7ViVd)pV%z!Hl8o1D=Cr$QBk=y;VO|mcYj4W~U7%r3 zbimaW;G_*b=Ri}iiVyaiE)93FL)2CYs_MI?G6#QQ zyaFevkT59z!L5dL4E!5r0(c2V^qPP|)fXn#!@PXOl&Z+?zyX_Ah?(|_0Xg&KMw@88 zeKu^RKC(;QpBdyQQhrh>6z|>C;Fh->s;75#dflHjj38}uGhxP*^8Iw>dq68{N=AMMycM6}WMAC8S>OXiW%`|+@fGd= zVX>KPpeFX^J*z(e*jFL1lm@$S8o~eWsCW~+&wkstaA!&X@z92t=}VEW`W>>JR>Pt% zG9GnM89$zE#+;qu*)&N9U^>6vQxlJzSnZ464sYDFoEH_aT*?3_0Jx-!^0<~XE>cIq zig+h~gRLeM^+`b52+$2R=(u$l?%l62pvWF)MaY=cx1p90Xx5@JpMpZCcywf8B!TVk zo?GO8o}6{nbaP2}{1dtKC89FcAekr`y0m~iVl(Ry*tLMSCb!2dvO6CEz@dfBy~{pL zR>w3Tn@35NpNriT$>5jM5$N{H%H+B|uNshFn?LHx8+KaDnntbdQC59Dk*$mpUaC?Q zwAz_ng%`+54wdN)R{W(!A^?EM6cK^jwYVCOffn?g47kWx$SX0jJ*Q>4{3PMiMc&PN z(*0(#N7L<9$p7s@?gP9vPEZ{jlW&(!!1>sR>Tp zv*+boDggqc>@ln z4rOZ3RjRqRwE*|)m0`0s)k}}zcqcJuOk9x}|B=Z;VJgFG;2F44w+-BFnHuq9@n`VW zKr`_IlJ?F$Or@PjutMhp8ct3+AWbU6NvWQ}r2L#asTAy=?Fd3Pz}so{xN`2IQHvfo zVKMP1jfQhAC;XUBT2=*tmh+^pR>^#=7&^h-{jlEK_7Y@cT{q?d<;f10pNO+)r25ji zU(?^gY=}Ai4i@wWY}r*}A8)l*u>J}-YCYFnN+j5#zaOq%A?(I3FRh$&eo-uN6+aFq zF6!x97uvb;tA`yN+_b!4^c!cXxo-7F$(yySvKmY2vc~Kf0o2oi4x}bd8AO!aaxDJ9 zbkO_gP(di?(Y1E&8S3mWuK@=|&1I?|GBX{((Q2*!%dGgzdn)R95rwvkIXifRjW^d# zO!wZp3}^!gj#XvfA){PNov&8Of}Xcq%}*-24Nj5ooRe1?UN;-xp$=s6vJV()&Tb&_ zVCcKTfNMd4d_DZR>Z6AS)xHt=76w38$Gn2lX+=B|;S+jJ_utUlAz8O$rw*Qh{JNuQ;H zaY~7O6+Bf#t~ZhaG5vk!v-&9GZ^MJdaaP->WT%uFrziXhYKnbBw_*l|2sw_PGxFwj z{nW8~BS4eoqKkOd=bw=b0L|N~LhA zeley5Yp@|}6g?L%zE^+76(isBeMKtaCEt;kr$jb_{TVK%4S4rfb?F5uVcA9-#{u2w`-GQ})1x0*uCg8B-vqu(wCJy!f`I{c` z8o@37ucbH}5Xb5h6(0{C7}`)8)uR4F?fYuUvL(=@IOk>Q+RM#%p=L_ev9VBbmsw;W&(p*3U(TiNRkA* z1YQV_c&et34v%DmQ*7Vu2`QA+b%+qn$e7LET@>&(%j_z$Cz(<~ht70n_O%wblhyS% zGI+5`A>H5ttJ4)Wa@=nB)~CKeif#VCy~z$xRD#ye z{LB%FyTDUjr#TDj%~H<6Ru-TX>L+1TBM$K56WHshBFyZ}CMmA*x|Pva{rcD(cogo5 zsP0;mt9{rPvv+>$9|l;L^67D5zO!h!Zt!LjNZ14kBRJjng;(j_@Igye4`S^uZZpA0 z^?wnY6coum*dC9Q+cR3QZqq1}S?|Db&Q-0PNwdf4(;L&)@ecu)yJLT{eH%N=KHsrRSzaN!Y#1i; zwNxu;?lKZNup-UgJMzNL`7j6jNdui!3mPt$M4CsJ=(z?JEA=xZ zl|Vz!J^SmnydvN8n*%!FAN*aYD($onxLw(%SP&``aBYC{+Z>7-k~0_CJybhzVB7`z z^hGy~T?n|;obT;MsA7^J5MK-kztxJ+?6iV`9buJy745yKqMz(Xx{Mn2ilIL^UOGJ_ zG`&GeXc~A}Hk>b|v(ct9<9P|(GFNhi=eJM$ZSc0Ao)&l?)>K_;4_bBP{6wI%D$%|< zWfDWTxeex(09u`eAnKDWuFdL+*7loYvIFdxQ&ZlnEAPeiVbDs<>G=!-&3(XlzWjHX z!Q$+lk66!gk8s-C%F-hl{p&)}&EicB^>aTfiZ~QqzaqW$jA*$rGQi)MvRm|*df^eH zk9C%gTGlzb`y3+3Hw|I2 znhB*qbjJ)GO*A`k&V$6@gb(&uMYr4_vZ%J1l=HF+9ekH>7@;A zw6Awq!va$kN)-$-!zTkH~dg~aNT(Lxa;Ms87Z*;Y4da!aUjo1&sCpsE$rET4n zyFy9$BC&(z3KqcYf2BNzu-ZoH!z;DcpbW2Q7cEoI_z4;?{Gj1t+i;Fjyp41z@)Bo7 zR8|@wQjU^+lFfWmA6>1QWu3i#X*cOLqh5VyW&>2uc$*zbePVK&@30&&HxoDANBh)Z z^*Aid^e~#@sun3vx{uz!9M>Zrj@4NApC^>rFJEvSOV-fZkbVl1!6%|cc?x+dL(Oh5 z8o+~}{*_SZ5GR+|j*~%4SIhcBw%~Osb1B}Llj&dS>oI1;PSgUlYYl!Wbo3H9DssTq z5I8+{PR-YGVTS1pFtzjSmU30L9`idt+?`_soO>Q@HvxTUMSw@TZ4F~r)0CCMH7#fR zHvVy|h+I#`=_0E?L7UfyBoCoqrLR-Z0McjS-q1<#=jgqK{Uy*9CDCxz_IaNUPEOwZi}*dU&~lffXF$<5UnKKzzw5s$3rM~m<9$uYeru!m zqUXit=}%CLcmE(5rDAI%4z+?jx_f!{DrPT++N{yX|LI;Xhagg92wSWN-cN!{aQTL& zH&~|n?^sOaYe|sY?7)p~|MtqT8oT67j$cc0bi4pUri4>2R_;68zA)3d7!k|l_j_5} zLxBsbLAT>lxKBmt{+W|8hqY= zz-Yu|w=LaSr~Wwhmgf6v*~UKiE~;&_;WMr;SR85*LUwrw4CICEaq|7df8Mvugu8@qQJWmvXyx^uQT{?#37Z00l29jF)_y?s7LcPM1v*-H_ z(3R&mUt7)Cd{1zxwzApKxe3F%M|(zCVl#7A6R_ll$-c@;6xqIo1+9y@gvaOz7~(oE z$7WGRCZ!+dmHy$F1+fReqq_*9C-1tMDyF`*4|k&rQkZ#-#=URKIM=R@xaw1e_SCM7 z>fT-+v_nRXy$j}chY#x(jp?>#z9z>937pe=UtKyM;}2Sy-#?4--ewKK_ZqaKG-Wcd z`wc13T9@rpjEsqrVUjWbx?$7JMiaU;%rse7TK=WSZ?4|QL4&+B zti^>o8}7TJqs98GZ_Wo>ZePrdK#c{)+xRk7{NC+)XdMuLRr`^izHw{*EDrL6#O9^r zWe4~<{@Fm%sYCtXVGLMShJW|*Kre%9b3JxH(KGutL+UaCFmP3>I}p1lWYB&@ZP0RR z)VTlc`0W|YVRYHX)<}oqaT*?GCuSdVcd>XH57|p*C$(OGYkzmzEopTP5mm(JG5@kF z@#)**H%59a#BUf$im$FtFt7B=Cm9orW_U2&_EY^C)qt6_&q3+8Hd~!Wn=^lCoi8H& z_rj~mvTozKD8!Ce#ieXm^zVXYpNIUdh-uM&KG>@>Nc1;n#ID9p6=Li=agLlXEnIQ= za3>9~Z~$U@h|OZ#?{*k#yinHEi`XfYTsK8!%eTZ>R0J_8IweDg=caUV;bQfwm>OS9 z3)*>xs4Tv#(?wi79`e=e^HvBtq2-p9ii)3;TywrYdC_!`tZ zT9&`9&BEISGC%NM|94mJ>zCz+k;27Z;Qlt5ugft*ecOvdg9&c6mgghEDT$3rm*?G5 zEOhF{NxDDuZ)fB}i5cy?&L}SB&d??x&F`r6OnB{(K>q`e+vnUVF)ZuKR_jUJ=$&0c zqJZx9_djB&w)Qj}DBBxF>hAtnXkjRMPV+sx>CeDYpXIPo+glC&AHoZd zgwYXqf1 zy}$i~m^+}YelRiaYC!cwih+KyNtjTomcQvDiz`rNVfNz;2C8o_s(F-~!R8oS58 z^7-GKq#0dzLvz4PjCgtVWhNZJR$aNwC5{(}*4|i>XcG9KK+TLC$fib4| zb1e9eo6;HKV{_LF&Ci7=2a>Tkng;k%tLTWqPdRyX{PsDhj)$0y^*5y~VsuV})8#cQ znFXP`cLml+1(T3!sUi2GQ9|{eWrZu&NBC||b1@NgO~_mgJcq0b#OoLLby}ZZ(g6JG z@~$(q2eV9&vX_U~Rk~amS1Eg@$I+A8+G*;su1|6+3RUWz)q6g@O`?;@AT4n#ehr)z zd;{|M%~FQ5WVP7n3UBvTC!fAxe3U0@ALz)fmT|too_$n;Jb?y$IP@Eu$`^iE*EyYBUsePn7 zDM~M_{%gGW79@V$lvOn=Qj$^jDdT)A1^(c0!XM@2!40Pcmz1p*q6+U~YOzjfcxY{= zT}jzaDvgOP2=moR^SZv69MycThSW$>-w_Va~3v9xcOy2KKL%X_59vY?(BSD_KDh4 zI5`t!tVQT;Y%am$U+m#uzA(*Jed>0@9i;GUe;tmy_nkeQ_&zPu2VcThiEp05{eTB| z;r(J!jFQ<7%3xo7T@tXZasM)LO?0^YfbSXogopcX-{qV!517*GSUQczF&E5l=FC( zG3txl8|ECcF#=nh+a!XVeK;A|} zs)bq@+Irtt#oHV!^}{%IXz-f=&`nY)k7J4p50fORtd~_8EY$k7Y8z!0oS1GH&f}B&%5;|`cOxf)+q0{1XI=?B_SwA=nn_$Vd)>2ie$YRh_sr_M8^*V zTtX8p52aq0?*=k&t5;zB97TA)6f0a{>9yH=0)XJ+J?#h1>0Ty$$I+#( z%Y)g>6g1%_h${tZ%keiAM0gbN)u7<=LZW4!0Mb0RVUefm zm_fMp+ZMbwMbn739X6i#AVc~;7G=mpoJS|Yg%vv#0-Y~j&Rz~G8H*s@=3it;Oin%# zH7xqY6ku&#j;apsLm?(`4U`I_LMab)K2oGQH9XeW)BLDfQu!t@m0#Ci>|RFD1J^{; zK~yECV;K2*uOP?qyI?e?OeUGR_0?FaZeE~F%k6XZO}rId@PK~x8j)D3#%Dv}3-m)~ zWxV?*Ue0Y#jXT_h=jHpQ45@S<{+5z7c}E{ZDX5#UI9ZEp{qUf-0kyooL{jxOy{A0I z5Tlkv6O>0aE_Tog*dND=yeY>H9ZV>sl4ERdySaOa0>7SM*V?U9r*o%JKlgH7W zlj0GFe)PI;&EPJ2UT~N8 z-!-R{?84zeb8B(NVrs3N=Wpv+m4-E|2df+Q1PCb(rI5#I`-byQviH^vCNn)+ z+8(m2c6``JYb{^wrw`d`W!AP3k7$bIRHgU}fR5XQ4`)kQIvbQj;lVYze~QcP%8N#S z_>}(L-li1i5_@V~cGOe*mG^I!oA>dx#DHJVjsiVclcRTmt(1A8reC&n$y|QcA4Z5$ zu56PAzHt#7{ytdFVX4KVvKlsi>Xucd&`4wizCt`3d8n|Qej><+s=rbI=j0x!xWh-6 zeIAU$eL&a!sZ8 z@?9=$VgU^Y3wq1bQ z%eu(v+k?)@f6Mmsi-H*5T zg#QvfVX;(A)@!yy{wE{K$-y96i8;;Uh*vr*PPzf4T>&dycY)5d8hh`d*}7CzF?Z&R zh2)FQzaSROUGuu{O&o@xN}`W89dy1*d=t!a$jA{vbTb-x03zOqM^ZzFTHLy&XA81- z%r{kE7xp79Be5$6wn|St6M@Bn(ex^82Z{YXQ`q@CjvbS_?nIHvnO*qbgHiA-G-;7M z98U4Tp})%X1)Aw$sY)HT^e-b`HgtyA7nu}k@Y$U^&sT$0A@&>9I;2SWTwwxOu>(m~ z43eQi>W#bU+p9~Jy@=omNz;!!!F!%Qefb||a_q6WVgK&r?+@-BnGaN2Nc%3>+^*hS z&?k%FsIy@n>C=x%1h8ION zLz>I|T9ZW+#!5%$g#=28e3D(*BfmuRNItec3_u(mDRRZ1HTX$uDJ#PoYeEGV@2`sz z*(+DqcUc^9H+bcPF7ci_=>l==BzCeD>DTqZCovmX#jf_%g+Z|~aw5Fw3$1-g+!{;T zc?1<p1y$cNpG$W2v8yq3g;R8jzbsNY ze*ifa_FJS0+?S%Y8}qrIT(Y+ZpD(6-4}63@7p6hac<|JXtiAVkc=K+=E+JYLEsL~E zO?hD?6hck#5S?1{A|&8qirG{n_6Ml@m_v>jxsba!JR^cHU}8?DjbTu!`j zhap)Q)Nnqwm>h3R>O58V6Z*Ah7S}X%IX1*)oM!$ezu1gkG`U@xz9~s;ehoi_|GxET zmNV>erny>C%GIv3o|>+OgZq>NnCh9fwII=xjDfMBi~9(rB`w6Mi;fye zKZu9%9LrbA+#4KBeBO`}r)&CSYm-1m)WCs)^o8$_T*GvkhOA&h`L#w06bSU$UMbR( zMpGB^X4uo!-8x}6&M~EhTz}5q?M9@v45y}?U6m~X$!snw2O4E;ZfHck??UZ5N00U? zxfl(>@5w1{>)T+JJ5B0cws@MrVbP6i!EVi9qu7lyNM{4-XmY1K6-@uN z3BQJ<`we_bmbVNf9FQ=~KRsm!3X`dk*|?K%QF;R`H4O6BpDShj-R=eBa~x$qYU)lx zu{nR^^NLDIV`nyo?l|#lxTaE=`&kvm zgOOVOT;Zs3`bL7orBH-%p1t^)+59Dz8DGk;MkYZljW&;wJmPeRZAi*|sfXJEl$}x&K7Q?kLtwrOazXA6GjX~Va;R8 zt$8jY5KkLS^1l(V1v}4@_H6sR`Pxr8Y!q?Y1&qk(!w>uVwW=pi)Aw6SzlH6Qi z!_JE81)j%9t>t+vOKg&Bb_6yXMV~KMoZv49phd%y*rdHIb!6`=4d0iNp*za6OrQ)c z_Pql%jm{&-ONBS1bvj%@MWJmob93tE@n;0X*HKYz!;53sbnMS%8*5&4ujsf7#968H zk9q7!$0wC;^~?k(qZ_KU{a2RGXa?qoj8+bXoe^`~foPLn6oV4t3O~N8f{#NZDa-cN z8#nk>RCR?ya%=5xvH7*vJ03?_2;5)(W~<-!Vcn9&M|E{HgA!u}hSl`^O6JC>)_$Pi zLX%JZI5np0Hb!3{PO*I0Ydn9roW~gRPZ_g*ugj}!{eS)<6P}5aIa4$nex;;tw zao~cOV=OJyxRT5A4)jInK@^z^p1RoPbyY}m`dQwJ0Ox(XAo9{SjuI6OHK_U0<}X?G zs)~GZ7&EfLxS7Xsh`#wV8Ge`9;kAaa>f9&5aKWX|$_~^*0E5?M+JwKFx$GUR!MPb) zfIfGU6}3@af+q4+$DA6y4~pAs%k894qe-mIdv z=*TTksku3ur>s(ZZ#eV$z7t&MGEIVUK$9Y{Hdp8Iit9ZwEvw*-WsE;zsEI{BELP5E z0pqqa`Y5kI5JS%8^;qC@P>s!FNM5||jz;Kpjl;)vfRudk5DrI?J5Uv)^%=p`q_S+< z$G1&0YWNs^*Z839<=O$OfJ8{p&F|xS;jM?T z#>N-9Fspr&=;)5ako(IYY2H#JzUqu?bj)`atf49YA5mNZX6HFboLW#4h)0p0fUf7g zP&-g|^6G5(!P@zX=_yOMGuO1?cM2??IO#3+qPdV52h=}a?qrw@p2%p!x=}*sUb251 z2rd}B#jj8Yea=ZW%lSQuS0#F!~88?6rO zU10`8*Q6L^9bqSmN&ip`T6C6e<<`kXkzxJu)rBdj)+C2+5Fn`5m!4Qj1Gjs=i60XS!`SeiH>PabD@Oql>cKFe(fuDCcHw)rq1cX&ZUF#RR{l<(4>xW3eEUF`w=uePB|c||b{t7akgq6_XLshN z2g)IOiAed->LC%RdSt$--}2MZnk;h&ehd`r`3*`(3JfefW6k6dTRa8n?x)iGuB>2%Gi>{^H;;8Gmvi50Y){nc;P-GJ-Lq3*l29z=uUY{ zmmwgmh%QvU9k5_&Jzlx@xVs+T=>lWh{YFEwN(HG%Tv1r!`L(}=z3^KH7?{{lGZ

  • *5B=?%pm53Eam>3ms&QGSda+|}S*J<6;ps_SW8 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 z%0D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

    Cq~y-p!lb58A!}zKf&;)l^M~ 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'q@ljhAFfLC19%wOpu{TYy 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μa;G$r>mf#sXCSSOY!)u!kX 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

    >_FHt!iVEIxJ= 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�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

  • <7_@w@wW_|i#RpLvbtX~h`#K}%2@cYUfSC&&<3 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 z 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

    !Wu7JBq3ND*L1t7|Ksf@3O4g7u(3V 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 literal 0 HcmV?d00001 diff --git a/docs/manual/images/build_a_mod_3.png b/docs/manual/images/build_a_mod_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9df544997f8573d48931581474fa445602b14a78 GIT binary patch literal 51249 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�+RU&XuOSirBbKJ z{C5BZ{gW4qr&qo*mfX{|Y?YoIyM$p)@|GP>DwR4Jm~anI4`p7ubN6$0R($fNU!Sq? zJ9z$ms$GOu9O-l;+lu@XNswj6E9ssU-ubOsnq2S z)`vx*B~IXm6hI{I zS3UH{aVPxv+tTYhEz^^Cp-1I5f`B_WYk!cm;91(y!KEQb|@ zqji)~CGO#7|4`=FrKJ_Lz2X*?mAc5Ny9VdFV~9|;nR4mc^?ewEoJ>zZHEFwrF}IYp zMhNPG7^f=s=c`J2=f81#@*_E_(b!24%rlC1Nvp!RTg|Pj_*pPHGN2z<(i`IA`{D|4 zW^&XxC~wojx%c~!BWJbJfYt&WA>RtGOEST3u{GUX*I7awal{cv9C5@^ZPNb%30b+d TJtV0;00000NkvXXu0mjfYD=7B literal 0 HcmV?d00001 diff --git a/docs/manual/images/caching_fig1.gif b/docs/manual/images/caching_fig1.gif new file mode 100644 index 0000000000000000000000000000000000000000..456da36f19af4717244ae437963b69bf4788af2b GIT binary patch literal 16515 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 literal 0 HcmV?d00001 diff --git a/docs/manual/images/caching_fig1.png b/docs/manual/images/caching_fig1.png new file mode 100644 index 0000000000000000000000000000000000000000..14794a7137acb39b7b21459653f734bfe0e1284c GIT binary patch literal 13452 zcmYLw1yCG8w>9n(2=2jx1_`G~1$J?FcXxMp*Priy->Wxu zr>16VrfcT*J$>&v-4m{&^c@q81PulT22)l>QVj+M4gdoKn~VbgekGw2vknFZ9!5n$ zL+bq$9UUDH508wDjFO6qj-H;GnVJ4G12;D}7Z1OHfB-KaKP8s}1CPvS5giV}?;_vC zg(c*<#8g?NO*xhAB_$=Lq-7Kp6_wNgnwpyW`ueiUTC&>a%0C_Sfu;&ZKE}o-R#sNO zewka?IM~_SJ2^S|`T4oIyUYHHP_R!^w+dBpOjUL-QuQoV@N4$)4f+vM?;aFq6$Unq zs5XnJaf!^ckFN*(9sndR>BLRz#*XQwZ2|wxd1Uk&XKuL_tXbvl8|GjCD!Mf*d9o?J zwJLiuE_|?qJiCBTyef{J3%8xhuk0%x+$+v~p(n188>h-Auc~X$nkV1-=a7()(6F$` z$jH#pu;8daF|qL>u^9=8i5VFgNq^FU5{v$3W(UOli^y)u`u8t6za}>~x4gVOudt*7 z0;#U9uB&fsYHF^nYsf8zgcpwngO{SKRugNM|JKc>)-7b#&t)_&C)F&*mQ8@5J3&=P zzpJ+*YL9+5oCMZh``6uvG~5I=K1ViPMYKML)t$%HZ6!ABBs3lUZP`w3J&13;ify|O zsMsxQ9?7p8&TE{`ZCNU9nJjKw$f+BzZRxFQ9c*gru5asywvA`EZA7;}XSMI8cbxob zKTGVmP3U?~@4iXxd(IemE@)q^XrC$VSgh$7X=(3n>>R4ju~qrsWYp~d5#>D`XG^X|o~u9fGZm8<@>huP(=$<^cK zwXN~B^Sn?cIaj{lnwq z*uShtINCRn}?VC`@7fI*ZaG>m!Bhyei0V{*Af~h6Qq_qyr)<+N zSG5D-Ej&Wu?(b=E{J)ylRXhqDtbf655p4mzMnC+v;w_ZxCE6re<~hn!H$I}Zm}1b} zmOGfPVac~h;~UBDh9;h~AW~nC`>ekC;POy*qKx;=_}rZ#1dCAodGbAb^EvzRiPJD1 zPN$>59~D0GzxEM{;J-$X!SY{IAOif?QrIE?Ylc9M|605nM6zOz88NVOs%1V%4weUs z0e(QRu$?;m>tfab5qKqC-t?yAo~sNu1&)-u+Lk8KZsT$Q`gaiMwq5FjzI}A0nb=5d zK9Xy$+;^s-8a_d5%n;i#rU?B`px=LB&nKzl*brzPO$^}d7%WAVaWrK02OT;K=(GPD zVRIl{{@heUQD)n+1a(~r$|?Ug6;_=VsHdM@fZ%6o_0zCLFN`z>+(kj?V(~4FxP9q1C$Nap{ z^70#K<|r1!TsC?st@cooXTTB}y}`1ir1Tp}cTq2HP$d?ZR+N>ZuUIST%x)4wi$I?z zp`~8o)gX+P%jsih{J#RRFJIzG@gZ<@4ga9dmCJcJJD&G?IPmf}K-rp7?J~Uv%bgOT zLO3m9Z%wXb-njsOlI>xe*t02fI^yv2oLT}Dw4Z-sT}c4(2$C}v9X~rch8w=vPtDVo zQh?KvnDGW&7=SZ|5J(K&oRys1vXQD-rUXv~SbXy_ewn_3&#n~3cFw1R5yCEx2?Bv| z&kIJ%N*v`i7dM&M(oK+NoguOCq#S>=UA@|6cv9&GmJx_qwZA;?n>$kTLuObbcj?1m zq!uu-p=k*{Wr{h+F0#A5^zKyrB;>gN^Z0IDh&PXgf*MTnRMIMJ4xV2cxhQvE77qR@ z%+NqNA3ftZz>0L4!(rrJWNi-AUGux*YEWv2b)o{DA}C7qU@ObPUHiJJ8V10uRrZto zh3$4{H;CUroAFJnBJIiNraG79<;c6wK={Wld6sTpo8{qLp~;vR&Ja4e@xc~b`QYUR z;hGRSBhlOS8iki#jTfwXePcL(mO}hNb45f0Aj;Y(C69_}n4>D(Fn$+-@#FsiLWd?S zpeNXZgG zu1zD0YgWa}_xWrti!Z@{MTyevOy+Gv<6Nr!wjvE4w2h>Z<_yiJV}6~G4W|ugSo{L6 zRC^~RxO;w6&N!;lKx@7{D}6hdGN=K(5c9IRo7-=G1J$M@v{ol>ojzXgy(%}kaBUG% zQ;_LJcKJ8uPa-%Wb!yIkPG$Vtxamz3k$hO=tdUl)78JlM+*o&FCwf&}aY688Vuqh& zK&(q?uJR8}nqK47;wfF(=h3#qXbg-@6kq|L2T8Nk?(MxQSn;}Z%WNf4ZR&-?7S1zw zkWx-{m#`>qN0rWn<~LleA5gxojXn1@VRVkmAU$t~ZRW;2T%;Z$OZD_gYpJdVe!p$^ zyFXrO9v6)##-^|u->=5(sJ_VeE~c`VHujMEv6rCyc0SDso0KkY&r=xt74=__JnuPN z>t^Qi#FR_5mHqnjZnN@Bl&XORrfK(g?buFBG^M{Cz;+42`l_bA{WuzU_#6JLmnFMH zMTy)v1%)M|%vxXYG9q{dGrvICCIcCZ(U_Es$UZ_QAJ{SN&qUNq(3|7VdLLg}WNu-5 zB6NPe@$oY<89Y|#)Q;ug({RQJ8BrG(6VhLKn5N&k%ssbBo7pwhTxXug1BG5n?G`~T zJo<#BubWkV*fdskg;OJ)nH15Kkg@UX^Dij95fQt)v+#v}?wiy8`~p_C$|^2EMiEc* zVP0!NVJdA+Abs-TKcHy%KB}LnnQOA~XL7~);Y{pqT zX9OBVNmTYP(Obb0J~qf%LeoJrcxHne&F&lV+SY?V?yy63`MxM(QDISbMqr%;6)7{| zyO$^KxdvhR93FJ(e^=@?8#!?FlH%YC&@e;m0zQV=*sm5mb$AI1x=|dSo(iB%8HY49 ztoJ5-{1CJizuo#$+e;~GHk}SGjy@I(?d?R4%-8=QXJ}5})9QaB=x`X8BauP4LP3=F z_3QV{UBMu1QfPXTWhIQ8${D+j&-`~ndmv59?Xk_#a)a^rvG80XCaS~0rK2b;Me(|0 z>O3?SFuE<$@jA49rx(>!+MY)&H0yUU-1ufhX5d1&&uH$*l4o{lDktDL8_yCR;wvIW ztZ~U#83+}-hg4uX?-z?*P0#x?@j0kjn^){u_??JM3 z1)fI~c??eoayK8{pKmszs)teK3gkvrFmx-a#C=jnQYu<*dTT#8EicdgjErA_m>BRB z;kcT}Y-<_VtQ&PTs7&!?4{^vIO^H%TOF4SuYIaUF+=U?~sUz15n__Lpa{*4#f-en)3C0^`$`! z@k@Mo3`GvVScRhPZ;FPZ_4y4RO96#`&dw^(!3ZSH(Pc8z^%s1|lyjKOci>ucBq2nS$7Q>&cJ$64$!gXK z3ey=-6{{uc)|jZZTDr|xabLt+)X$us@1?7*P7=|<(5iNW*U+@fckHoYDxG&bM-ElS z@}(Rb@v!GvvF*v~-i{o5uzR~Z6Co4Va zBAyBxw0VJ45f;214V?A`EjGwhspH)D-FF+q4Hp*ZzvWQ{(t&7fov2v#Ub;i~az~EJ z27FvO-M)OOw&UmpEpMK{zO4`6$W;Hf6b)6{H&Y-oD~Hx`Vte{k!tX64>o39%{dV$- zmFG<|;%%w4c^f_LYl@c45bnw7R5ITb5zr^G!u>Vf@v3uvoal((d#N9*%y$#KiE8jS zEu*`T9xa(g|3T4>bBt~8T1xP<{h@kz1%&N)sH-D;GT7DY69c)jx4BZ3<50>G?A<`< zZ=|UP(_jJ>VUnH=N)tSLiUK@K-zHrL0kMhf*nbg7`Ev=?z1&ajaDMJwB(DKes1_wY zPg&g-%5)k28P4My5lszY5}rB0Y}B)L9+?EJhh*nRYCe0)S}dvWAulbpg|4^GQs0pd z+evGNBGr&0uA-Hr?vFA<`6Tjf!ugS9?n1pelrw_*tBsWR)I%E^k#fG^yG{nh${57| z5sAr)GX*k^&`s!~l$V`Yt=7J%j1_-I!V?y8*(LCqCIZ-h{wE&_<d=7YZnF{0b`Ms>m_?!v*4~PwBvIm(9K+-Z(X%*2wn2f8NfI;}Z$H0UgErNKY7y^P8Wn+Bp7Fx8;5IqD-{_SDxNwT!2MxjU|m>| zto%+0k1o5~ak7Jy?Wfwyj@zq+v{xe6@zw40xR>AR>KmTh`7M3&XFOpE777$^#EJ?6JutPvz1EiANY% zIDa=~L#e(t+rwqG21glIt8V;7yu!+FGb37%%|9e$eT-teY8KNVf@h`)C`(28axrP@n{dsM-MxpRK1Xgk5mF35ujk||BMasl#==GHt4>}aq zSFYx8eQ071GYO^GMyYp1fcX2RQ%9mjR`eady46TyGV>SfrCa+kRI&`FDxNRd*C*%S znE(kBgI-({D5H;z%gq(teF58o8B>a%G@Jg6BT?PDH2v#VolK}^zr}g` z&DYrWjx2VJcp|)0Y>=b*M8LH8_u|R?Ro8WPrHc(dxa<9!>&$QB9cVH0czZq9=A`u* z5PAf(yf4bt#*7czD+&XpY5L*hcnwW+MGa+>Pf+G%!I3ez%DX65`!@q`kxd}jUb zVXwaNET1ibtr~gdH`|W-LVTmYH1N=T>Me$kL;3?#03d=*OFaglwyA0_Y!VK>kx3JE zlYdk&c|B=O2%{HbHw%Y^Lf?D5N9B)9I$v9bP8dJh^sk4OPM0hCiUL#DZ*nDPkG0AP zE26I)k1jZ3v}*S9n% zrzl~Zz*(I%Hv6l?BHJhC#9wBJBdJ_&qkq>Qkv}wHiHZH1b9#K6VYCod3%`jf(On!B zHt9>t?+lro_P|yUPN~!Zf(`#TXPAq}AZNEzj<_kkZ6%M9Zp-t)--tuS@_)#`j+sG ziNcxGeo$IRbP%UgE=?eI8(c>m3>b`YfF{HruozAxSHR}F1(kSs7FPk8U;3}|X+Krz zLB1w?AlsN8S@lJE;XgH9h>(}d=OorXq#C0cemTz}7hZ$au^ra}W`WdNpk-C0o?;mj z$DX<-o@M7qIDA@wZvrTA#xG?cE>bF172qSx)cS_bAxaR4v$h21@E#sFI{y3Uev-_F%- z0T8CX*Sz8}DV1}hIX7P0b%kbM^#|h>{WT8e5Hs&xq2bIw{7yN|QqjDlfKZR+3uSV~ z5~vY!!vhIR^lPCPKm6(J#$v4xcELzCgU2v_gkRpm9_y)hcEeboVCdyFY774>s6$s> zEi^y7-1hWtgqPAT^S0`8dRK=sWAytikr_)#o6<$&*00r)nOsI z>y_C~=!lDh$?ZMQm~Z~4*QbK$I*&tbjh$`0uF|S#^&dAof^Cj-D{g)_B+t6cst zyw}$2@b*;B=DQIsXxpam^kXzlq5m+6dF!Re>TOf>ZD+6TzNhW6!fm;H20Sz}Fx#Lop{a#(0roQ?bq@h)s|D6_Vvf3{bpQWFX*FBqbr2WlFZDU|!|8ckW z)}Ddw{q$q7dIP%h=)GK*$LU_`QPFzVdhos60)uwlI5j_UusitDbn}q8Z?JXL#@dI> zJNT-6{#2a!1EIAs-r2)?(-)_y*|V+N7L2HoxI&jcA45H7!CD@lzK!~IOc}|3Fg^|O zu(6c1O?`2(H)$}}x@YvSFDkuFBi%lRn`v`pc_Cl%ZTRPQA}|4^GX2p#_M~w zV94L?%s&A2l#rs>z!&KGATO-vVs=Q7V9Wr&k5jTA2PN}IAS?cb{jinaeZT*a9DD8r zm67Tv;ZZMl1hye&yAz6Tv)Ce8Dqg0)&?O9b=1eb8!=%$r48zYS1ZqqcHO1@@3ozn! zQj1?5^f^1UX|$t+Y;=d0SXyt3KH}hB$uI%m>{BSs7k-b-t|NT?Tt z;*20XB<^R2%Icy^fQFBh^KJ%L6etXq`Ir>^{pU`%|etHoh00G4cF}Qwisj2|2fHnUYs== zw}SBq7K(?@LM_D{K5CpOD#BfJm8L)yocMhC*!M_S+&qeuaPUwrvZr>d~p)`z(>lr{C-ljdWWXSO88|{xRvBdpEhH z4i75D?3EH1z_3ZS&7rRiIo?&U!Wow2yD^TV4aAp4$0B*-rpfQVJkceg-4Y}j1d1Fp z&G4fF=fj#}0vK9jq(HrCqD%_w&%sZMkC$C%GLoEl+Wq?4_as-)e{%0m+x=CZeVmR^ zi)?XOv9uk4U#WcKdG%WHKYI5g?+Gg8Ar$lP?Z+~?!7p7N&}7DXc*%w+Z4P4X9Mo0CT`Y!i!A zb~7|PSS{%aLQTOl8Un*93DL22-_s$Hn^Ug4W*Q_dxCFd_ui4Niw~q@}r~|DF^}1Jp zIF9;M_o0|_y+6e7p{PI&n3xG}!#06-QZIOnsoRv{p z_^R)5>Xbp^<2;ln)+%)O$fI6LR#a|-epJv)>cAv3k-Vtf`XhQtpqa9cMJ^mSR!O&M zP}L9X8WIf#lVU&n3YD^c8i-_^CczI0;kmeb-Oo7I0+_5-s3ZY5W`fgie@$76Cz^^R z%L&Rz)XKf|PAz0u#p)n4IsiK?#k0XTdjTwU!PXDjXx`7J0r<7(`J~t{B1`xL9l(}? zY@hFK^=LzWShnsDxo#DOX96le8aKE#>1DcHBeTI*ZVMSMpO^aNfbacI2{69z<$t^V z93GHVSyei!yAhVJvG%Ai+jMIEK&S)kXvsp9SUAYD7Kk7MAOwQGA|%^|4IRz|^Ztr{ ze8M+d@6;CnB-FaTrbE)$pIEbX&$MM20NK8+)jQpSc=kQ6ib?@r^&BazaL+d89+v!v z+vPU+)eXzW?Mku+oLL;ma9~}J0PwH7hC=pevyWL3D z@M}jPmMFz3;fFj#mfCXmhednY0(NWegSVaYOSdoL+x|T{;<)XP=X}4+Ur_N)JA2YQ ztAAo1MxcGJs6A*P{}VXvzoWU=C@x6?*cfWMS>y9Q5l{raXR6%}@oa6kBi>hUI1UIv zBSj;M+p=`r&O4j}B<0vBrdcEYMm$e`sVIpLV7!AS^XQk9;7dzKr~iIhi)M#R;^3E< z>wjwWRw&{-uN`hT8ufBi%=W=HxH$IGNEKJpKH!_%Ded$4?)tIr2^905`;oGZ>rxS{ zKsf2`XC4PM5ekOAbNHiPaV3^@sbNXH&dnT3H~?@^A_}Ba%eQOwj-CN-sMOF6s$Bc3 zj|SLt?}B2}roDUQ6D$cj!T$O3#m?ht7&`<|#=Zpvz4+)YjET^Xj_GGIn$&dCj=kWv zlY~6=XJD$EpuPtw4hi$MC9?L#6nl8GZE@R-qAiYRhNmScw^le^*H>0ug~7`u(XKfe zpTz1KY@xm+uMr@nS@yw{8St8gYWnn+veJTSj`a@4VJ<+wo8Ee+=a%Q-n5!o@L4!!L zt|h2{t|K+mD<;R5rIWW#Q&EGjIh62cy)-@`oKB{P6l95K&>)9N1P7It%Or3uDcbX? zcMLj6iosC?(wU(hxj;n)07nrVL1t8V(}pd3gE)3VG_w&^3*wQTic%!Zm&pUb$K3ah zcyGsz!dN#(-%??%Hio^r?eObg zL`ql;J4KS0RWNisRh!FHC-Hc=JyceMDx0OWf6(p_PVaQLJMKg{YWf;0`6Te~hxGLv zp&z>Rq>u1NDMtS*D6%N+d!MO?s05P8(-p999uW>k8zfo4Gs9A%D{Lg=>P&kCdDIjs z(a2HjA_K!0g}zf2PC$D(%A1N(I+24GAOF>Ap~+>E6&~yUARFHaUv+Ug53nrLMl*tt z;7$P!IY1jjeZ0h3k1A0>ZoENktpTHeu*1u=KyCs3+`JXEF>MPvjr_9N83c5QtHU0? zRjK4c&Ceg(NhQ^p4vO$8(&y*sHFQQ0-BK&OIsR?dnQ#l1nQHn_gB4~Cp+Y$bt!gsx zh8#kKm{0D~a@G|TH_NHi z7%iAjKksFtfTrSKjnGu3+XbvPZ(FZ9jDQp9TGCuv`@h@kT3$Ic^>BRJ#A}XMJ{)d6 zZ26&0Ah~$xB+*LZfZ$O znZjz=XnhQ6U#|IctjAbIhv8rKtgsYJj-uI_5_8z-1n}gOj(_b~Y|qH}H{_MS#{s4mnSEHW5Rz5=jwgP`??;E^H zn)ix@rg2sF3m0>u#Wp5{m3IIRhDJNzmgIR)n01wTFV>8 zrC)DeLtw5zEzL3-2Vk+@=An_pXi>Rw?n4(l830%#QumB)i+^c6JJ{b4?R^5k)l-|NMlb z8kcmohzB~%s7$i`p}@0%=bO6GJQmdOa1FFQSXCGv2X3;Bd%YU3+u*IW=UG)sGI)%4U8 z!+;<^0Z{Y*D@Fa~svex_3zlW>b8Bv$_pwPZn*B8*=K$fNjuVd!okAK^BoBKB$lD%lTJMmzyb0dc zP;zxsWurjxNV9OLlaLk(JMT{{Q-#oTgBG4pu8z3}M{a^aq$uu3$EMb2{Kxi7ORWkj zb**wO5aaW?9^KsSpyZ(@t6W|0B%Xha=88;WV*A2)NteeRIj_y)+aoQgK*czu8Ar#3 zoGnkZ8e2_uQpX-!ZH+^WFJ<7_Jc5gObx%L|Dus}0uNwi~pIMde2#w9ne%a}4V)laK zsLye?44^8dR0hGyK~<%D0qkGqdQK^e_LD%ysoMi}vymNFwoO(`wZN-6X}Z}fCPnu< z-!*JfgfLkeJTb-S$iH*HbLV8;Z2ftlr&C~K_fwQFOGSEhi)Q#7fPok&#+#gdX%j97 z>2KKyN8{4!@4fP>Y-S@~>BPfjC^?6&XSTr2?Is+2tkBA+OOmjFKT59Y45PF~YI$SI z0CGen@kimeE)Ut{*%W)+>Di(4JkD!$s}btw9b5x5C6BLM$;!MiAR15A3H!%+4WPc;*q3 zNKbVl-%>S$i|-^2)D3wOZ#FyQDJ$J4Ki!`utZD5wd{#Nl&@>^U$?qSta?2Bi7I|ZA zs$m@U7YAtY1BrkWG=RwL_)xFndd`#tc&;c0?Ykf1(_*W_8kTh46CiQf z(8X81Xu0ZcB=No6MPqQ_DPzbB@pR#R66wHowKxXt#LFG+Y(ZWGQ2iZ*(-h9zl7bk1M;8^l>;k%;L$m1& z8RQMRwtO$k2QUB$JicAIcJdftt|QIGj)>s0X5TYSxhhN(JA7G}GIrcfppOhQfY?Ag z%oa8|<$xnk%~7mk(B0rJ2-r&=F;25KAWVU!Os8dd$C5O7i((5PCq0E-{)kp00 z7R|hux?K4rRlT^c-$BfT!glKFJPEIN<`Upz^Crm(u+}#$XuotJs;@fxZjLyVYwQ8W z2+(W@D0F&{>nTjfQ+!KS!^xb^Z3B;YUPD&?{3vWU$Q9Hxi*F`w3^FuWiWs^M zlseOj3p0m|7iq5RzW%0+UOefVn$(GN@-2X>p%Kia2TFRsk7!F-0lrVMFRV-b)!HmH z!+mnlDh>bx&gPL{)j zEUU0+7TjiSDU-T*j$|T|zUC0HMEHPZpMHuh%*~obHtPAdnX)X~UB!g3`uG9|ZLhMr zN|>!t2P9k1k3uV|hW9&Y zzGqkCyLXmtmsKyzkRH)M7nQs@WT4a|*w+96%lw-=`S`3(8eCf^AkKpbhTa-xWeG)r zDyf)g8??fbv1f_jBb*L~dHNSR==s(6DW!)3sRj=#=n9Ku$QBcn1H_DRp5Hm2|IzX( zatzt>WI3g6jF;a8JM@DGjstC|JUGEq25*>bGvFwP7jc z*AI}tF8w9Jp|>LGGoP`sF)_Ocml_OFX#BXh6S~ehI(=Bw2*FBjtE#tw_@Y-7hg+C^ zg=bcgyRX^MzBnDW;I7wf_6w&@OHk?rAp2+iue0y+I%OnK%$ucwECjZJ^gtCd{La?e z<R?v}``+1U{1tt;KlgHWg?sAa7tzjK@d(9@ zl$H!;KhyYtq=B*qj9gO_9yF{jb|@ z^Jh|)TtnXcyJNaFJT(lhd3vJTW>(d5C;-`FF}D+u5Uvuw9#nzRP$M_JXzg%^d4I(>(HmmU z4Kn2}rT3Y%fP%BVRt zbgjR-8~wSY!P@j68qz+awyl-X5V6EPKm3U3MQhWvC~{Aj^}1EEV8Lv9(q8PSOvh+q zqd8RkB+r{i3|38-Z95usW@cF^i$6t5`~=y2m$mI=7?zH5$ynGrL2?iwZjkyv&RR`TTywTf=?kI8&_YK0l$5E!JZ;~q{?5DO2BEZQKWK0nB`ioMp zkdmc#%*&H|w#XFTFQk7JDGv+6zzs^U|Kl(}mwYPsK2}a*Yq{620KNHHrmzW$mmKyc z-bLc+)$$7W9RYY|W8g$;pSbT2x;gQikb&SJDJzPh(7T!!<6vKijDG%Bjc1x~yIa0m*;~U_V^dPhG!}YPQENp?Je#bpW7&IX5FPXN{mHRsv7*BnH5mvjo5T-D ze6AA|xoZ%7mB+bJi*GYi6nPa{I~wx#g=S^ZH_lk0SD6w-rjLsQN0O2T{g`tqD)brx zGyA6Ax^=J%-bUp8d`F+mM6=rGwYoFuJVdm?EXf2BXsPTv&0rQ{gXUhNP7^VRZ8r3M zJ#sQE!4yDY5{E@<%_lS(JkI#VBb5yPQ)7ZeyM+RqaPt-_Tf z{O0ie*697x=KQ?b{Ik{kqs;u1!~B%N_M^%6!`=MM;{2%3{F%r6tkL|P$^4GM{C>Fn zb*$}MhPafu<;URtioX1Vy8Lvf^>C87Sd`m>w)B&` z>!ZNq)Z_Gau=Rtp>xHr9nZD_(!P=IkwI4K0ezEO?l&CZ|IW$30pTOs)z}~aL(!I*r z=IH8Ur}>_^*Q>qKt-Q^%zRJ47%e}zF#Ky^=prB`{_MN)iq`K6$y~dT7ns~49oW10u zz1xhm8rdk+D?d|dO>+bPRQdmAfLc7J$x462Tx7Ks6^Ho(=q(8J8um9^T0 ztlN;S(RX-wqr~fLr08pitb~o1hlhw|inJytC`o6ET$1l7^6-yVdexrSxNCWV_h;o5c0X&eDmg&c)Q` z*4*Q@$>GS--nPl#%GKiA9x}IuduMBr>c^^ z^UvY-004_=ZE;;-WdHyG`1tn=3k!>ji~s-s6ciNm^Yh5Z$1^iChK7dY4qoX=HI>W@oL_|b~h=};kRp|f#DUnG;K~#8N?AFPu!!QhmVZHy0%Ffi`&bu22 zA&j8JkQ7S&e_*0RL|2En(lY=600000U~D7+#RA0w#R4c6DAsEO0HDvS5L&eD*>gL_ zv%j~=_r}YbFP^&rRcUNi+k5(h_{p)cJUtuF)hWTV4>780wbvVpWhIC??!{uoITkCP z?oh1aSh31Tu?*rhrG@Mi%l7uaSn&$&1+=J#EqQkJf3IrCbKSb_GI}YlQt+f%`O;I!V9b83u})2D-eD+Bva9)o zl0nAbKh3A{O5cNrwFtmz;NnPJ2jU$zNb^1)rl8+v`_o_Q@9!Z+%E2xfs{jnbK(q+j z`2QbSEC@HYn_v`z5(+6D3O>-6;glPKtS*+F#lk-&;Fvnw9MYFuxH0O0D>?8MLPrD|A>Im$plsxM-vwYhxg9#leX!{D7;cE z1LuA`D^`y6a21v^%_XU{$N+$#XA(~Y6Kdl22z1y<`%*T?Dtt9!bP)t;w&y1?q5F0i_% z3#=}%x~B^)K`~OiCf8hm>&C(wC zhtRCf5u1%78y)-hcfR{#yF`ZP&}_0GYXg)uNpjn|z|t$9C?Y*pO3t9mEi3Hx()V6| z$u(p-_ws_!EKX49m?SHzs%fvh{QVz{4VliHr4Ss7-w46o<(4RCbTqF`?3Tj4C(i0* zEah;Gx+P8Z`4s8Wxc}AHUjL!uvWe$QR2CN6ATcPRiXxNUm;Gl$%XYpBP@uFC zq(D<+EH*`vCdMZ{SAHaPI%APSH-p7FPf3bTRb@>M1Oma3XX?sZKYr~eulVGC=Q-$P zfob$Uixp%*M5WXt^G*j5*-wA=_M3`4jL6R6h~i$_`YCOSs;IK81p?Dvzvt@ATeI)X zb$BThjQfz1WMXmkT}8$dcQqV|#-j1W{Lde~{zf3_9x|VcMhB!AO{oe|s1Kn{rP7gD zCX-0~;+t>3`pcx$ZxYUfsQQq$VUWA5Av9IG?Du3BSZwh`qEan)=-P~61Qm>+!nmMX z*dyol21ARU?95UwpV&?8?pA8GXCA%wtB^*;@C=CoUINu+bXTnQsR%6?3@xu*or&b) z35smDcHuw2e)~5R*_h3ArWzfgv9vix8Qx_%;Pr+=i`gr0G&Tmzqw>juG(;LSxm>Ho zUY}WtX7Vg+K$W3btrl*SJ8aRw!zzWwBHMj*@%{L%0A!Zf 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%0ASk! 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 literal 0 HcmV?d00001 diff --git a/docs/manual/images/feather.gif b/docs/manual/images/feather.gif new file mode 100644 index 0000000000000000000000000000000000000000..0090a4b0aedaea9855931f42bbe5ff95bec79896 GIT binary patch literal 3656 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 B=aT>c literal 0 HcmV?d00001 diff --git a/docs/manual/images/filter_arch.png b/docs/manual/images/filter_arch.png new file mode 100644 index 0000000000000000000000000000000000000000..fb4a82365bfab6bde5c89939e39c0a04741e99a4 GIT binary patch literal 2411 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 LYj0V6#xvr-^{D== literal 0 HcmV?d00001 diff --git a/docs/manual/images/home.gif b/docs/manual/images/home.gif new file mode 100644 index 0000000000000000000000000000000000000000..11299c1cb7ef6aed8ee4b159d733668de8662f22 GIT binary patch literal 1465 zcmW+#YfO^|6g_P}`hb?UfCU7!Ag=*RMW7WJEwIjlKme;k1}ab&2*DvZXLNHgz%i{n z3mR9Y7$rv8M5m%)l>+jRM?iElgAB@Rn)yW3VbpIQyFYGjZf@>9=j7ZC(Vxqt=^BXf zHG1$6}$N0HhEs1{h#YOn?T0#13OAoUz{88vFO7xf%Wan41F$ zvoRaJcqhiP)8UXvpx2|Nh3elp3tt)yQYqY^Tv(twRYGu5QmA5745xS7sN%vC{1a{s z7U)dSd_*{cTCosH56Iys5@GFHjE+L-f=rMsSmeS?r&Ew%e{enws>#Z~@)j zumIC+#{2h}RD+u0!rk4PIpKyfk1GCY3{@(^k);q8h6kaEb>Y6L*u-j1;`ym>=OC^CNoG6R#aAIEolu&@SI z9v=Ac0S6cyBTka2p5bF0qQfx|3Q>mmvzd7On8E;ZIamZp0a$d3K3w4Ja8uv?CFWrRB8irk+8diujrupK}iE_ zY@kvhGZRJ}+=V#;%wyR63m&$$;pIylg_y*4CvaEMkpMQILV`&FXyJUUgqK*1&`|8& z4XqX(9n`I0u?U_}PU8DO0!mMa1r!Co4}v79^72Aj8b}g!8YPH*Ff8;iKSh|WEf&(C z(cr`h*z&0TZGP~y0-Xco!zw2SazD(^L+%c_8{QP_{DWRay zqPC5P#YK=6AWJE`zSS(Lp2g!qr^CgI6n&x)1_HGAQ2eI7g!#{eSo^<)vRxus?#vc2+eTOvP+lpVZ!Fb7Xp_TZ}$yX4uG^@QEFF zco~b74x4EGT=SW}8s3B1FGN3@i@v=QY0yXi))o{zZvQb?bb3v{QCcKkn~PbjM$u?x|e0@l@=M028tTa{kh%sHFXdxbw5B@+uRf zLbgScD_L2eJ`owZ!g&4K)ATZpTy*VOfl1RSOX@8c7WAxXt?}J{%h}pGk+o6ia{QUz z;^6y7nz0oz_8e)L;bSmo>+=n!&C`_5K9cINoz>#L+btv3(IVtA4pZXeP z!q8hnq9bs->OPIf>C3PZn3}Kuk?}wmQR!vN-Fw$7z)jpE3HFC5=U#FK7LE*K1o zO^7<`VCbX0(zD%WI->b{S@oSgbeEk)Nfv8ob&B(6+z{}>FmH*;fy6SGG!wlpY{R&? zn0xbPdusfD_sLtamKk^=)G&cCj?2j;s*`)?b& z3j5o;9{pY@vT_cz6siQD5uWQ6`Y7wC>hU2@#@F|Lu;Oss%J__+(+aVruBm;cH#rjB L;Md}uqCn_>{mJyz literal 0 HcmV?d00001 diff --git a/docs/manual/images/index.gif b/docs/manual/images/index.gif new file mode 100644 index 0000000000000000000000000000000000000000..741c8939d77d2423d67beaaef8fe78aed13a94bb GIT binary patch literal 1540 zcma)5X;V`N6g^2EAqfEj3FHAmLln@6kxfB?HbDhZNdqfbC>Xlu)u%~i4fxr zzJ!Ylva@mP7Gz+zw_{`kMmA>_j_13=(h?F02v~kb=lD2<&y`h?98{sgmB3Y7|P-oTat3#t{+%}_+4$c(KApcmUwEFv-z zQkXL`K&NAD41LL%jpJryk+4|17MCw$Vge?%6%BNmEzZkPk^&wNT69%Zpr?mYaBGFx z2vR77uP>64s45aIBGWK5aSpx$Fc>H=$Fpa6{~i-r;BesXj$ONOAr>|uii*(O3=V;B zkzlgJbM#NBV6>%t*;#=sg?S1Xr!ZkcwKbR;r2Po9pC4}Apa6m=PeAfOa$!ON1AG$j zh6_Pp>QtnrqP`vf&K< z549Tm_oKBHeSMS{HZ?gXC;0n=57HGjc5obzg$HCZNX#%0V4HA7EJjceR;|MJ?a*pr zGEpUL#Eu9-{A4CRBah34rzb)~ariJ2p*5Q+h3BJaS2<8dY$GCY-~e<`mz1EY3jO^k zo)4KA%dtsDf&-efGxow99Ss==$;og-*v*@e5pX8JWMan->TKjp;NwTQ2~o8HCKZGb zSX)z@m74b=E)Fd%P{QvCHZy>6NCiy9$taeK5V8SezeUz8IGcF?-Sq!XUSE)3enHNf z1dSzHqB~u$VezHw^t#eUP4gzxutT0fms>j#+^N5MwsCda9aW;A_roSDIF{W-%W4<< zDe9IJ^V^)Fg%gf#8e7NfD){dmk4$i9+ z3Wpe@J|?#JZ;wr)%O>B3Wy1S4sR1nw$0VqiSa>Ith1sm_{3G2ep^>%Z_c_s9RVi!S zmW3Od3te~hF8^LNW7peLq~NGjR8P){yYT3AUrX8U684qS#d-3=r}mfb77*g~{xdST zq0#5G-!BvwPHC{gXqFHg@^6gU`rXBJ9o@8Pk$e;;{PdNFnVP8OfEo>nO1 z7mXPa z8}g=~3>^KF=R+TS?B~`#ta05FyyLE~Qmb1L%RCyJIDg4-`hx}DK{Q5a-=1j&PDfGN zb=%1CzwbBKK5gk7a(b1((%M*>HcMj|M(wyqZj|MUAev?HAi+p?Ve5Gc-)*d>$N*LF OiPzOh=dG1;1pN#BQV7)m literal 0 HcmV?d00001 diff --git a/docs/manual/images/left.gif b/docs/manual/images/left.gif new file mode 100644 index 0000000000000000000000000000000000000000..2be39310bd7cd10303d3d13480de0662c0aa43d7 GIT binary patch literal 60 zcmZ?wbhEHb1}5R2{>%mJcjSDEc1fjjSMA^1 J;Kj&b4FJr158VI& literal 0 HcmV?d00001 diff --git a/docs/manual/images/mod_filter_new.gif b/docs/manual/images/mod_filter_new.gif new file mode 100644 index 0000000000000000000000000000000000000000..15660785cda020b5044d0ebc6b0ed01b1b54e4a3 GIT binary patch literal 2392 zcmV-e38(f)Nk%v~VW$C00e}Di|Ns90001li0001|0ZRb@0{(=LsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~SJ?hD8AOxN~}=lag~{tpZahs2`sh)gP%%%<}RjY_A~s`ZM^YPa03 z_X`e-$K-YS={|^`_I7nD%c!-#&xX9S(_y`#(Ir$M_ zc^Qy_nR#%zU`ZLu#i^MoMDE8?(9zQ45d@YKqy}>xrs+dn}Wx z{J8)F`A$!c+Kz8BE)Rb{ zFRegbzkCEW_#(zESSN+W5Dr7Q?^nTz6f0W1h%uwa{*4?vdi)47q{xvZOPV~1GNsCu zPu8(~S;8gEnUy5cyh*|#&Yd-7^8C4rA<&@~j1fHw3#rnjOq)7=3U!9hs6VGt-D&lz z)~#H-di|O)E7+7`$DS-}Hm%yVY}>kBgZ6F5xNsUu*Et7dxzHzy4lgu?ZYgXb}>Sr~fli4Z#5;Y9fej!(3-O@D`*rS8c zW^uc=kApgEnlq^TOs;w>=;mH>yyS3zEsUR*&72%3heo;e4o0ea!+_7%^0p~)I<|fE zep$~>JUE!;|NL1WXwP4_cc;dwU(fwqet78q>pcSupDeuK(DAHo_-<*WK?6tHFs8n={GWjwTIxWN|%ifFX)cB8khC6jYhxl}_4V;{;sd zs2rA!X&ImsP$sgbDnx`SpA>B#GA9UiZVAerw6v69pML(?fu4b?Nu~;d7G8hnt8i6w{ z#`z+Q5N$`Qq_ehK>wwN&!=a36PPqPQ6r=v(DzYl#3SocH{^qNuBsDu?bkH*C;+C3DoVJpyZtKJXv>YNJMDYh z`d6XC*#i4(5*%t0{;t@qhx1z8t;bH!b@aMITWYY=wn7Z9u9?V4 z-PE*>+jP`aQ_SjuVuyWWvaPKwuRYp5 zf90`@F*|Kl0o6UL=r2`@g@@ z1@C@tVjt8Dh$jLz34Nu@T4ogJ93H_>VhFU$=X`{}1h(mT0Aw4kjuXM4D9{@D>tNo1 z#;cm84sPIbTfkDdF7>5teqHilt^~9=>CjALiIY!wh$BN2RZt^4>qie~H!~EbEOkM& z-twN9Ao}5Mhe%Xe{x>R@jS=3*3Pp@rd6KrnDb6bn&SOUx!Kg7b8u5sM107tTGqQh0 zuXb8Pd$T<7?%$<1KOlUogJCnn*Ek#dTYY{;~TKC{QYfS%7&mODt}3MfGS z9dM9;#GE_+6iUo`9Xm|45>p&+0Zn_)Pbn$6+i8{(225cjABHT+CF6`evm7GD>bR-it5vdesEu< zu;Cb0NXJkK=#EQ0>PG=uFpR2Gf1^Vg-F~>R7GWo=2s>j?O*qY;(vfL8^qUn=H`SE( z?1W@Z=RJ`|GMTw3V}jkQSOxmmHvY_WgAF4VGdfUZ%`=$TTP)(#m{+K-lp~z`Dh+B{ zS=#wbv?hfW0_aaU=&_9)k`IXvxffy&wF-q4E}tK4r*o7juOu5Cx`Y0qTRT$S3U zrT&aAT`gPJ3))A$4}W_in8 z?y{E)VdXD}Rm`LzvzgC~<}{Nb%xZpKo6W%HH_Lg>bY60t>x?}-W8uzkUX-5WdH!5j z(DTnex|}KuO=wz7@RuGMxEK{IxiZ~mcDfI9KC6sW%|pbrWl_; zQ))iRIn{nSbzWS3RWHMukzAfNWUp*%+DiE@^9`A&JxpcA^xCMWwUexKTVoR7F08g^iQMcJl{c>|^x#nGq zxtXP+)gGGVdAkRP=jC^~zm4v6Bin}!+iQMb6kL)u@7QjL_g5Sq>tMG5;tzkLnJIqL zDMK9NX`!~7IIb3tBM0P=xwFWFeRA8R9M>y9aLbwf^3KFu)-!KT&Bzy5KZ)?Vp~juPP$Z>=k%yced<)Ny4A0a^{i`s>s;@;*S`+-u#0`{ KWUoL00028IDacU( literal 0 HcmV?d00001 diff --git a/docs/manual/images/mod_filter_new.png b/docs/manual/images/mod_filter_new.png new file mode 100644 index 0000000000000000000000000000000000000000..1304e9722247ea1b0e9a21f547f18a104630b0ef GIT binary patch literal 1052 zcmV+%1mpXOP)sVL7c9x(zXDbyi}s^XLwP*p63 zJnYrW@?*msd1Lc3xj?G6@>Fkulr$%5NtB79iJ^&M%$&cG0e+2JK)yVRtvq!~zhqkvPzxa?})|zOmnWPO;R-dZ0dH4EzmFS}O zW>Ig|UV=x{mW&?6Y-&eQ>;R#7DC^sKMe&|C6+cl<_eRjQC^mErrPv{fVpq6d$}%B^ zV(R7)C{`i()pw0VWqu@3<08_Xk~fn4YE1kzsS>4AQ%f?9Vlc(8iZ5_Vy+#NURUl9` zQE@*9AQgI|;JudUUY-!%D+-nW75A&z&nXZ3NXlOJ1Z7`uG?OZHaH?M3bdM&fZ)N$_ zIlZVM=djs(@5`3h&$f|s*kmvLtR*(GBAs%hYt&@bKDBwtu)V7OBefTY?$?OgpFwdu zi7MOf@##54>D)@2beHY=n=SYFtP5rU>v^%Wx8Z?%SyqknNU6&%rAy%ME2rC4#^;obb}t&AI7<56@|em5`qX$%Dd~6S<2mJeD=ojGIi&Sb zoB~a4<2ePQqB+HA4o0`Ry5v`nxW%Q_}=ux-G^K+pzE0O7KOmB0KVn~}f%&ceTWfMaaLlZ+2!+BDN zH}zjFNcDp-Hhjm^6$XvoIF<<@DmQvAK~y+;b{YVbiC)|VsHX|5bgM-x2Z&&hv`lp? zwtlBgJ&vu{wW;+fzd`@BTiR4L9vN+_G4+dCfuFi@8r4#tyAWlKC?84$G^(#Rw8~qq zpSe&6(gUbJyx93^XWJOn;8dlyJzR%{|is| z^mB+)w3|Y_m9z{%%Qm#kM$4kKj7_T!#7ab~dbA2ltmd@Nf!3uEJ0fEDWz3kdCD}ji W!ll^+iR>T%0000NW9Eg*X;|pF91;k2JlpimWQ@<;th>OeWv3N!Vz>HN?z!K^-tQU()B?t0g5J$l)lEbSO z1rbCr@P4k1td+pe6p)pk7BNww$g5MaT$Lb>sYIP&6)N{)aV7QKr@lLFswPl~`_y(b z^+KEo8hQ`CSM8rhVE>I8cs_^5%P&Z zoSZs^)3Z5>CRG+W;6g!_LW}~zGU`;cSV6@j1?W;G4E!I|DVlh_n-bvP6Bq?R&d7Hr zFi~?~bt&=pQJ3up9#I8YL=h)KMsk8E3}WFMspJYbq)s;lK306Vg{m`7U_(KPg1m1s z5>2HJhwpSTPmsDsR=%o*RGdL|GQ?k^;`J0b=W~a9RC4c|jE_ABi@%zR7gXpb@N(rJ zZ+_f1z8+PUF{kDzdEqWqHyOmYQ*{|r;-&i22wp}BR#BxniWo?riikL(P^6v;#rIHu z9=h}UrS!`tB@xYcb;VBP4ec~<6E-0vD)$v)xvzXfjppkV^|BR#`4nLlMd(q)(I~uVtsvV=oJCS{s_N*Uh z4OOGIhlzzzntA}bf^Qv$51w0=+pex zt4t}Ci~5vGxhPJe8eglO)s~C&+F5P6NV75p@G?p;q{i(mD;HIY7f?;PNR8^3ixj9) z<7XMAu@jk7E?U3Cw=<@!P34N(DW@uBhu`ZHs8BA_9i!UWtS;~qQxez4uh8(0x;b z65oGUflBDks{%C$w(x9f{E>b-l`)t+or)t$rc(?c(B+rI<#jS8^~yd|aRmhxDvznG zLkS`n#KD1BScQsblpw}$1wD>vP{E&5(4-=kQ{BIc=#`R_)&iv^?&g7mofT_GyNr}{z6)Rd!WDR(cjAHZ%}uz?bbO=&_5#4KloXH koMm+Zql_}jD5H$}2N~4mj`8J&=Kufz07*qoM6N<$f?7Xb8UO$Q literal 0 HcmV?d00001 diff --git a/docs/manual/images/mod_filter_old.gif b/docs/manual/images/mod_filter_old.gif new file mode 100644 index 0000000000000000000000000000000000000000..d9a9ede2806ba0f3c9f9a04a94f10fb1d926a4a5 GIT binary patch literal 1230 zcmV;<1Tp(ZNk%v~VW0pu0e}Di|Ns90001li0001>05$;t0{(=LsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~SJ?hD8AOxN~}=lag~{tpTWhk*>Sco;5(KpoPUcp9W4YExsaWD#3W z_o`JKAzy%186_soXto**fs!`+)>Biw`Mj+$QO4wMaQ_5Hdgqzh?qF3 z=m;oiD7G0%c`<0IDJe?o*?Ia@_KE7oMD~`~=BgJP>c*O@yUW|_`wJW_JWO0{e2ko| zyv%&H+T8OD?esbgHfs%pogE#^-M#(2BQ0KTevY0Vq|QUm&f@+qKTlu39B)s8pI^oA z{|_)At9=4D5G+^;p~8g>8}@T(;vmEb5+_=`h;d%U{*0VBe%R=I}`a=nbJVh}JL)18GMUN?kNHb>bjolqyve*hY2B zcPZ3CdnOo;h`0e@IbtD^Ei9KzVpK)WNKUv5?PkHA^nS+hxP<5>-Yh5K>H1)5eO-Oc zKHT@JZrfCuWk(zE%45?Ayn5Uy6Nl`1I=soL>(=J^l9n`}=3dA0OBaNML~h8Wfy!ycO46ZVMvU zAY{^omLP5q0ym*92YL}9bRJ4}*K1XJDa*-t=FhiprBF zI*p$5=%SKN8cd|+SSk*tly1uDoAqhR4XB-tO6oYDo?2=;hpx&hiE{24D4lnH0_UI< z&U##yvEm7=%t+ZpVu5Tbjly%taW(VPt{7;(QKkDPI()>0xW9j&fxpiHR3mvX8y z&)h=H(AeAz&NT1LvvM!Hr*qFj4_zw9TBYCWNqKR#A!ep>i{=JdPPZ{Ak;~xHk4Tk^fKo3)sJ+ s1aNNuW6A)%azN!Iuo$I_O4jT#H7rzZA}v#z1uuxf3~F$LoGJhSI|SltGXMYp literal 0 HcmV?d00001 diff --git a/docs/manual/images/mod_filter_old.png b/docs/manual/images/mod_filter_old.png new file mode 100644 index 0000000000000000000000000000000000000000..56c02d834e98d36d4321e9fca13e13f57ce56de3 GIT binary patch literal 738 zcmeAS@N?(olHy`uVBq!ia0vp^3m6y}%@~=1tUI3EEkKGT-O<;Pfnj4m_n$;oAYUQb zBgmJ5p-PQ`p#doW3n~bp9zgaRPZ!6Kh{JDZ?9Dr5AaML`jftezBcoCWm8k;N=51YVoXhN- z+wB;V+1ofmm-1g?KgsZ(QHwcwSL&kD29vUyiA;ISnmZZi*WLJMJ$?6N(Ux<^uLvy6 zd#vOd+fo(vq{61eRU#e1p)Fns2f^&s!wVdbQ7*I`21M z+rqTg;`;}^1S>VazDfJKUTa;DzQ^2WmtztboyxjaIey8mmf3Tg@BAH?dTXgSSJK|F z@W>qVYmR)|DffG)mSreA9hghx<)(P<5p67Ax1 zPUY;fVWKTxGM3m!ubFev`4XGPmcM0xZ%N)Sny_Q-u9rRe6*uC8c9d0Ebfi^f{&4x8 zl323j-|wqhGM0BNg}W24ZSEG}k(EgKP}-o+S93JM=s+g3n#7E*giD8BuKjg;qBhHh zln0NPP7CPW2)boH-*Khyl46r)U?Na0ag8Ve8kTC6T$Bo=7>o=IO>_+mb&U)|49%?! z46F={wG9k`j7M(Q#Zffm=BH$)Rf04a>Vl9-h@r8Sfr*u=IYh(5(??Z+8W=oX{an^L HB{Ts5*Fh(i literal 0 HcmV?d00001 diff --git a/docs/manual/images/mod_rewrite_fig1.gif b/docs/manual/images/mod_rewrite_fig1.gif new file mode 100644 index 0000000000000000000000000000000000000000..664ac1e7bb7a186d2c6157878cdadd5bfb7d3466 GIT binary patch literal 3525 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 literal 0 HcmV?d00001 diff --git a/docs/manual/images/mod_rewrite_fig1.png b/docs/manual/images/mod_rewrite_fig1.png new file mode 100644 index 0000000000000000000000000000000000000000..f012e81ffd999a990ec854012a790b3c118ba8e5 GIT binary patch literal 1700 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 P=u3b4)UW=R3jhE+CPVN4 literal 0 HcmV?d00001 diff --git a/docs/manual/images/mod_rewrite_fig2.png b/docs/manual/images/mod_rewrite_fig2.png new file mode 100644 index 0000000000000000000000000000000000000000..6ee23b009a0fe835491deb44f5d33b21cc4e136e GIT binary patch literal 1381 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 literal 0 HcmV?d00001 diff --git a/docs/manual/images/rewrite_backreferences.png b/docs/manual/images/rewrite_backreferences.png new file mode 100644 index 0000000000000000000000000000000000000000..49e2476f054ff2d32becf369e99126d800c72788 GIT binary patch literal 37163 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

    wB*H4o1-Ohgw;7t+{*$*!v!tXm{FjZ6(_J ztVSZ|Gaofg?3)%xT5HN%oL|aMc|sCr)?_)E&bTVccgu2GpNC-HJ^>jWm$#Q;h_&>X zCk#B&DFMmuEW493o%^Af2^@sn+K2=qPc8aj131hf%d#86Q*9%ibqNzmAw?VvJ;r7! zzP4f*>a`^5K2xDr2r1679)--hvP&n3N0yhZ(|{>8%yI_J)tI;QCsJ0l#UFr*EkO(w zL#Kt<4pfdZ1j3kxuykkjmv5b4&~YB{%lSf`de;y(yFgo6I^oygn=^g2SIZ15szmfp zSK2^w8_&d6hEsnL2lE1I;MJE5{Aa>h5y!U!R(%hcgUPqIAEY1bU?DeU>Bf!Q`QNe} zGZ}unQ@YU`lQ>&TEgLfDWW*u%a24=vHVL@jN&oS$7_qJBYuF~{Rm<&KCh!Q_$#8yB zRyTPX*bT3-?B|BMh#Ii{@M2?zr#L^IdHDFj*3BTvo%$5~d8+)8!P{E)>Z9IGu@Be% zy2ZscGxtm#)mhg(cH(puM4!`6+g4PPVjcFQTf|L0FwO(k6v1x{Cu4ql{`O#@wyCD& zWaROny(*wv$Io|*>ESC&A44AQLEiJ%W_sJo{PJwRwU5L}`XqzCZ+)G8jl6>ud}@W% z9nZ}T{wCW;R`p+&vA-jH8Li=<-$$t_QZGTfXcHJ1*w18n8b}#mb#8+@eaxlB{nP*X zsX+KU_;3Jv^5RjP-lL#5*47utBaS5k1k(1$r}^X@j|tjO*3WC`a&5A-3v!&H%t^m_ zx<%Xh95ySqAA8Qp3j=HF?`Q)4eo(PXWp@lOI z&RX>dsb3lXFS7lQ3P@uj=0$sK2{zOhC~Fc^Dds)D%W?|%rw6Z(ud3^G8YdXZgRl&XXRKSe=uBLfuE_@%FGa^534|o=4I9l z8AZaSektB~(tN_RH=-%GfuF?i8TnlAjzB9yrV*iaKlA?iWtBM3kgI#x+zzgdn4asp zK&bReI>EH({J8FjbsMWonvN%b>NbyV;uftcrC1L0FPYT?A)8`(lAX?2gLyFwr)Cy6 z8CD-K>E@Q5n^e)tf*Tw`a4x8L@=&f8>{U3C2wY7ufp)^KCQe{ue%KNDiP!h1J&e2q zNT(jsa&(|63HP;zwFZ;hC{CkFezNmMtD zjF67bR@HZgwdhCO*M{ucSvZ-h;ZbnG)X|cOQP0*#{-5BFcJT>$YhDr!S*of^Cwr1Y1A6b4Fs;pfQwF~v{?!Ts?KSBo&LUr5 z1ZU5<7SyvS8zb$Y0VYai{oN};JlBIG2nIJ}3Ux2B?+D9z2HcUSE+tPR!BR^afUFyx zj%&z5x{Z|IK@4_S!tHPwK_xsNmBFP$A0X~IF(&F-bn7dslAXQljBZT?(-=)as!IY6 zvn=@y5of&pBCj5D6e_7+(m|Z5{N0oRYbe`p!`qT{GK|f1yLD}sXM|mFi5&$qw`FNK z%jdh!`*=wYnOV>!p*{Gfw4r^rDMF6gvHrm&Xqi2n>PEXl8Z2g>%gM7c4xE>rgx+LF zJ&%E#JzCAMA^A%6^J1-rFlTx;1+> z^qN0QPMgE@&M}JU)JRr46eJ_OsjEAja5XRKmhus2y=Wgx?v6vlC>PvNQfY7-rdPk& z^islZL4|UY^$_8j!x(dal(s#Z_ARN+)V$zMXfE+H@Hz*rmu7R{$yw(A{=U3xPb5T{ zdb8nvj{f$kIV7&;ykb}kxVsry=QYVdt`%*!Wk{1k&?-OjO}tIf7(L_BFF4PP9YBZ= z4eh}0{o5`=R*}EMubF@07aqZKFo^5s^Z}-itVpHY6Ve&|CS5Gj;wOVO9x-T>5hN{qh zmDTK(h&`$edb(2Df-*O9KkgSrr zTUd!w^}~4s=hXbsxkkiNYu48l_iiBO%B79Z`dx1%1 z?;jbNng9_$yAawjt#sgt{Z3u{zDmeY$jT{gDLYpJZK814WsRfm$KRS>d{B*A%f)TB zc10hiD}FY$ME;Jd5bD8O@j$$WG+%(`Rt$uG77-Sb#GG+F=dE9Sd_SQ+370c~A0M{k6!q}1KiP7>qO<^n?0 zvN|Md!5VEhe*peGfD#0oG(qWf87VsSb5C2v*Uan*VRz&SruqHMbExnf!a@&9-ldw; zszCrDZ(7o3#x_Q*yA0+x-Q6_`!>UDF#NIGEyPHzckB`Q8*G!u>uRYxCGO3l8RNI?R zNzZX#H=FM&&mE06)_ub`Pt)JdiJO1`)*7wGFoQ({5r*ERKe#+2p*Je)t$nbl>l>Dt zlcjuoG_Hj?c+ea7naib()lt3#+d-9$>$GsJ&Fs;)(7sos9la?UzO+SMPwt5H>Xc*G zl{#W!_aC&)4qi&0@f2KY+7Ws|hd;&#%UDhOMP*RwUdsIm$_j`6Y_p!zw&8Fjyvxje zd?)O)6e1Rijy>LSUIq-rxU_Y@HS)|Up(Gp!pl10|)b8*czqh_Vt+51%y{b&5f6D#{ z_C`SNLuP-af?Pksoo(((bUPH8+PMCGywLYsJ4@gO29AO6n~UM^A9-Qwigh6Sn8G)$ zByW3Y8AYAPJ}q3M|?U^~p&4SKavYA+_)7!o4GSR%cQ3o$;?TMC=t$IHvh zmmW_|Nk;)l(tbGT;K2N{&rlL@GM_4y68i6e1!4yF{0XdTct1F?x~>pbnv}GnCanss zZIlokbKCD#84(K`i&BacB%KgedYNz*Z%BYrQ@J~aDC(}kY|6A zeZp(;G0W9=|DJP_eLtiHRtyRbE-JI!AHWXtw=@F^7AhP>$Usa)1P*9~{A(Lz*S8?T z+xyMQdKIZt3U(iesBN+pb!O4&dJZE6a_d%IP|oY|Zv2w7-zFyZc+z+tOrL;^tXS~x z82wZ1sT2LEQoIA5tL_GuM1UU0A>xdXmM{U(c0Jl}PLfa&2B~bU z{#vL0H)G@sjvOa%1)0!RG=(&ij^;$)MwP`93gBix2;@ACV(Ee<)nW1>S3HRgt9zX* zLn`S0MEd5pe75uctT&464i$lFg!I?dG2@<{-*UUv6g3&{n~+o0>Z`+;Ya2&1YQ;_s zd+dAE;maP&>@{{}^%7bjd2hdCevnCc-l7q8QeG$bprtb3sTP5l{z0^fR)ZGoX}h+| zxvjcw%rx8eyN*O}x~jit=bjrD*Np&oC4TvjG(3A;BGO8(Bo}~hIKhQsN-E8@ z4ta6p`jW|aU)tmOHClJPAHU5BH|j~5b4Z&%AnrX|3f9kVOBchmwGqmeHpup2)zoU! zs?vk=IQBlP){M>LQ5W{N9rN+0qf1%L{4fH26LR7gAZ6NMpL?MA-ZI?G<%D4*cXrzY zsV2T&&ofP60F(IYr0I@ntfA<94=Mh9d?nAzm+-!{5BBE6=40EZz|J~j|I!VXWiX#K zOyBYJ1E!F|p8j@rG)}Xo{i@b4y}pck%5T1x&|YlLdV2zcqWK5;qf&GELOb6wO?zUC zGP^cP1Nxl8U}tEmH2iBZNc)<4hK>uTeXUJ1$+)d;np=P!*TtFS3DMx+AM}zF6`1O} zDXe0e#YG}gFpG84y*jKc0G&_{SjmHOjLvh1J}q=Jvb9X8{-YKlERVx@b-1DV9SEEN zQ%-SI1OU1iLbx2;!j+cu790D%;i^tE`@F@`ZFA|k^s;%O=LgJWpow?GZtwD)W6+OF z;>o7ZDuoYc*?C)B>Yo!D0jw{@GEF?hr0Ck&WpLN?}s)- zMYJa#uQ2u(zuxpHU?HQ&j~Z8hIO&0;4I=RYg9{aW1y-@X!GsY$=3WzWbS^1>K9I8< z95h-9ra$1wyL;pLKuPK}Qv*P5xDF0_&w8rkO|_}j0;sFdK%Jq|aFXuW35p6iudbJR zf8rNbb(7sZ!eLny`*Oaq|NVTe=E6n3z|U4@z85T;C|>z(v{%$@3vw-^U7G8@isG1i zKo`a4+9lkM)=eF9Lb#s&9_OM|DQ}_IZy!(z2xhoJUgB-sDT~Isd3xga`oPLoDG;6) zp00CSZ;pMVFq%xN$Y9vpf?^1taCbMEJ(7${1571K=f6dMt`amyf&K|?YOse~gg)?! z^22Jt^`c>9Xz-?Kiu)t)b$ih{2G7IORRR*J4c#=7Ddft3DsfIUtCCA*R?z(RGtLEC zzT{U#U>PmU?@bdOKYh5f&K>5dza5XDCNK(y4OZ#S#(cHsxq#2+K79uOCs_O=wMb7E zWO=}X@aC~4J&7O|sd(%lbY9c_GJb*dI3`*eOwf7D*utwRNo&mK69S}Pr^l|U3LAR0 zK^qNw&EPDgO1r6m-|^x5nMr49D+<*CW5(SFE1jE}5Deqg5;czoS7Po+DSKqlQ?X9b z+`iR17`|*5E%e1Ne@drkm5{wi9)CpBXQE4w*9^LM~;eBfo&Py(}2qfl#j{OWR%5 zt+g%~o~1ki79|58{65jmw3b|WDzW+Ig;|{<8b*hNuC-+G#q4^Q9Mn#geBoQqxnel- zQ%$?UaxVp*3yw*j->-NSZM=i+xA*I!jp8owqM%9AQn4_o1DJ>a8ED*JYFbjBSAfI2 z3S#5CIK2B2EsJ9UA8DC8{V_8H(d^z;2U;c~o=U|=HI2Kgm;L%N=fH(fkBf0$^9x@0vcHjO^HM-;3Yfs@Zu0Ysmr! z*;T2)1-FK4S&Z`d&h|@LoD67vue@+du`)AbH*ko_!QpMkJP5iGli?sM05WdAkT?SV zfa|SszgfsnD9%~Mg~eq`5zvEkQ1i_5=QFKfnBJmg)9Zx=4kk9-J|!7M&5lqpo+_-L z8Hl<2D`HsHU7v`$?pF&Y)5m{U#WWp!sXb+Er(vF=*c-vElp#cN#XYmMvc59z#zTz zT)I@!0^-ads9qjzj z+zI=2wh!K@q?p|FsAM<)(~D0__yMW}oR+z=y{xF?7=6 z_~WleUtyK?NL!2IB^8mb=AlT5YXU!kIiv*CTzgg9~WmhnfwdO9zPiZT`_M2RbCDUIFsDywd6yIS)HTI3UuW8`QOvC z(EPquee+PjR{GPhZp$AKk!nA8zw*ga;piGby6~BKpk`@8kl~5;eqD_i?80fJN|QQZ zxI5-vj?f)JtIn4d``eNg%}fQi{4gj7k|q{2Xu`5uhL_RX2aUahjhPF|`_$Figw(4B z)W18^m7KE7nYnO2L-wv1C2Kx{`6nw)sz(J_w6slk$Ha%a{#26?d(TbLj&yQQOb{{$ zt%A)j{oih8El#@M_Gn_SPuvsX7gH?# zBsr@Rzu*j@ZL-Q|Oc`;oedpKUA>ZePfY~%Lv$S_gq}V|-=8RdA!{&PrrmXDFr|USj z=A=0yhn06Y`hV0{m?AK-yUXa9jhSxH8p>?-?Zv1!kjie%wjOE$j19h7*2C7OjP2WL zY=c(XoDOoVKnOe)chOREvJaS({3mzM+diDm*ymm^NQr z+sbALA@6-3pmZSbaqt7vbwxBez{s;;53RN8{!=K5Wr;xOLWXE|cX?Uk-~@(K6GwT^ z_{XWkFk~!u;kE+wl{OKv@|To*@Oul-_v(iJg$Ac4d_M0#u6|B{K4*FDE+_|5QxTVM z5@?If1=KxjH}i5z4NYqM!5X4#?yr0VCgVLWg{*eKc}f^2YWDSLXn`$R2RUb3=h1g= zY_EFb_Knb{XUv!#f@8u2W%!JvJXF%WRm3||1HXXx&XAcfiCYKr(>c_9-xLcu1LQkq z`ZZZh0Tl+3nJi|gKFGn&XB;l8#MMtIV`F{Fow&xV;FT%2_V*GNkH45sUTxPK*2pb9 zhIi0&4=J?LNa@Qk8vN0^mu|qop(Ny|c%N zL=$=A?UEsl9}rvmj7Apq=^h}|IFcSEW8ulylc30`#~Tj)f+55ryTd@bm$%s8D|+9C z-3}Ta*fIf!VT)&L;yZ{d^_i#aHs8Gce;vC%1 z+spMdgqVnhmzepbQ5zGzsMC?wO;7$jtpgSg#Zl7rgrtAU>VP2UA&jJ-OC3)AN%<4<#z zwDC8J8n2n0X!7eTg7LA&y;**2t+29CURY-t=)xR~%K)b#dQ_|K5$2@|@-ozWA4A$u zvvn1ER&FJhwku-5U6PS?VZ@pE?Z#(q>D3Af#OcPE=C>;Ju2~({4==a$h9TIbDO}Nq zMTym_>nH!gJvS;B_g#A%KjMPa(lymz8jV`5IvCjniqm-%0gdxi0eWEYiwJxdDy2FO zosaYY3*;(|+*PMAa%u*3^+2ybi{8^(yqvL1Hl}qCA2eymSyvu&5)vr3I@`};*o>Ep zv`48|N@;P&42_Cgjm6r#6dT>0^l)<$Js)r`34A8kdJ{fO?Jnkr(!K-bK080*W*W(2 z=+Fo>mK)i~oVfp#OB&g#V*zCAZ?PPjpO?ezzn#sRJnTUOBdd)zK^~4_tD)X$#ex`p zZcN*%Hg0u9RQz0J5u zue4V4bHCd)ck`ngAR2Nk&*}9oDI)|nj%m0bwi&pwhwx9ZoG!Y?CfuKZ*Ssr9aM^8e zmwsOs@Q7LG68+J%KOr4?Y7uV0OS-W}MbULWQ}fsq*9Wh)-sc7ywjl3uW0=&Aca4H~ zV;CT~2ass9stj0lIpZCsfgp- z^iGj&ws>)4C*^5dmNVS9qOqw9=}sSC`T5Hue($eI_Y@!gqbUwBBW+IzuZQ8++tS<- zYhS7~&5y4(I%w&xA|G>)Bn z_vTd%Vw2gaeGzbsy`r=sT-ZA2-wgIst*Oz)gl@}mK9M}6)q-E3`tz%v6&`k*?ra2k^R%(VW`&&`3&!e!Pt+TcjRmd6%5W<*+Q zd0F?*^uqVhMCiia5tmtcLSMaue%fSVx$oQ}AHVqfm=`q+#rFjpLoOM&wAosqvA&H} zdOuvblRprUwjPfTY0ChpWJ+W44>;CzS^IuOS{bvcVIhhA!O5U1t!7C?ibu^eQ>#BK zu>h-^bIThqTsW1@PKrf%JUof1`on%9lOQF%8Qjr^|C9f>ZB|p0mb&zE9O@qdF@xyD z2HwsM-^Nyx)Awk<=2Uw8zGtR4e=$<}!9`W0Op>m+NmGvBShlK?!sk~N5t#eUQ&v$c z=mRxHMlEh?ge>za5;T~d+HWt2xweFiOT8MxcN?S@>PB^A7mwS>%J;l(47t~{Qm7Oc zc})6!5%dk#KS!Jwej{YnVN0g)uKWzX&pd|=Y&^HJ#SlJd#j4Q^;$6~TSz485*5-7I zsR=7V$b0^Ri&R+Zl{fWTk%DHGbT2mi1877lqKBXS$Re%w&fED;A%Ol>H*SfZeHZZ7 z8@2<%zk;gReAor8>+AB>R*$Vh3xNr@Rp%+za$VZd6QBjV@&0x?`56;qIwLNB&hQHL zv^TU(oXwyrmKyp>{+9_03hw@zzf@P%q$mB(w&UOA?Xh&7%g-7P2XdP?oIyQgpPm30=)hWa^~f#-KVC1LNoP>+2iP;&rDlS{K#zH2B;nCAZOE(^7m z-RyL7%C6*s&$46}YD7tM(uY((xtAbw=S)Xg!K7$;8y&BXHg;SRmde%U zdxc096tCUsi#>@WLz9>HBPk$E{?|1#UZ0AUH(20 z2YnJJcTA@vzQ3(^b1i^l*KxCV;eFFZ8w)8%3OnRS|@Eb+7VN1}QcAU=!W%@4E zV%wx%n0x)z*+5eogqd5mdVGAxMs??%U)xp6VXpI*!==~a5;@W+F7mE4c6+a_%;Y=t0cWC~K`bVkHvTW2xN|{3w10(M#f@k5E$m$j$bK2xRFmyWG$#UDBV}U-L zF{p6FS0yB~j|B3~DkeZmN(y8g()^Ps(}?=Bn8ebn!`5iNbRZ+g~OjalbU@{&z^f6wd=P?^?w55H=L)>&!fvg$7U)+ zhFbC3Zg~X$4^`h7BucP!Id^Q^wr$(CZQQYK+qP}pv2EM7XLjEEzSxbeU)9~!)m;@` zQJv?U%w#Ff+F)^n6?>=;+3ItA)hnCf^V&Od%yFH89&puu300!X=_-M;4LZL+m64j3 zPEUNI4n=!i+}cNSFy$QGdKKm26qYW`Hq|y;2yFGX&!|r;Dw}P2$ePR&GlSqRlI>fAfg`5UQKN33v}%DDJ0GiwPT9Kmi(ITEZT+!p0Y{yT*lJxVLz z?-c}RZp&LDe#&e-%5mk>!CH4Ed~TUc>vpBYNhi3SDaj)o-g4@!N6{P3iSOg&RPH&_ zhgTUxpwV4TuK=ly)vX~OPuRf?IU{0SC%Q8HX}CO>pOk@P2Ot3A4(B9k&E7~FR$wxMChsuGXALK%XO|uSE)bv)nfP=}-`aW{fj^vD3?)jI^ zY07_qweQTs-T|1Jn_q-iVtxq^YIxm=&0*U`sqRIP4vt`%Eh6Y-z1y{| zMaS#&h@a9H0a*8TJktY!{I{kI;IJ5KZY0Gi0SM~LC@gz=*9kN_j5_8E^|;8sQFXv4 z^%+>hEmt2*ia;v%{*i_i(2mIs{IIXl*5YNyv|y_R-|n z*r+${-sJ*`!Ok^15OrjHeZQ~-|19nK@XD(&P*XzJx?ffe%Qu2;hgn5@&=2~)&e4W6 zTjz}23Ld8g5KrH3#;N{sKa616rXi$O&#J64jBB4^oCugr;gPb7`5C=OLVdDGwv2zP z|5L#7TdzKMb3n?G(|I5VEhVr}%BGzs%B$PL-A`qv!eGUbJIcxBNXu}bKB&wTC=T9e zIc4Wbk7emZv=OJhpYSjk;WMlU)5Ygb{!-?v{2N1~n%Tgj(dvRcXkzycWB<6nD$XDW z!OMaXa~Nz6lATgjM5b9gGo`vr_v3LH3>H$#TPWvZ&9i7`Juol@ui<29wW0GPX9!KJ z*PUkY?^U0_V*hDIAdssL-xN%W@$z5lMci-VmmZ~KbnC%_WmH$vjZD>XbN#rT%~PVa}EMVbz5J*sjPWRd3pFi4;2?3z|-3$w0eB*k?xU*1$czm1sy6|JjUk^U9GTc zShXbyp(+B;!TDHW56#l|@)o6^a=}?i3xW*3xhiBh+QSk{TMrm*ab7G&BgSVc@eKfn z!L||C-4}BeeOa z^7q+n#9jj@RMeMK;h@v(O8c@u)Yf6_)t$R|(~YY`J&3&0h*m38OW}-_0BKr?NvCM< zWsWzoH?jv#DUpLp`Z-z8n|K41Kr!4Lmv@)A$FGBV*f*bH8G6k0)=vzlDwC`_E%T`v z=7@Sm=qU`Bc;4`WCt>Q6we3*-V`-f@0X>3Dz|0YzrnK?7EDK(&v);)&2K<*Q(;6UA z>M!4@NJ5JxzwH&hKM#E35}||HbD}^ur(i~Ghv_k&v=#fKq zZb<-0U!ITjR(44+tOu^54UN>nj2*i;V*MQc-p|Kjgx=Q;6}b{AsTU%%hB+z4?IQI9 zr9p#6CmxEtvLO+NNZSWd1;U?rqk~BS{@6b(YosGN4Q3l4D6<7xsA#?l18AV;pb$SS zoQQNwvF@0PSSoTqvpqUg9MUj&kdl*1A9_RGY*4fL6dcierEQB)^TNM@u=2;u0$MwS z0=X$}*2;LCjR@&Zt7`T1Y6z(woa>0|z}x5~YS1l)9`S<9^UGOVJ*@<4Im>fG4FnZn z`LvTt^}-$|INoz=6#>o2>eOv)!bn!rnz)1EiG==fSH~U&(Ia`1?b8(d7>~_`kLQea zd69sMeL@if!N7IfMLM58d*$z4|GOsza#ZYJC5W%kZ%t(=vds@+*o*NpYs=R#9M(eD zZBnOpQc=I<{T0Ho(Op$7HXWY<1rRYq9F$ehT~5Gi_5^84?!=JgV%KcEpxCDhVh|&? zF4&aUo|pu=yToOq_&WvNf9nxbzk) zdo3%NoImf5Ut-l1X$^)uFal6xbfO-2bd3m&iB7#pl{OEz-)|5P zYu2&nYdERJOUMi!%NKOtm3#Rw-(V=NtkDBGloWe^L0A!1osXSx74Rp@bxuK-=BV5y z`0nf5?n5r#(xiOCMu|v1#x)hurH^akX>f@hIHCt^I}=gjn22tmJ|Dqvj1E+BfF#>e zoV?ETYud<^!;4jaqLRb_@lu*dUspY7LxW`ie zJA|$Kbi1^7hu`tTL^=;hN`fz63$7ZO@k3)g_n2f~<~*8>9|oI}_WDpLOIAnf;al{T z=ikx&aPq{<2!|ssJlGn}|z$6|)0s`)xoY(KyWTY4&cs-*>31sLR zgrma?@m)c0tQ0Bvc3eq>P4$oLirx2E1}> zz)M%8KB+5T;Uy)vM8mqIPTn(AKBqKrH)KL@BuR zBOVJtQ>>DDRDSW*o0hB7{`~MVIC8^Bw{e6{Tr=pnX;VlS*=6aOpKcto162wvf=b8i z%jnP(O}3}fAX8lqv!GHmU;dlDe2>fU%3pwwsWaj7lCGR0?s6v#CN#wRh53wyg>5V4 zM^^d0q*5DyaHz=F)Fmtqo{$)N?3;$X=9S;hnjO34^@G&Yy3Bof3ab~R`q#1OHL&h2 zt+^t>R4)1(rs@19`FP{wWf&K_X}ybtznAVm?9C5P(FyP75u%ogmNbK2#})CBCyA%g z8zT;tm8SErO0%S6K4B+B`<4M(bC3)bsMg{Ze8Jba&!?mva-! z`;z0B!{lT3HO(=@!?(J;%t}iO`=1bXzvZ7A|1#q4CE|Y%_;Udyf&N?b)Vy+> zHO#&+5t@qU#{>Y_EnWC>6ZF#q5B#GB{s+L9*qRk96lvJdo*()5Vy^selmB_%{Qp+S zVF3R5roA58zhq~~&?E~6ltEzlP>Z9vT5yIxWJvOxiMZv>RZ|336*^8cqda+n_)^`P;? zNkok+e-Fum9atG^$+1x~Mkkuka|np$&ZTbm6d4pu#&y9iChS65GLq(ib-9&QWhq$j zx0n2S_7iU(3aP%)er2J<%n&CCJj8jb#YeFxHRMC*?_1VWhxX5cvunO5Mm0?d(Q&et z{yP5-z*{&Ge*D9t;${7}w^Jtq2^3uo zpN=L(-MvNqp`=|$3Ia3vw}X_POrbn9e25I~uTK_SG=I_}!{+kINceaj4ksgt#G>yz z@AfhY^nM)-hD;B`H^Po=kQESkrrilQ`@{{_F(7cG^N-xi*eC6JXf@2lecj`q9XdIV zvZBko!tfPQp*2x80&&!I-j};YG zV%gY6D`0qEP-nQ9K;>5G9bpIw@FEL-|GuBfwI)t;c^(i+EBfwPCmuNFT1~WZOll}; z3IBmT7`(mJqc;)i4CD~$2EPaufz%1moRAvaICpjVucWSN zV>125R9tcW$9&^t+i5Q0yey{k`l{~$LZc+)jS>HhPOX-6z#EQ~dSO?fWWT6@3`NJD zc-Ji5QXECk{MaUbxrlCV5{sDfc8!PlcKrR3Ew@iI(Yt&C(fnpY*mx zQ~w=zL0;+3Rq0!F!U)T8+PA+iMp+N^w1|9oSX?ap&z~FsASr~dmf;=|YBYpx9K#y< z-C)8}$;a)rW{}ojv+{vSNoir;5ekya6kbwjEi(%cusalY_LhN*trNuAOxbI4>RUZD zCjGTP>M?0?^0Q)w5+G1LH~Wq?*W|e+T)1$~b@kLa=DoTZj~7|Zl&AZJp0==zytRz_ z$NRa{^^9X^Nk_4;HRYtFxWvrV)C9>qJMnaZXPTb6i&1k|k|B8tB)4G}Kxh{uiUQ^6 zCSGi(XNvZHb(m|NP4)07g;0qyQ9dgend8aZoul3J&jeqWjBl!%W~!3%SO`A#PAi%# zjf_lOUQ-l!b4QV?y6{dM-GGSlX^j_)HX7z1_dmZf58Ta62)fEa1CfT7SL2QM^C{Kkv8 z@jlPGBFu#-6dWs zMM}sF$jbA$LDJWqgX5sPvkqk&RFiEQ)X3nL-gP&vCA;v1`J~qp36m*r)(p(d=QHD) z$ndhJFQ^!g`N#7zLTdUeOqLw}6H*6##lQ?~>-Kl%^Q~L+Dgf0n5>EQskc-T}`fY)z z)Yk1)qK2czUW>s)hJ1QN=_;Eoe2qLID`H!16p>@&RAr}hT+WM-sFWVb56QI6&Xcp& zjoCM{Q@cKLU0m*W`Na{1ve$PVWl$5GG}2q_M$PEe!9zBGNk&v{)%ZRcU0-+C_NfhF zdi;MQ2F0UO--AuO011gqB|d})SA5sXwne2V$g^SVSCtln*JOeK_|4C%-P#Br)*AR0 zKi@dZnT-#$F;qsL%}dS;w$FJw&~w{QVGN4JeY(Wge~&+ukD9R-_Y_qGGSr7z>uDE&*vO`X2eOE_g-2cG3hQGz7~6 zvcE3mfg&V~@?jxx&a&T7wlf@iCuzV|T%*dB4-pBKpHaAA_MLnwTnm?;PlPg)`)BbNpgva{QO>Sj{MdnwdACw7U=GK z_Jn)u*qfov(W6RC(woli0nB%GT{(P*brMFUdPz&j^D>wr5b!s=`}>P_kqxTiYS6LBnt%vsG2g$pgK#e1$j3y_YrVbIdXq7C zW1&L1&4{w@)KY`cZdvF{KaI6<%a>xU-D6{={e}^ood76M3gPrmQ2Tx4f& zqY9@*eVtUKJspk3L~tGJ%lk!Y3Uhzxbn)omnU+&Tz3d755w*j?tvs-|bdP!dk_!{f zpDKfY`vZYm{7Q_~MHR6ZPRQ1`CsRi9xv0in?C#{7$ZuG#620ReoOdtb9b zDOk#$g1Z4-%L2%3+m-~|$hUn&^^SNwr>8s&Y{rsA62%A`(PZIKQT!O;-mh}H-3pK7 zk!VhrG8xV1;Q7EJb?S?yW=^u56nqsmh*+#TSzT>wE&PyCSr)VQrp+<8#UiSXmGvLv z?$A+{a5NFO0{@ z$y(JVt3HnVr^HLvt~C`r6&jSD01dxwd7_ssr*LkJ?t4%aY^Lc>%VKPYq7l;rjyA~_ z&aQ(C8&4~%pk5e``pIdk0BH!Rsv*xx68PA-LyX-lDaF44eL{(kYL|JgNq{`Bo zuo{6g&*~nT$L&tl5IyrjFa7b{pV}A6x}EX z>>cABd-Zyth?RKIQy()j;Ma{C99EZ+Xi`w<&CJ;l70Du0S{3ev&5Y-&TlOw;T>n*H z(5AWKYrM_Vz_P4@@lg{;?5NtqyokyF(5Lh9mYIGL5J0~)AFfGR5YVF@Wz*)9xTow4 zF+wSE0}dgm&W5>cC&~<@c!_0cX(`!+1O*rpvBt8HWWSQpA%rELp6R*ihbPPR?jqBK ztDBamX99l?jce_}7^md^6lfjDW*A!jYQYe)nE={ABfyZy3ph9q{2fo0qN1##rlNxK zM_E@*NU*_qNk(CF)3yuP$$Mw{WpH~xDJcOyNE1Rwc6tX*6+a`rqX)D@_;?^M6Kn8T z){e8m=~xVs5Wmu|X7)C_QOZY`vw&{b-h1){Oe^%$ukrgiUK@D;RVp)4G6h*t!m1x#Q-LNB1X4iGTzCXA&eb zWikV3ZU;E4?HyzaXpAF%c6RVUl$KO$Gi<&C5hj+(-0b%3kq=2Ri^IFdxa};5uO(Ai=Fkkh ztO$zZt<82+)X5-eoDrC7N7%n5&y6*BsAC*@?h};^@VYiw2kG!mFK^N+)^_W%HV!BP zp0jfYnY?f6Sa^|jJxYt8iSP739bD1P3>(FsZqPc&%fdxV%XwQt|BO%mvV_ofYQfL1 z>$5^dH3IzG39PQB$qX&~$OP;stM^4**^GB?)U@6^xhZl*GL8=pdm9kFeu=1#ITyzj zW^Rs(ih6{JN-nks+KO%JrHpe@gqqro!@8NRtp&uHv#WS$$oNGyuSvb)_BZFZ=ervn zV?wf;{CjdD&^hBrt*pkW%qLepqS>Skr2QZ(I>gU2)5<8uVVt+L7UHjPT+B89N_voz zf`SeMC4mfz(T-d1d(0PZD(DGFa3CfA0SyVUG*pj{uW6^Y^|xIu)OrHsq6Ci&j;d5f(#5WK(bYrvNd`c_sN? z5=Vu5Eez_k!eg;nd(t(W$C--TG3&JI-bkcw{SUc_mKKG}n>U#DtfH=@ewuljehLXO1b>HY)b?b8TEW&&}?U-aF) z*4;IpG{2X+V_@%z0FC$>h1YI7$OqvS4Yrb`G+F=|6#WekZN+`o?Yr+dp@Q1?#gjk#eZtLo&^t&? z__T7lIfalPvzG$qF66JvycBI0J4@|CJ*!F8{H)|nr29v9Z&PZ*+v;dd{3X_Jaiy1-w(U_AgFwX1zU&~(01sB^z9SJITQ8kDg58YCBYPp(}%M@<<*fba98fqt6M zr&paihr7~yy`1Aa{Om1||wz=o$1-pB0RX`N3t#-VB!%omq(pe0$nHo{eO zTbO=d1gAu%yz+g%OH5`;(bj!VW~t6f{qe1z=cm*$jEMSYC@T8$BBm}bF3@pFBacPh4BW&dX*X_2U{Qo+g_M-1rd`yYC9zzMuBF$s3{3WP*ax}nzGLFORZT? z*ECfT%URK&==?4kB@hB^XrtyP=qc&PqU30`Y)R3a>gX-HNN%F?VDPcYO>JF76)V%% zt((Zb>Habfaed!KPBXBn3mE;?f5q@q6f{od1c>}P18#Lgc|L?*;^$N`y;o)V54=JM zdKe(yj*dtR{-TWPSyK^6PPXoBax3zR*!re5r3F!}G7>6|5B?sQ5u^*PsEY9UnL1xV z88V)`vTRCo+%MlBG*$->Cs?;c43+90%1?|!NHH9qZ`uYqW4sqULQf-DV37j(vul^U zp=M3SWM({ale9JkpG!a)gZ)5Ux+qy)?!NU2=cn$#ZRfI{ zQbTg4n3DEPh0KEltjSi+VeZSG(9`-R6qQ<0COM>pg*sXbqUym*cmy zPy+Fzi}&{)ZrPW5 zaf!e&sykLmw7*R>z!|sh%T}PZ|EdKMgYw;2W|u$T*$RMb+SArDfrW#`al=ALznX^g z>gq-)pTw+E;GzuCHvj( z0s`?by6rq#b)3CPfGtE#TD|oGeO*Nb6vo(KlaDWenBa>)M~!s3Vjz}3b7ytJ-MEv7&WmxSPQ@EqXvhTsY=yr9O`$P=2<8kd!&j)T?)OnPm4f z{}`+iXe}P+x)IPHFcOr>9yPkcC!@iRZl)9miqUZSKdIhsB0O=~HmoSvLLL9-=xdaaBGccles2!=c!aMP%`+V)()E!QJZiUWGm8Q zq7QSGa=zC{M>(KzDMt9Q4*dn`^KmUtsE0~VPfvvK$m1Glp;Idh8J&2|(CVH#K>L~9 z9~9@BUK{Y)lqP^if7{?rbXSACa_i}`UCCSKQ2$}RCU~Z!%1Y|zYxH$H^^2?N{5dkf z;0}~HjrvyiR|qRXIw+2sRC|Hyp)WbyVGhdkk^P3jVN%-D;W2(QIv8THabE<{dD*b( zo#$;+<(U&yh7VOb^}4^zBL`l?^IAvHI_I?lXYA0r#|gx&d~UBNX7)BCtR-sCzqGNu zZ}yfF89GuGF>&@JUbhphrCeNF~EQwxxkLs(_LXREc=-6r$K zC%Tm0W>1Q>vrYSaR`qV|H?Sb}UF0aqVUG)o)7syC@6uZcVa#Ht=#CM!QqA{mSy84e z@4Kk(;dvprI9wslR;BA(L~FtAqyldOho5)~Q7PAuQg2$_fjtf@v&o36 zkCJ(Q+6{x&^&4P0H2fnw^n>;No36Nx zbf5EIuk6hhhltPT$GJO9Tr)lVHyh6VeTFfH0uYt*8M!8&&z_o#guJ^i%#Wo^*scR- zPoGVp%uY~*g=d~j^)*QlM;dv|Z;|4?)Quc{ruY`xax-&5UrcQK^O*0hyfE*`4LFhQ zp)HCK-lHoOHO|SRdV;he<9jKIC#AW6DME4QX?q2Tvx!mjEH-R6$&!LLWU1MX+%;K> zv@3M>@95WiVkS(+jhyp#6$EU&f$jpA?gBasr2@i~#5)rd(20XZjQD_+Bke3--qP!2 zmMV9^DDI@uAbr-PIEV;n%Z-@Ia{%FC1dbXiOt^3Y2|Nd04hFuoxr29p0O>QdfSidh zcB~oL_k^8@4XXa+(I{~dPr7MGW4lm*2*dD z3OWQR{O^8jJ0QdGJw)3Qr)?yti`xYj$C=)(QMn|Wg#9H>8_fKu;2!<;+g$af=hybCe_A zrHE??t}jnXVFv|!*@Fn4t5k$kyXyeAnDmL`>U1nj7dKU~S1bVR#ujN-7PjR^`{@x8 z)saYw9W$)IZB_EW1RCwysB{h<%dC@jAVwlz6wPcyRv{p7MTCLLxHQa< zX*p(Os4oA~2(^D=<|fBMj$BbR@1(}{aPT>x5Duab^*7B)GW20jrO4DA=F*4H} z7L1!;uOZEApa22GGuMGCocqX@j0s*mUKk$RmKwvL&Dz!(EoV2-u)LNxi1zBU*MX6GcNpbFG zmgmLsp;!b(%>A|f2Cf$#Rri8NJAc9}*#C48bi0*C17`Fy!2jo_qBQ;j-@NbaFzoGp z=SL6>G@Ta{!-jiYgUVml#@ZAHi-~WQ$9}C~uH$?ybL8BgrsmyPoS@HD@)3YlFs^!!FslYqj+rF@DI~;!mkf!N%VU6T|ga4AipmWJeCm zn>l6zAx~R8ezL8Zr4eKAyJn3R@{rhQl<)7AG|C-ro~DQNqANGMnZ4|WxD{;tV2K(u zz23Ef{=9C_IdfpZV7=o9?dR`)j+wZoqY=1XmKx2I-K#u?JMFeYbiBo+c;t?Qe2ag_ zFpW*@f3WCkxD;;dqBEU~wg`gxC;BV`c%%kR>tBI^-*_u^ANP|A$#h4fb@clx8NiJ+ z*sI{720rqV;#){BRD0&raQ-ME7i|y`#c8I;k=G8-J`y~wKC7Sq+pF{%9`j|bp)e~c zBv^N%I=lyeKmol{%tNH0#+C&i0ZZSALG5+EQoX!gf_>M1OX2acKQ>)>l!qb)a{`Tw zP72dvjj#Rgwl}# z^@o7Ioq34V3krHuaXNxoG~tuu=Ujo5RNG*q$!cK6(IL0QsWjeI>Z0v@2{lO50|@;%m;j5! zufKypPr0*tF3c6y3kyvKx=y*hbn0AD`im+hY^aa!&4)D10X*dBjXHwdpkZPE$o)9Q zTLeh}7X^!g^hlm3x`!j4p5q63@l?b)%5Zt{m&GHvDv znk#V12jgryT0?bX>HLag9?XI%(;ZC&j`b0H#q4m%cGYe#%!*zh^?G)UUe=?Fqbxd+L;=z3o2+S z$}a(LiR3M|z%Q>}boLpNcw|FfNV)OmA{^L_* z2?E-^vMO!b$hP6^t^hQHTAu1le-}bfOH2rxRDm5;L>x6mT>~v>wx%l=WH>DDX zxGQ!~@%!$iWI-VZiHZqoNunoqQE_P%Az9?-aK%~S>h$BD-$gciD;c1fjWM)vX)Kn3 zzN1pMmHpuoj|)j?XqVRUg!A*3=ZfB|ng|(=+~nWalLb^}sL@+(Zs)9Ml`MT?Od8l< zS!>Fu$JefxB+rirM2@1n_z=;B6_WQJ5u&0Ry0}Zf^hE}jmP~@#*Y;DBhLcQh{%*DypD%N;`gqzY z1Srj9uQH)h&|EEi{5!iiUjJzC916R5vJ&q;;O#Seel)VkW$$!B?D!)WgQHXE<=}nm zwLud}W|wW&d!^_V*am*Q;Y?Q6eqeC8MRbsBv%xfCnwS|q)9=2wwgk9|nSf#GNWozZ z$mM#}GzCRwo5MzM3o&;19(o`}R!|8mfPsrodd!r=8$A*u^7Z%k<^Uj zt)`oC*0p-04i@MNkg_28+Xa)J8rO%6j%^Ya75!D$0VI7A))52~Xm{sNOLKE{WaP!G z&;LW-n0@i&Ts1X5crx)4;179)wZ)~S;UDadf)?dfG*$rbjP|x$bOw)-RE&jximMbZ zsO}culb&3ZYV}Kt4>xfM?;4fNt=QYx={sbvZZYVXV6e?ob|wb?kKMwpD;eTAEYKkL*i8gY<+?iq{QA?&C%UHPU~Z|J&^N3ylh9^4N1v zD}_$0XV#{ta>9CK?IQQEUTphf%e-k~zv8BuZ}`t$xs_6xC2_9; ztO^%=|3aBh*|YK!syaVx*10cOy0*f!CQ$wSs6QOgS!-M!v5%vNYc8Jq+Oy){uq#t*tys-o>QCNRuvy;*})&z*YRPIfv2+OT@pRKMd z-bWZcpait{v#0bI`$;B1IBC2h^?A@dFndrG&I1~FoqU5*lzlo1dL}AOhRUX zBSForOGR$gR9UdfduKPIFrV!R)r%sbQv?Y(y!z@)casdyZ8+U6FqE7D(=@b|er)#& z`h-)_a?Q+j1~JHdhI3aI`0#JT-NHRUWu*CmdTunAYrTJXaMz=~nFCFrOQXtOvp@4p zG+IvTf_a9~wf^o^dhFVmD&%Bf&2Y^DIky~@q($9eiDBVd3zy_}hdc9x9?77>n}&Uyq^CH~>_8$+`?=@q1R?|u z3&o|MpphNEpA-V)cmAd_RR~nca{hJZ1kFuY(k81OEE|7E1>ava^s~f^VNSnI@O|wM z2Lc&G31_=G>?@=_BArqRENETh1YI6xFl0fTM(% zk6dcavw_~@`{Ys6<}EoLNU$$||J41BHs36QSxC!=jMv?Mx>hrThToWzwT*%L;Ge4! zWv*+X*3yagQivG-B)s_=eBo_sKV^_=*NoS4fiT@?(UkyC^0U+|)(&W8R~jt4aI}pJ zch^kU9PCueE)y@&t+f_a^-%{&_Y?;mah~DL#?a$1OI@{;32enJe-!!7NtRQy=OyxHt4XzKmq1)YF=Itj%;b0-iGt-pXWHCnCwZ17m3Dd}9|Lw? z-n791+Ux!xip}((pGS1#xvvJ~ci9YBEYS##c1_XI3|4vF|E1G0s_cDmY3FTS8-HZM zx*nQzcIVQle8GF(kmi0Vx3m^EJbW&P>PW4+9J9~NMirogojhBSY4^Rp(xqq|Br?Bt z9V^&Be{Mq>OYsC01HWJ%gQ4lbPLx2~nueX>e3p3|X3~3W>rX+R&w# zIxW6%b}o{ujSXcRw`E}UvqxMo!}8W+^YV2ZZ9+ndHM7n5_t03=f_6ZI{SZWb1s2Ar z-_j#UXM zu4ZZ+2@7A&4+QxxT|&j9m65TeQlP4V_{OhJl+t(WBTY;LQi0>FCM0*E+Q-(8ol`<0 zw>C}Rl*cxV^LulQD>`Fg+pEpyt{U_|?hEL#w=uP}>vd2siH~s?XB08#vno6Bj)J=9 zu}%%F@%i2!&fmHrr{X)CC!Ou8#tjABGFvf{7%~|=nn1Si_7CTYoFt)#S*Q6tSm5dM zYLcPAM}zEYUMibV^;!E;%=G#wt!tA_iT_Y@B0UNioYgERO=Fxn-@i$S*aquPWEp~2 z(esa8<6D)AhHb{Z(FdD#Qa!yJ&o1=^cs4*>)|2tJx7=SdC}?d>E*f9{E%#A+Dd-Mt z#&oqhq%G+QefJ2e2q>% z=qqWhbRV2WMA`TKc20yOy4dWd=Gwuk?=-u&ZsKXhW8$P$8?dNJj-!vMZGM#jGA8b0 zaS-joLU7?K)>Q3s1kYCx2W$Y^TIsk5<7WoU5gky#92;~^b<`pWwKV?+XxP!BO-0=1 z-($x4e67F45SUe(gezW2XEtV4c(D4q6)u2r3?+7|*X(zYqf)*0VgAFJIqe>zr!I>g zagXlVR4_I?7Nh-5%*i`rxiK|(#RR_-+uCx<1q^X6Yu_?A)P%g%i>OCyks0@-@5MI_ zt`To;#=)AyFgP@g9P+k`QoGFz*Yi%?FAYuU?c!r~suLxy1&eDb!*y|<1FA$$Q%!7x z^|Dn-c7Q)Tkx4c~dN?8Jq{}vJEU(TU{br?h6T$m>eH^$uRW6jJnoH25OaB%$arckH zG@ES&M(g0q66T%YlH9bjzdbgCWK(^ z#LY+fK<&1LI!go@gF!OM#y&WX)lh@gIeZb<^nvl>ozBMB7tnJ^E(|UWtiV?`!cgdw zA=*6yJ_JN669huTY+LJSKlKUvAXzgHuUel%bZ zPF;EF_pqBMw8f%JXU_92MfRE=Z~~?${rTheKO3Ko0J$8#V^e?W&GXcXxyiO$-Du*P ztL_txllx4SE^(xUtizr13!g5(s3fD6K`+PBy*mVB#02$@gWEfy&Q_a^mYdVNZY}LO zAH;;$D-f_iNx}usq_}la;#oJ z^={s`=O zOFyh9S5;k`+Pjxk3-hly$M3$%+ft0V*6R)ryt?1?U7t&x5B0UOU86In1Vk?D zjU8{jBZ&}X$C?WJ$WHbgohkqUp+vU@yXlr>f8Y{a z;fr^GhSh!?&*4sig%%TbU<(ek2j-pCtJ5?SX0PpFwOmds8UwO|8R{PO#kD%UY>^W6 z(uM4h7OY4^pf6V2ofewIU5A}DaWFOR_|3^HZKfcCx8PFFj*o|@QRWbsy)f2Q3qI z-oFAsu}P^2hbB(zGDQ5^zw>LgJtd{xZsVEG2Q8GRCB>{xtAudbrJ#ND3uw~<9ew08 zROTsi>;%Q&UV{6V%y}MO_KIdwTrD2(z|qsDjeH{cm@_qkbpUuFMD98v@>!2O> znO;&%MTyszBP{IsgP86c?*_XC3H5^AzUV5Qxx105d%URv5cuZ~3f!5}hW;h)Y(vV* zLyHP{OvXivRRraQW9|P0Zw`?0W$SiEvHNg_#)rWP_q-AsgA?MhPIdp_oXv?6_Z#92 zdW}Lrae~`=3;l(j6MOm#D9OqZ>*^Yakiz#|tXyAs)bH#D)zJ}~?U!-OpF_BtP{r!7 z+sP-QGt6A4t9IN?P?hH+W~B2?+rBNk&zGKv^*5ZS&qkxFhBF=(qlkH*#n!S07?PZ3;$Lm{rn&-lZsYz*Lt4bSKKl(zDqMf_q*WZz<_()`v zRdlqvxht4i8%RnNn|bG_Z_T^zYoIAJ?`+0}g{FN-ld^oIU82&$vg6CUHIt`%9IZD- z+ibc2Xzw!a&I9Syz6Z%{OnZaGDhSGVzDI&bPm5s;T5cALEdXJ}(e}Wi(;3S0oKFlo zy06IBC&3^pHqV9!dJd0)zvEtWA`Ju4$lYw*Qd;nkii$k14Lh8Gq$tGZYzz05b0KCf{_^vxx3B9i9YSDklneth7Bj)qypOFKvI;6u#`c0IT2 zh1H3>JN9X zM;4FpI-A{Nq|i8>p0(Hn=@iRvK6k8|hO-JhubP3XFLn={VBI3MZ9t-g7*pv*5|8 ztRYJ$3Z5CaBY1&4xs4yoymTQ#)$zdb6~iHZ^DWcN=6YK`)18x+>#BpbdSWne$c?69 z&c`i9+Fw9Lt?0tcUSGgWx)uGdNl*>?SVe-EO=+jEMnUz^u*ow9YqZaM*ujn~%(fi% zov@6ud#sLNWj(`al)bGv(i3!}W1>cnozD+nUlrmzOi_S_5zV@LI7`OyQJ5E!9t$ZE zsr_}%C1EdAWyjmE9waE6e8_ny#HTfRnSIpOO-`$^E3H&w4zD|zT8;E@S+Vx|%1ylS zB&S|Q0($uY=~UF4XTsC@pnm2ylZR>9Ziw3Sc)(OOf#FWR%jXPawL;j+#NF|=`y+3U z*Z6_nz+bWZ{ptOV-8YVE4GmghsGFaC8-iI>mVlbt zD0NBkZ|}@;qGi#W8(XRRS zqzw`_6KaDXdAq<}4%fEKwrCCw8l%{nBU&cJqR}`5HOxjj zBgX@2QSTD&J!-q1{bQe13w>tC6p`n(=0^L4PqRH~-z!Ocm-fulodEVhveee8Us*9lq`P z{?Y-C2JpCLJ6G76P|9EUuMhbsHvMH*lvYQxW)$q+xH>9J)nu%L^FUD^y&Q|=AoJ1H z>wM}Ij99^~9Xqe4PumfHYo!@_OerEJhqPFH@!e~;l}Uw>hy3rpr$CS)KlgVs756<> zToxX=@XD^`QcNO)NhvR`WEFgZ^bC>NbLZ(BIioG~VE#GlgQr?3QD{P~sgdVDY2Utb zpdUXpd0Q-d+ZSv0-E*JVTCv#{BQi^K`IJZ1=Uq8@Z%q!yKETQe8QI&KGIA^PkS^Eo zDVGVctIHp!vz3_`X=A;iN+Xy1IULzxYnb5`vSh4516#bGBvguLL0Ce5QH`ydG812X z=f<51jFNbD0^C(sc;fg?vnC1dUhbrKWy6+d?@DUfus)Vs zefR2Y*ECDu}kZhjn}BJ!pj9vA{B0H%YK-o(?BV160p=nkDZ$e^D^?AMI{9aa_b>By(szZs~Uc` zxZEI1O~LSfU(HnUxU`pP)Vkr3;5I-X!N$%rD|M&*5xjmaQZeX41pbZ!ALh{Tqb zme$r*GbwZW#mIMzJWiit9yM@G3Uw#Nl1EsD!P%(>T~3o`)wiqe&=$&+(ns8v>_r*os8BI zol0yWv@v`10yISy9SPV*MH>l&Mn*oMcZW zFc#7&@I-QFm9ZGeQm~aw>sq-;U%=xD^xk()=@b&al|bvw6B$D|y$tz7X7p&$EEbDE zKt>Lvi;`%)wHhXsfG3l?Jy-K^7cz*uoI(#!5LvZSXgzCyL?WTF5{c+x7ZVi)jU$Sx z`+gV*ns?v{Cw4l=jTkr@S^5~q7cn|UBGTv4hD`pxJ!)$6qkSRf7c$bjy(r9LQYk$; z5rsx!b&7()t$IAEjXOfoD1`FTk{Ucx0w$^32+A3&I%|VQYs2H4@pw9C&>#^%w}HM< zAGhzA_Nernrml^dMQHX@lq?(5*uaNie#WDh=V=p}Jv;vtg16%QJ$k!KAyT;11wY-W%ut14^T`q*Kc9!%2>neO|uel|jQ z92#n%o%HaFFYD9EgeGJJ{JzR3lvh>NlR+=|e<_O&M3z`H&wTiSXX!P`-qt4F7LHNx2H6~x0Hrhe;#wdTH)y}KPO&F>J**My}cQGpYkdV zF!DbxuJg?7{DaLURayS-_aFe^SF$H+_5f|Gi6cDz%F;EJlw6)OYj)HHIsN{it^xlp zImOQgNplY0ZIb^008`*9J{e1E%$+n zyuP94h%+&3USwYTZL@mYV@39j>vH}3YmKqGzuxCal-7?7I>CGo0R}un#x2&?5%y8>5bRuE#!^aFNP07q``SX{r!w$!7^ab_! z8v?9c0ssKO-v*sQTRZQ(tR#Ay0-Mchqo8+e?DcxxOsrwD7#P0aXyj**$+IG(B-J^; zab~fo1k|jG$D33_RTYy?$MExm+5}1i00000ej!2vqR78)ju;HTtc2?CmQ|dnDDtnH zBOewkp{54v@iznGynhq0002^hXL0}0{}lCDRp&~ zL4!_?9w8_p38Vo4^aUoJ&Y)6cbaa3yfYJZ}{I|g1a4ylefE)k-z+VP9o&W#<0002c aC;kW9vdcqOu1JIc0000$m)$*YrdL|3%_r%}eyZl+ut@AP}~9G9_T8W1ux=U}Gd; zW1(YYVc=xpq# zw&}Ags(v$4H=VX=h^Z?)+c$va(!~cFrz_cE+ZXBD_Su66h=~O}IGO*jPAOMFcrm z*cliZMHz)eI0S`67+FM_IDTuwjQ`CmVsGqfYij56-@GROmsjY21Jvo=45Y6@Lyf#vizTQ;rJir{cm2A|5+E#|B;veR~h>MOzi(_qW}BVul4+=_lF*?yyf<9D4ip{4aWJGf zV7E1Ieh%|eMcQ$3PHn`r43D=kiIQ%q-R-h20*^&mi)Y!*0W?W$O;Ca81L;{{6dKZm z_`=(s4otE)E_(O#Bq!_R`(wxbXY+I7Wd|E4)G+Sok5L*}->66@pK`HarPc>l`=Bik zq(>It5F=CX*1(V+cSK&WG$JI2Mb;lp(Ye2|M^MqI$Uo1vglv5E0td!tH4K^aCp)O} z;lu7w>$Q+%i%5o9u5LDneGE1_0aC^D7AzrH`Ed|rJE82OU+3Z}u&gP7SaI(4PA2w< zL9j9RZ$1QOG3}wO)fXtFwr~s-ya0~H2qRf3+7DfJXawm=*%KPrSpNiWqn#RA>7O2M z(_bR>NNJ$4J!Ic2A0tr2SnzC7f&M03Td=3N;H&+V%FBt+KJwHK(Nnc`a6efU-@3d9 zO26EBBZmnH>Wt(@^GR1m4&Fr!c2Y$ygIo<4;##tfQrDnrBqk)@|yo}!&syIG2 zrYX-=`JTc0^NaA9EkiS5e~V&xmzR%a8hnQ79Y-mvV^!W|uP!=H{c4u|_2D52TBJCm zIyv9l0r>ZWd3$)3CZB@Y@2sy+rk!>z3t2a*Ui@nyDg?Zfg<{5 zF>C8s_lOd-oG%)c_f>V}Ne^}OLT=OL4@LOMK{P1=0)*UG95;}6psM&d#|CoD<)?#D zT_&IHR=X>U90L@}p;Uu_J~&MiX|=^!{G^L}poXrK)mE$d`3!nllfHSd@9(dVCr({i zU|d%uTWU{A@LX5aAVatoNj93drzke4``n0F2o^1@ow>$NOg}_goHHrkOgh+?dt?;pMGy6yUYh#lHy(c z?8gRhD{}t?_*Q+hRt7Hi`txA=Rl>2i8Vc1CoIA`sme(50VFk>gOh5Kc*Q9l@yr7bR z!l9PveUmtH&`J^R4cl&WvYu5uL#2l;w4|-B<&2x2%7dBTJO1z z#WUFgV$!AUI5WK;1X`CAm#VTx%-E?t6B#T(CP|V0T3L1E=Jpi-66n{mdF4|-SiDv{ zBYTs9oR3WCZ_&;if1SuwOOVuKg=KxWo#SRhT3QY`mPn>2lFMUZ(pCqLsIqEC{Bf%E z>i^n|hN#u33J3^5T&-^!8oc2dnDAk*#ZbpkN1v^2@1=jyqtuPh0`I$h-_pO$*l509 zU0$dD`Iq9p$IiB>tL;ooXs`yyP%&p=bLn}kps0u#-Vq-kpPMx%&5gk}nOe3K1CO6p z#=25P8ZUtybo%pT91=e_OxLhk7f9??n)AYDyWUvdS-0Zz7EPWj+d9k?VrHup1E_^4%q)V>=+2+RTGnuNjJ;INUuH!vPIC1W; zx^H{{^!@!E(p1|#I4)CJL3vGUNXW{$Hff`G9)pUDx)tF3^9_t5YMb()LE9gYo>&Dv zg98V?>xC6v!Yv|-Fub$@ZAObf3B8tR ztEL1H9wD`aDfUrVR6eJVxWmI|kOUg~7L(C`^85k%GYwR^ipocS+zaa~cPxM8UVUub zTv*fyMdwX$v5c!&8oEQ0>=K*+eZWH9_C#dZ(ViMy{?52tvh1OUul`T%j7PF~-opzX z7j9^HIEaaxni~4?Mc4QHO0EG;bi-pF(~iYJ)c2nWxVRHwBvd%T9w0XVk783p9U?2S4Lhn(W zRB^i>8L`jWsesB;0Ug)&&e+(P&ZU|zfHM}DiWCXmu)Itjl7mT;kZ^zlmRdw5G;AU~ zT$4(~{SBKq-Za?#l<>hV3&*Tg=fA zYkP!&P(;cEOPRv#NThX>UmBZ02NP4U>ss1bOde;f)2GXeiy%&Cjg|{A;tSkirwiK~ znLa~)DgLgGCj&QZ!T)sq4~OqhRW&g&qda~j8&U*Bm>M0R%liCyu{i6zZI*lJ6&?-W zT@RT0sM%-9<^9}$Y5*GFC&-(jh8@mSYs#U;akhC4Uz`r}o*E^8;N5?QEd|Q+*Uu)C zcJdd?V3U0DZa8IZQkui7d8{B_@)X8|F^-+CCk_zp@T|YRoRYa?uA7`5*fFS9;JPR( z8Uu%wLPEs|V;)EW$hSH_oi%Qyh?(RY9{6Q73^RGbOp^y%lb7co>X9PrDOAq*`lq_fm9x140YM-QTS@;Zfu@lLJrzGUyKLTh@V)^R>k z9ki_LijMkk7EM%wfq)8ur>CVx;i!s z8l@J(I0~8oC4loi2QUFj@$L>F5MOmV6<7gdb!wNQjJ0r5uIM2nM|t^J!>~D+uH9V& z>`xm2t0QZy_K6s30<-;(Tww+E(N9zK=b^EDv{u|u75Xzztoj&V_iuT}pl9PbKIkF^ zSGV_wfar}E^us`fY?z99mwd((E(IdK1o zr%v2{lo6y61g_u_za4LU+<r|&o zwraoiw@u4#G@r>C92~sEtnV(|(ZW8cg8O@La3I^9XdO01j{q@ha(@b!vg%HZB*q}E z)WT_^UQRgSojAV?)|cDe-OZ8#Iqyp@e0sdcw4|u)`{f})v5C$^9ID5EV=9^LY0dvx z9+WpS)7m`6qv3STG=foI%Wy$^Uz9bcGjMGKc!ZQJR6U1ZI%5{`5r-eQ{X?k@eGR0{ z)T9c9F+!VW%S>!Cf^}7EW@>7?**aI-b;>0>OB@#ai9ZE2Dn8{Ky7?%5Qa$A|)Umfo zS{t%KDN(Fdq~HN$q_>o=4{h%PF{qs&^mi_wGo4?a<^6}Q#&D-3HPohhzjcbq44XI} zf}WpzASHs#E-hBr-o6IWtE!^HMHsA7mCTKXfdih+M#G->$n27}rV@0}!10ZSgi>H@ zYlC+MnxCT#L;(X_V){Dum5W6(JLLo9z`!Tf?S0RELuk&Tv9i*Vj5T$_mNIqHVMUG` z1uGg`n=CZ1ePu}a!=K8*P7$HiEcKhu}4EvRr_`YRFe9u1-E9ZU4$bPfP z!e%!n7PpsxqZOlfxh6^;q(r&|V?>8c9>sDE({_1j$#$o^t7O=qP(>UZKy!2Dk1L4J zv7EE34Tiz2_qVj|j3!&sjEg(f$472#eLwEk=XNA1itboz(wpt!wf}~G&FRvQu)&t zyLpma$Z)z@GlGhm+PVv4u@b4lgk^D+lc6j5lQ@Gt@8{MB6-v*QKd4gMN636k?b0q|oh z0VO4*-WWC(mW@EB*PAYx>wjGGxpHYPDNJX%+=)^3N`erbVs5q0(0$0hH);M|2Lazg zYCAVo*WzmwdHItmz&`5qj6$omx*%1F;qrXW;{h7aHSeTV$v-u{ zoHjB>*`wJx?xspuIdEeBwe%s6QMOp;GB0gS74VUbS_5xrs{r#VY%lG9pG4%C-K7wl z@{oBvYzk*~?eBFB_wK4Y86u_6@(*g?z&N$}TrB@XYJ1u-vv1avCSv}_7nbt<7KsQf92~Owdl)+;iBW=G% ziL=aT_9TaxnXh6Y6#lTscbRi-*9{XbM9`jdn(mR=fOk9Fy4_LQNYWKAmXuV}pyDOh zwAU0avLAGs-ffr`YBiiELVGyAsh3C}@vvBF4eVC9a7Gu`BUR28uO?KuG<~VQZ(h<@ zh!q2CxRVH#+vG+|MCZfF5Lii<+-NJ$)`6bw66N!;i{1Q>AQTA`6SLKWj1R%W`h59D zqfm8mMmrofD#K8RCLz*Ad@Fe%Kqh>?H#7{5mJk4|?puFdYLiJnQdCf6;7GUVDf7XK zi#+0Vuh{>k@1Zo--=-Nt-P4bvwU=Q`w3H$$Zix~i+DaV=uv_b^hP^*gxrr@CvLUNP zf>Z46%%A|5DP-LS7^=y`G$AB|P_tcNeIP*Cx0l=T%6mZltIgAb@2%9W5eNguOZE~& z6IEDhElCZPW@1SRt;8fuc=Wxc<%$(UIJ#DyF(GyD4;|U6_(6M&UqNn%ul?@v8@Qu= z+HMXLmR^+)_aYpd-^<3wO1D&PWOY?30|l-dGsrNel9b!^)>9b7Sf{(wUp%OIoeM<_ z8ZW!J1(7Zx8s&B_L$Yc|Yinwus1=LFV{-U}8b7oyl3_kSoeeS#o*m=;9$@c|G;s(8?qtw=;&MXQu0SYyEe0YcpU!@azY|* zQxw_Wlzrp^9O6Q%Ag{QYAt4FG%W9g&%Od=RAgccxg!&n-InC+B3xHyy?Oya4}XIF87fL5yAi5v z%=Y41yH1eN7dRm!Y05{uI(TXv)SnBvG4xDXGb~0ncJ@fqtUm4peBadP3&##hQxp^~ zX~RdO$OY)+ z*Oz5aNr0m~93oC$n#(zI{oF7>ki=IFV93@aP+Ad&37|n@0H{I+xIx1NBmu!H*uh97 z5kQ2nye}?3z$Bsqs)5OypdcW@5|JbU4IB%boneg7=Nro>?W;ynLB=Qt0)*UmCKy4^ z{wI*z$|xT(RmZ^nZgX|9;jNCu*_70GXOY>4&~tUimyM*$7@Ktb7obTfsJCM;1ybC_ z#6Z3dhYb{q4PT=jakS@a^g^z37<%-kMz7A$2%hLMnNb_Q#+(;4>3{@hg|9vevxc=6 zyRG@T^s>?O%S#srhq#0UEOFMV3ypdKJq;A+jy^QF@eTg+ZtUjOtJASBa5jH@#QK#J zEg1_tblP51a~-M1lBg|1a)zgW!R5yrzNyug(huhZ`vRXdB9S+V_M*(8A*w4y#nip9 z_myrj6=W^7QA_Whh;aS+6j4zgeIx`0L{?-fRgtTNyIy^3TV_IeY0%E63aa=KA)ry8 zM~KGV6m|f31)~TeEarn_{k%@0(Dg{t*Ijcw2Q6f;K8;;qFIqTSqFFDN>1z>YXw7FLyS_AX*WT~q( zcOju47T9CJkNSNag@i0Gx8==vkbz&rWG5;blA4N6?{RZ9QP+{xqxyNoHgD^{U6n=? z@D8V+#uQYJhk&=+#)S~@j@C;Sej`d32`j*{eTc}@TLLUjZ~p3M!)y(g*9+9X^Vd_v z06K6;FdV6%gh`e$iQNs$@_s+x+S(d)4k~mg?*5Ow$(WLHVjsn@8cCocJ&Xef#UF6b zi-A-0y)VSQ=RHK^L4z6^KrnNPB{g&Wms%8)b?xcm&1dvgb-wB^^_L7jNib_CL+WQ{ z78Vsz(V>kE@6G2xcCml1p;3@Fa8Xg<3z$Af?ws0}?zTkCyW7A*jg5^Um-TxtL_dFa z&+iT>&SaV~$YaZqjl}Mn{!rCTUY;is)@ixlY{SCAq1Dn)#*V|l!p7oo5=p#-bp;X{ z1%j_dE8_}L5WpO6J=%|^rN@s6ErK3mdtl(=`u=?T3byCAW{{_-CM_zHQ6JxRa2F$| zrx*U@2KP|?hJ(2KyZzy7z*^m|wE8;yeGlFS?=Jk*249r|6*lFNW6@QWm6?f%g#N_v zUVh7tR8>_4S}h%1`fiWiSQz*CF7duv*pd=~&8H~_) z>$`D^sjjB`D}v-10k{GUR$wv$1#Q;gjC7t+*$&dPe%^s>{16tspgF+J2*unEB%dt= zN;l5sY6&@@n_+?#JV~ldQL^k+5Y4cw7akFDe|wAZyt7K3K4BvX5e4932_%&Y)M3#C zSqbFCZAOXv`1m;}Rv7|FqYjoKC=e}MO(#hu^(reV`5jrN<2-XwT`55}X_VDp;1)m; z>k>$?s`pJ$TzQ@91C=1U9PWYI?GCe(gc6LTaM&?6JGWbRA9s&%x zmwN@MhQhkqdJ1jfY~K@y^)=&XFD)qv=_bzS4T>UVr^gmkP+VL?g#|?bk$U?WSa{(y z`HV@-;Lg<|p1V2C+{Ca~%h~TXxSW`-v+EWx)5fG&-h}teV_ehJgo+$%Kp(|T05g!5 zoaVxBUcAI#J5#uWJ}&8BZ7~o05C)&i=c{$t#E22qUl5c^S!FsQiwUDf{FT0CMa|0EMCryZpA^y2 z(IG7*4TY@7UDa@cO~Czr0eNhmQjzX7l|qNiLn_R|aVvbBJg~fQ6qasL$3aP1euOrW z+Ee)$jEU0b$+@d-s|w3EHdSS32g^BN_XOqY>Kc^i|MdZEe&+knJ%!jCcchD@V z9Ck3)aN4S4r>c6C($yzABuaw@oy`|MWsx@AaX@~vXE-k-FRyRfMmr|*7(gvAFE4{T zT(-TmqmtLRXqOKKX3uQ z5`RblAinCn-!SUj*`Paa^oiaEzlM59!-7Cas7p}JT+Xrnw53n<$i&752Mzsje~%UQ zi@fR5l_F7Rln=P!d-Sa9z37_reL2~C>`xbV17yQFcm-5H$GBzW!(8W`O!IEID`xJ9 z_77YbFA9>YHR(wBQ28U`B+J2}+{1KZa?7;lOYG1k?J>ME{F2;1rC zzV0oB=R7|%t}piAbG61WVofeD>9%-Im{2+=4jzn9yfP!bGgW*fK)%SoN?fLcB?cJ* zA|L;&ssiKV2K}rV@{Cx39drh0o_|{ULy;9!7gSP0W@%}us;X)jYz-1vF|S_F6oCMT zWq2b{gQZ7XH=iw)PYdQ4R>zQkdvSUiUZO;rfRdSQH_d^k1zB5EV>;o6RBL(_zUT0 z^Lj7$_X|ZC59`P^=vdM%dYTx|VZn{d(N<+sS8}?u2?9A0l#jwgJr7+wy+2yo+uO6U zvQj1gE>s`<1?aJ`9l;Ak{4M1*HS(TWwzk(GuueCj=1cJ|u59!MaoSAgm^Omm0HmtB z)0FNTwt`Sj^G}O?d#MIiVxJYRXk6_;o=jUkzU}7GIhDo3MTM;;$<>uq%(Q8|ZkHG{ z+Mz^#;<2zVqK}VB-4tV5dBqiJn5G5%(5#~88muKueC(^1bZ(hXmDP{)c^h> z53!J$$23wj&z9zE8uC$#Xs0zbu||tsRGKi^T~n=lquAQn!IfI_1qzrnFVFbw9CqS9y>dn99svUi6H{!^#0swXBUc64+Ete-7U z#>4jz*jl23e$r#`#YqOBl8T-X^-j#pJ=&;F-+_{B8iE@w(3_g7R^>wYx9_p{)Z$hh zG(Ng8$W^xcpyigS9O2x{4GnwKyefcxL2B!zr{zgR0jA72eJg zLwz$ttsJ$17f6v6ZQ}(#V24!MUf>;a!M<_NA=u4H4auO+c&#hbfvpbI{o!9EOvyKF zKD>m_C`(sXR$;i;`}e!G;+ZP4flQvuUC1b0RGt~)RO$3I=&ydp)2i_lmyV_7wDFx5 zQBFlM!IC-@69@!|6n^_SqEX=+4&B+85#Y~(X0Si!^G4lYltbnn%$bpTU6>1M2+6`4 zM`jgkx;TQ#OOxk%h?t!(W~cUUnQ$dvh}$bIiSxzP^wC{K8^KChlS>Wy2?Ow&b(*|? zVlw^`Cut|fwA{UCqA+1?+BOc)w;~p`wQI{2G=6%sm{F{SE8n9;0r8}im zcjK-%Z@Eds8pHy;f$u3k=vXs3Tdb+`0y-3K1m}&-~C8+M5{? z$Su3}Zw8`5Ez|8PRhWy&KN55KSkx~&sB>OoA_UPJA)l-dj^ zC7nhiBOIHodI4YM45I?RIl&W>6aWv%p!NkOwU2c$f3_A5>$wcIHWIqz|ju4T8ipw-VIF+fsBBlRZ!6kv5Zv( zl}p|XjKtHIA&r8%K_qHL;|#KtK|83>8M+`MRTN4zgt+>E$L8MpiDxF}Ut|_d&``H| zpX|r?x&emS{d%&~`FPWLn)f9OFQnBKkz9;qwRxX^sMb*n=~8#Sh{Z zL7iM08#+-i=GdeFNlnHr2LAbaYEjIyI~4MS{t@WeIWdw*wawA?)0Iz8yD;~(>xy#BgAkwd7ZP5ljM+M9;8dkq-$z18Z0zrTfY1K%gLN8u|t6AS) zo&yJN*PExJ_Jlz1)Al|r5ll!-6JYSRl1K~@FxC5UT$pVr<4ik3cF8M}{4C9gSpGx*##dPXn(TEKFTM}%l`Hnhm-0YfGkDXK2)Q%-an zgESO)Lv&_P5(r`e3PC(}*h|3}QuY8?or|7`?3!lnjnQBbqBI|J7&j?KKdb4b>19Za zlujxhG;NBM$6+k+-ApV@nA(&69rG_WU;FKquR-y`VfcC{G3zOhe~ z^%>C4ecM>z+pZ)XGm7vNzeJYlEx`pjQ6WSqNkLJ9R?KEhGv=uYB8)%=9>C&J!jvzU z!fU-|WM)eJ9luwvk=gSaNnG~#f-hRWT|d3~NW=&)N5B8& zUTu;0-s)GacbLoWrhA$|XQabeTN;Dv(xG5rtdi|j*1Hm7RAZ;C+M*!ot9R%Zo>`l< zTiIAv+EcMN*mgK0i3Aa%0x6iYpN!uty#Pv)ZCY8MOZc8QvPir3&4I|HPOSGEp_z5z z@V|e_nN^*iTg6MLhOhauUp!AKn{F2>Q2Zij%H+$^qbrV%;KD40MqZ*BsnPv`sOZ`u za*lnrTKC<=QdWn_Rk|;G?*sJvN;9>UIez|K^C}A6-Yd^b4=0~KU-kQkP{Yo}2ou2L zLfIPFF##jwDhXs<)bL4Bsdc8WF{jJwbmp{r^UVp81c?+eqz) zr*ngh&)D(P*%B-|57hLEv6Y4@%d(!~4HS9BA6&ot&| z-0gqJ|F}KPDgEFu*WZ8A5GD2>9Kk1j4|tpiGr zN|iFT&rBVquSq{DtseF{b-I>oYQREtbn0F^K96!duQtyYy>oZBg(7{t#&7;we5PHX zBuf%^bcuaap3aVTF7s@2*(sH94<)9io;cqW91;~pSnP^EGpZgU$J24WZnD=m=l_wj zL5F?DTz{w9F(5c*u{d*we8_@u+a{*opXuzeI_a}-E+*UhJQH)9=z+owgI(Th{t)c-h=LqR7< z{=3LH<>}EHTru2;mb9AI?VuR$#sV8DY9ulybLs@I4Mg=Gy?Fur)90QxUC0;6X7_V# zc=_X}$L03cM($I7Kl>!0sDf-%P8L`a&Qebd)fG|5IGaeEI42_k6mA?FFTtU5csLg{ zaud!8IZ;HC^#@>&R3XfrKRM5Oo(cypgJE7!I;U@!`z0u;+K?}M5`=&T+AZsDD!7d- zP6T96HtzzS%Jg3@sy@&e$5&0Yc^%MxeD(LrKKv@IqFe@p5HaH0c+(-4%krsiyYmX^ z0T=~aP*9MPk`l@tUpp^#Wg{n3mz8R5g9s+7wANei(5e?9MuN7uX&v5WHf~7O-&rw| z#4%~%XKGdazDm7k;qzo%!P@$ph}qn{5giC9>b`&4EsKy1E@ysg;K<{;bg8Ao>y0o{WbMc38@{EiSA$HMVN=w`^xX z+6s7)Q&Krk77Nk=~M_ zxq|e^d(Lm!tLnmhB;!|abGQ8YO(lH3%FM{9Xy*;4b*ep&b08%$bjdlp$i@8&5(tkZ z%9sENcdBBLDPgBNZt7HsB6lrKS#vKbo!-g#38hH{2!#uYO*E>?ZsRS|qZc}mN*@H+ z9dQfy8$I1>&aGqLoBn2ZN>MB;S?>Ikrh`|a#8q{q{60@Yb!4_Fw6jf;pmpJ+1v0N^ zmI30Y%exv$rY_S*mupAKX|tR>LtUK&r;hJF%Qe{y5bIY`^;px z!OOq0O|4c1@Yzyb?cJ~$ukA@iBUk}V&~CR;=6`}EPUJz32TjO*bXNs%V#H0UMFX2yjr}S%gHtQYiGw-adEU){E`2Mo) zPU0qxO7EvVGp*zp;!K60&Fu|F$!_nL>)(vZb3TKhmm)K1Bt?F$GKDBBN41xgob!XS zgY4|6>rwsRt!-yj6%B#t>Ehm4;%-YxiCFe^>!t`LY=$sq*xOR zn8F3fgq1`K;Oilqe{43JO_d4iXH6we-u~TGcds^E6kW&WT|2P*x_6>=iR;O9yttRp zy{PL@=Vm>>ytK63WL>5Y?4J}fQr))_i^FQR&o1zjxHu0sB#A*Bq#*ox920b7TArvq zLSFdRYI;ZvNG`qk$*aJHAp<3&6&61ZLKhA{^M zv)EnAknnLp1S29M@wTV4xqQI@v??hbbf%Hpqcdkmyc@Y3uVA3-FvMgf>`^7`bEIKm zFhhv8V%a=+t|gtet71F;j^g_DTn_vN#^><>K#7)%2k#iqc6EJ%Pn_S(8c~#4{Q8ZJ z8wvU72%H+Qx9mv)Gj;=qqvCKLPn9(bfXQ|X;-BvUS@PKcnXQ|LYtmzr2By#tCi`G9 zi4evAW(ENWdh`W>p1X`5IWafnu%XZD@Pd`M;>v)T&LNY@J-EBMEgz7yR}biNi+|sF zZCnZ~%Bh<2)wC-hxVpi`8yIQ%o|rCP4_Namf)MX9Ql*dEnF(<~1rd)spb!PF_8UbM zVJ=JSqSbC$xP-`zHTh1{X|v9t287=;3D?hqownwUpW60+{V>oPuFG6Q|B=z%TX_5q zS~DwLX?oFAUf#Vl=kLw8<jMF$5gE()`@_VRit4!8$9$e!vAb^Ih&eW*V5SnIQGLiB0P5xJ*>oC26HcI!}Hf zs14(pF}g?|R~8+%EAYtmvZo*2pPAs+Z135#$FMn1F1P9Ym!F|P`= zei%ic5+A~HyRlJTd%DUHnfD)MLceV9B9hXV!Z*dTL$y1+9~yqQeHdXC)41dJK4EWaK8kt_sQ9vzhWA zIjUu8N(zeF`g$o@+24}|*1xbH8ZQc4_|~QDcN4-&-5+0<@OZcTL&>+r#dcS!^(34h z)6q#yu5EKgq0ibMpXV846eru)l;=L2>#dHKU$_aiexzwp>ULwI0G$LOaC|Dl%YR06 z$W8o+u_!qfWn;swN`Bm4$!6tlw1yoyNgV?YWFQ8(YqGJ?0C27F7l>+Zb~_qR){VUv zy}jEAIfDJb#=jO>Q%yiKW0sNi zOxRE`lx4o@uaJa|0`p$4q=ylP1rIVT_ZUH<1>T}qRp05x%^zmZ^7DB#+h7+g zOc0nk5a$xPf)#7^38x1@MU^mWmiuy6y!r8Io1bEzJ>a#6Ar2?`~Oo%wwX8XDQw=d!;Y8ndM7tqPk5p~3>(4cB8;HlYYG5712ap}$9r00gh zD8_pvI-Uj$+#+&qTd7$^%)pC(dqxqF)(8@Zr_yL5VPkhV9*7O~Ky5s>;K!bez3bJp z9G#=0nh^C%sNht+3&U+TE(Pq=Gq#erI@LkEajC^-t78y&W-4;%=*p|QN7>of@VK1L zp5*$&jde9hDPp2|6Nu=y5XKkq?@+~cX|L@d+}PS_6lBl_CTw+obsO$eTJ5daT|y)B zaaL$TXn+Xz+D8gl<&k%$sNB;BzRrKmvy#srG*~U!`k(#!sz|F8)q5DHYe@DccbX8D zdXvV4?sUB0;KDfV;tj9u+RZk14-c9A{(P&`wC0%mu*P{&<7Axe^Oy zzIu9i3KTK8++fWYnnGWEGSbX9qFT05n~?=mldZZ+H{F<6W$b&6R_s~Rg`m7rKW zuSXAWH%R+&x*3w{Zf`2L@audomh;o;#7ZYSz(c#OVY78a+!DWWa*JASXXhP5Y- ziitN2+*{t=u5`vOao(k21c_z2|8fV6m)d5l7!mD0&PHju`2yZ-LT5?OV-xKyS`Z#T z8GVfNY%?N@UsXHsi)jc99=nR%jw?o)PfFN7tGb8#c^@!{D}>Z8z#o zC%V7iFNnq0lNLk55^Aop@)mT!^b>No4Nl5hRBv(6dICwND)wM&+3~N9I2&V0Ll*N{ z4v&w4e7ZV2$z(GYOXYKKZyku4#%8iOnYp;I;)4CmuRL(ve01&su=SynpDiGv99uWH z)wW)NBVOk>>%kLCz&KakpP8!7pjz}jj+s}@9(-tN3AKbeZ{{C-@h#3s-uqtQ>3vz{ z=mmo7D7eWh@6&B$;?SSR+wvHkeEr>Hk&I5y#D{*e*}Yf3@qZIeA;t{9mTAFbav%Nd zFXKgR%V8WjC{8T%uN>-PQ?=~U-;ytrK8Kg`2Uxs7Xi+WdRJ<>8uU~Vx-D9YewB0ON z)>nHSrI%xpm8=pIj2t<5f&$>N-0vQnvM;);s%@hpK67d4?E=#H7)g3Na<^s?1DA@I z@?b5}5%B3r)TT7ww*NRLF1mQ*?iqpJ!bXnHogy|C?Ynp-_EfS3FTL+D#rRkI@=eaq zE5U{R{>mDz7aNc(cQ6V88ezZ==7M3g2dAfpuKraCgP=3xMMFP>)2MQ{^!1-4KTc+N zRsz9F52>xonakiVsayN}o?S7U$|!aS(qvk0dq~{9185qOKIvg!sSJtB{W=7V5P*oH zq>3;AT_csDaSzWut4EFe^}HKxcA}N({pESs+x|8)-S9UqLmm$_=wMcwTUsfC%Q2 zB*EfcKc+zE6ET|KhIe~4H`;dGR*}0Z2y`kcDmtG`tA28O_q3<*5RBDo&@5FFV&dp6 zR<99n`kcVwubmHsp<*x=&@Wu2k!C`@TO;WwN7s z6D`SsK(_||COui@^!6bsnAwZps1kS3ffi+K+Q)4gGW=%9I&B0lz7Rn-_GI5(W=GI0QT&n zSelB888t8E0n~oodpcVR{*zPr^r~gaGk>1y1p9t{r^@};>UWITg6QVp0${(fIS&(- zahoRLWa8GM{x>{aqs{54SUPq61t*q@r-xDD20y|`HD5Hlwq0P>zYMumUf@-l%|_?- zZ2yCGe(_efZO@u~@{8c&9!wwsnhX{OHoNnD@F`l`oj^#@0}{`I4i+BXQG`jHJa)6y z-&agg7qCN8^parhUW3zDe11Zxn_XOa85H5cJ-Q)GcENuO3?B(dC|+%DE~s1e z5m=m}2@Si+tBwwYaP+ok7^fK+)WN+S442DJ{;s4%jZ6aV1*vT$WAT?sY<<37@U7*- z`6KO*$L@E2T75y~QoIieexv{6WmKtnS0~@=FeE4C`ly^aw85|C#(!MX)_~T@KKopG zP^xCT;cm4uy)$j&_cwFU%2KDzNcXjGtrQ-gR>)S2OJht#sMVE#3<GCrffxHqij>9?YF09$^WOc;_*Cl&=I?E$ha3DJ z&@iBs>@r)caw`k6gu4|wu>)_|?{68I)ewz%9^R-=ojMG-G?w#EdG>?c6)A(q{^2?R z{kE;ZV*tX0YF9G}g4ZF=X1~kuRuzH3A|p>GY}05#TMw_3rw{dLdWw>gl5XQq^(z?C z4d&d#!HIxjisV2jHl;*m(UM}p2VJwtEJJJSkLI|L_q`#g?_{5swZpsoGC0NeAt8=Z z7Ed1sfet{!_ngkL4g!em%Uzx5SP9ACGI_!SF9@IsYoK`sfZv zsWZ|F?2K&RjVx1nv4s_@1Y5B_-uVTl4C@f%($})KYN43{U1MY8^}@$(5_xOysT3RZ z6V)_WgXm|^nfd!@#(z1qPK^cQgmm(XP>!~|16d*^X}gAhMFP?_wKEUO$UKv$^x(#? zMwe*vL%hR_G2d3N`svL&o&wHI5dI1gARKmj=-o^3aP?}tz63mw4UxXhT=M(8LZIGF zrT(Pdujt?v#Tpz%_P-_R!R={}2=c1Ja9j|^n#@{-W8$OCvksvD*{hG(C;#)>_ITq* zTb~sHUD%;?2Tf>ORL-;LdmAI+{Qm$9LG!+53a|J0#Dj7sFlEmja$WMBb3Z7dViDPS z%#2TeegwF@jt^J`LH%UqyDu{`FNfW|74yy}mfF{dIh*;Jn92=ZjrA;{cLs5L z;c~gpv!9tzsUGfLnl5dWL!5b`4Pp{0^y?czB!<9stcQ8g;<-y^Zoe^$(ol#Zu6V-y z*`BBF? zELkkaPT0p2x*`CG!<7aJC-ndYT%};B`H@oM`SWr ztlo%_%tScan$^=`k$B0piS3PHDLQ(rdu2ZF`TZIWTk!6Mwx0LLP$5}GN8ami>tkl# z`P&*BJam{7u@>p)|G~-cmiCi~ZHO>WYGOg4qUH#J%@-48lCGI7No3-k$U7f>G4tI^ z6kVrI-ldGe z-h*vEnlz{vP1oqr|7=T}OolzoYlzLN1<fp{{&#~I^dc}y7;CydhbPguVTS+Dq!zoyHhwl z``LT%^*lX$#frT*M8S%RD82U*NFbCD(vwX#-vsQ8SoGpB$fNckkKpoh2^~B3T`2TSHlyr`4Wx*uHlRIHApr_YMpI$ zfQn$Ir}FWxzYhA@L0ncX$fmKQ(ipE&8Ty(eV{NjhwKh1+bSaI%u5GbHne1(5Wn?0~ zpp?Vni3fTcgTctbR2_@y0Q!Fg#F-^EPm{_X#+K-*6J0Dchj%r#G*JC{nh-&tu-KCD zI9eW^J<8WSz{AK~U!?=YZFIPg&M3d~vY?D9aJSM9>Stx7O@=z?>%J)qjh!sX9 zmAu_I)0iC5{NavX*4iCVQyRe%WaqV%xZJ8OlRcfxH9A229mJ>>EDedZ&{thM(G}OB zowOxPFFO^BMxi!O_9PQ99U%UkVzMgMoln>rgfc6RRExif+wtp)`Y zDl04N@#Dw)_wTQ}b22>pZcOpX`M!D@#Ge<$905FW*GnKI__-T)AoXjsY15`@)26kZ z@d|G}_}D|u7*zCO34XWNXfpbwHL z42!=c5uYvK^$nQKtgMVZJ-bM(fx}_IZF!)33>J}mNQA|L|1e^aM1FySz%4YmLZL8d znH0jn-~oaLXDNaL>7)`dEJd(#_bJe#VMBCO38Drv7B}t>%~Xf-cxwPaus|#gSo64) zDfsVj;z_%s4$SPbZ)TU4E-{P8NTJ?_W&E~`OALx&pz3I6@=H?^1Gd*7Zpai0PK8LJ zkP)d&B;Zryj#S$Rjp#RUct2-6#d+PbKp8=0s9)gqdl%-7=&9r0i^D-yFYc0s8Q9w# z8n^QPG@WP8^Nv?sU1|`x%eU*0p}ieQ8XgM*jXeXGyoh=OAu=|bBW)<(ra1KjM8abp z*9NShRqe^P zkQ584@FDKk7nf1!2E8sQh-8SA$Ak=ZzOh+o%a$#}h7D`@4KkVB$WtEU8CARBgCY>| zl@*nmnp$;Gt4n~w-~{Yyh@eWq$S^W7jzSDtfA7Sq;e2+rhPIAKBq9)Tl@(Q5np!eM z%;Li8Dn!7rtC=iS70Q>*9~&DR930#XCzs1k#g6Q5-aH4Yt;UIe{p%%AT>*j#O0j7# zW0aa3yGmu^e@mbB@E&o@Fv0b6!hzj**A9iI>i7q39c|v*XSSmk)_eBh*kwIWJbcr2 z)O36M?(+sn4_{0(7&LwTFvCFu<`UH{100La#t{BFwZ~Z>O+<;u1WL-~*nALrd zSkvh2gS}`78{`vc*uy%z6c>4ES&s=z9PE3|^HurlUUU^p>*_|2ovD`oxyQ;?2*wk) zy5aNYgp}=_?p_ZI9GaL__{u=rvT+{;K%4+LYhopUlz2RW$NS8|qX>lseYS2J5F}s; z4lMK&3V3K7p3P?0|B74tD;x&m3xrUuvAM9Je1SyKyaw7eMb2NIB$lQWRxcRgs5}rO zG6aokreu6!X|EBRU))~XTS+T6u;TX<;pcTB0RqQy-k3V+OArWsW$~Q-*De@C zg$pmn2!u7)9-I@%co2%j5hUH(b8YX;F(3`aX28DngFJLbrdHm%ylAS_Vs+TqaiLsx zdiu2)gMTR~HhqwM0RE_tAx%&@0D|-K^6Ko9+lVZbm6Zib)rec0#;KpXAvhkz(HJb@ zepu{>F$Vj>E+Y2fJf5AVoipJ+Ka6fr3_sh8Kd#yN3iWo2Ak+{u$CSu9rb%ZfzeGt0&qbrd}3K3zAe3;B?oa#>K!-dF0f4a@dFCP z@8iGH$QX6<>|vQqf>~djYa)! zwm&M8LTrf)K>^tmg%-=;FH|4w%Xha1be`Ar%A%E&VvLKL3Stx*1+{WuI~@#Z5wv#ol&OeSV*tz8%77Y{8 z-0f=*R!VSnX^3dajkiB)K{_(>df>#D;Lns9Uf#tBpQF+CU}( zG1Bb!v;@L*)Cd5<6L!96(RpII&iiHUW4Jljqsv$C+QgEPuWsm8l$Ue;+;1+!2Js*+ zU(dxd<>->|Q{K}z6AFtej5>G0iNH_9GVaCmW0xPk(QWh?KEyHW)~g26Jhi~JATRIo zkLimHa8!ufmNeBxeedDDw)UIaoEuFS3Tt8k5&jtywXqltcsuf#< z>@-o1)=QUfnxvk1un@v-J@jsQ1({7SgCE6#E&Ah6o|}?AEPg=1h-R z`KP6WubPq7q!Bi{4sI{59O200aW`HbCC#B~sS-wSeFlb}1;=9Arp?2p<-KPgdfQUs zgam=3;;y-RJHv=bnO}uQV`8G84eGL>=~FqSG)A>n1c~rX$J;0hn!uC67zm6HU{F9L zG87q25X(f84~!rDOBBfj(hv8A5*b89V+DwWRC^|)Ng^2^4G{<^G#3#N!M}(QhsKK$ zF%E^tfG#gr@uhs^8_R4MG?p4K^z|6gLQL*6iqEa|wAN{}bLa87RXXZKGhM~|rN^Rb zH7%(;M43`SEQ7wAVd&^-F;d+!C6`^jTriEQFFZ&HzN&8OSW>G?@@wzZv;O*j>n<=T zpb(%?Xz-5+oCTmNQ1Y1&N$pHB7(>8_1=l{3KqAS7@46IY#4(2LMLKEEv@H6(>;Yv>eJ)|QJ1_4hP;@t)c|FF-&ItEepVur*L@i+fsY z2mSr(?BX7Z2XWnWM1vqk6~%5&Fx@@MXx!T9JDdIc{c%Nn_2OH0SUFTPa6;&dOMeV9 zpLqS%?{_6#Mw3$y7dbIDO9WkG{jCJcEcUZ6$3jT2r<8U~4 z4;L4yBcI1tl(7K-*yUIBTQT%adL&(V?0ghbkL zmzQr!88c&00_)xIfs=PV+~XlhT)+7*|Lt=jQ;Xf6tKWB%Sxi|c5u;&<)oIYcS>B7C zJ@EgWSm5XLr&mwywIlgbMA8t5WzECK$3Av`kk*|~*fhz5Rt@WFYowP7dpPMSb2vf} z1V%pQ?Trx$RTFee@AeibEIPL5yxU}gY}N851t!Db>f(vBw;H1|#(6`(4l>xVWrJCl z*=P*9rUoJd72CAWA@4r#{5=Eb?iMxGp%K(VvpSfTnQN0TJD1YS-j^PB_44`>YAq%Z zqYDZ%EhG~xt<04pFE&DNGRpNeNLGfQcZ`aP3M(tCx)rYv%fE`F$OQWCn`xUTI3&{X z?wy*`bFer_(qg7>H=f6Cp5&%*P8_`F)tN;tAWnckLnDI#tyQ!u#5Y~Cub7^+OVg0UZ``K^^T0ud4k<)a<} z;9dry5C}tn#C(WAlHXS*C;o9)G!1iNc?g~6@|bD+-yn!=N`MUskMV4ud*gCTIpr*2 zcZYv%R%Xte>FMb?efo6J$G$L8XeI@2dv%2p&x@A&^9+)v}_w6%F#!mW2kM}U- z_QOewPJ5S~n0@VSVhYC+3@=z{{uq~IH&XCY_R=#clT=S@j6C^pvDfG$af^nzpS+$Z zY-sd-{5E!Lkb*fet%^^r;C8cDyugP3kx}x*yzWFi#@A8Lv)%6QTy*?hJ%W!OJ-TSo zB5(!>4i68fQmH@w{_#7W3&qlFtNMJ2;5rh)5MSKD!RCnu_wT_K3TnzrRUM}hA*e`MrFn2R5fk^BZlF(G4E6O9(o#W$SFj6 zLGc7Pj+KpFQ-Yl}ou=-69kS53ErK{Ap5D*h5ZzAvL48a^)<3zw@sq7nT3T8~MMVmk z`dAtgyJfNm0rzbXfcghQ3yZ}P3WYzCqZE-{f5#lx^@oN;Ff5bFWKB&?B2mFRLm#{= z?&V_8Qk#8#&^;%ulJ`8hRMy^T{PySd*Fb^0d-pE5z+$lqdHJ+`ua*BrVu|$dgUmKt z;lKU$vgKa>qw{t~+T^G-Mmu7_0jnRwQsmMKxefH>$&=;NNjGj-TU$f5roBJ@{o$LCfy9Yz4eWo2c>#l?UhD9s`ee;$r*N-}eE^Z599aIt318U^OQ^I9^}#t=MY zL!@#tQVfX4?|9zoRW^P9o3A}8C@28u!-o%Zx!mmR>=r7(;Ps8QnU0Q5US3{H33*hB=Xsk5B*p@-Rrfdi842 zGK}8xtdXa)XU~p{ixUckI2=ylSqsGypt&wS(I&=2&om^TAaVl}cT_crnnNfB@?2>-+lkYvq(-+Wt2uzF6b%@bE}TNB|du1`P@e3;U7x z^EiShHxg|eE%Z#Zq>}G2&q2w3CSbA>ifU?V`~y9jVGfaVb9sT3Nb0qre9w@fJ0DzF zGP}aeGByu?b>IB@G;7Yq2l-js7^$_&RJ0=3ct&(LujYw0l^Y3S|DB9^!#^xl0P*+D zn>XR%;g>I8-nVa`(hv+(s|md=KfZJ2$`v5~)-3@}o;W&^gddZR{Ha0d*d=D7?-#*H6_i-dr@Q73y zF5@v+Oj&VNQ9*J4u^vS7cNqOtbH#z%o`r4l$75SRT7`m3aCcq5(-Aq!`~dc+J9@LT zvz3hCAsZs=5iFnN8anjRqerf;t^@+%*s)`cBUp+c4==rYaVwLa%`eX2zygiE2PT;s zX>{-6gp;Ar5(!rzkpbaBhDHGYm7$~(87u~D8N*|9fs%-15KevvMNpM- zr<{z&RK8nrD?uuif%Nh-iZpaoS1>-JU@=dKAQCAClJfWxsRZyaG`b`NZ|7QG2p4B? zK`|bji;s>-`^w@jwE0rf^aF3W0$5W;?t;24AXxDr#^cbMDukL(fmNs3)Ll2*<4EPOEUP>G_Jjqy_uDfNGOrOa?Amw!t4SS|0U%~C+7eC&zZCP zQ|O|#!M`NlSa{>F2}L)Ti8a+n4G&Nuspj39TOc6gF&Gk2YuX6AE7#5(JaRyS!2(=H zUOXDy*XQNopc;%y-krszBKe-&vgqBb4jwvvc3)N{{OZPm-ZSSAP^gy&$E);SZ%>gs zW0JrKD2AiEwSm5AQ5v@>m3L;>)AWMMdNu*X>$MZyj?e9`(#G7Uw@A#6SqGz!{Mij$ z=C&m?>Mn5G^J}Yq`S+`5&9b((25P13Tf0g@0??VOtE*}Bl7iggsytMeu09$%DnNK8 zlht^94vs*Pinv6w3P>sx@MS2BDiO;O!m1=3hcBd1RCzou8b^d+0fZ$IuxNo$OePaS zC*X@jWIR?Nf>l&hIXpgvOaiqf7IMIAxqL2}OaU(x2>2ut1&u;@d;u0uL0~RY>)sBF z!xrU~re`ObyHQL{&5R6<)YR0lSZu5Bn0I2FuS z9y}heqN1XhM$Jl~sX}I6-CX2e@{pEwhX`s0u-fzK5CT& zVnEAJ#qONq-SqSs2}L=H4DVh}K!Zl4EmJC#oZqC!<%?i$K%f`u`yDgKWK}#%E?p7m zTKBJ)m)EOTufQ3MGhMrOjfsi*aic}+1q#+o9j0*1VIyki^)pK zr!zBbz4eTZObrbURa8_IyAA0-1!6!IHNxW$vsaIIZCEE`@glD!+BjHh8)!(xFba*S z({(UtG?&9f5!BW27#NYF(VtW?4u{`-=IZL-MtnEUQJANfw+@-IY4xmM%eCE(uAdLf zCtOkQqf%|$^qjmc8vpg=zoV9pc6PDQtot`HF%huOVZ(-j5oXSuIfo7%YKaO2Oj;xo zRa8{c=+xY_5)nhgv$F?*gl+m%F^~sps<{bC@Ad6b7M)CtjZ8E(HNjxm?$~Xsf%t=B z$KcLA60`GnF9&n=r#IqdV!WfLHDE3OW{t+~Tj;**PzK;cU8l^AU)Se2!`C!*t>M^^ zTT5-$9L*F8`2-@_cjD}%>pSz=s_wsdz?muTe{8xu!^gyJz^~nnE=AGRJ>22UM9-N! z4tAxX2On77+cqpdwg39dPZry)eXUPD+U?}yQY%ALYPtxBj8BeEQ=f3kQ%(FCm#QkS z$;&F}GsZ2cgqu!fy-qJT)uC+o&7JgVJO>8{hm4GjL4yWyx!k}0`m0NqF3M>wP-!5? z(z4PLT5(={rM`-NCp&W~BK_Ev5>N?b2$YhTCMMBs-3*KY8`sk#lgZ79!O>nw85>$G z^;Pa~=qI(NDBn+(?lnSkKQ<7XXs9P3YhAN2bQq3{)ssOCRz zM$m}|)=~-JI<<$4S6V_XrZFH}V`slArifKgkoqWvW7NHf&5%kU6IcH#rjVJJS8mC_ zzhkccfMC8*RQ%>q-tWG)IyfetNH1VOM1TWnb>>~w!Ta6FLaC&_;ZdOBW1c6lB!%`~ zCR}b+Pe#k@(+`4yXR}I%I*n`N(5Mw-!0r zT4rPybbz?kNNyb~6f&!sv=aFoDk~rF>E*4WL6X4VZ8K0OBqYVA@i4`<9)>^}*Vogh zP$=zP8E=s40(L+U7lrec!HH^yUV%fqM7AeWxy2l-q7oH8*aYqunoBDp1%J?33W&Y{;$ z*tIT=8a3+b)vL>m%wg-ES-12nyjnvOE_q|YDj*eY4CT)A@b z;>GLMt&5J1HZ?W9d-ra?e*K<2c`|e6%%ew-e#e9(3>O?bO3~G6wr^{>IE==~5NY#2 zMkeDhnYMH0c7RyfbT6j3w~M|S8L#Ag2Mibx9v%)Z?Ck8ava)P#ZL_npoA)Xq1hFrM z>Uno=b_+s8EY!q+E_H@)Uk@LcaPF+jhD|^@ZeK8H-`Wpg!%9YQ-Hs!G;IU)J-n@BJ zOG^tukY*rQD3(s%9Toa49}6LnPzdpPA0M;_J92Aqr4c*g=~8yV>v4b1Ea4Istyuy| zB`Y?qgd~z>8&(!PzHs874e8X{;2ML+G!cx=DE@W_V73q=V|C~|Ifj-L=9DtX%N2Z2tzX*O9OAB49yt%WTJ9oZ+ z|9;l2S>E2>>gwu1hXXf(GWYfI8A>i>UU^xNL*uBDus(J=p4K|1Iurvf65xbHJVslM zAdw(4z!wEVi1TS&1;AOkys(J(Q~SV{Q)3H`{0$Mf#Z0I1A!p+IJjP&ESOwyC zK3tr>a}PuiKviD^bC9;nVYwZP6Mr6#IXJt;EpLAR{r49yUgYQJo12^K>gvYE#!98q zFPBS_3z!G*WwQD3lF?4yHs2A}lMBOw{r~7XI(;GKe$*}~)CY07?&8D04W+4Def%s< z{m<)v^6#BbDE{damu)-R-P(J5<;0`6KD)8HPs_bOIXQX4gb8VBX=l!y0sTBUIJl^& zsP0i6g5PCV?!1~Zu(RkKE5JWAfWq+zCZeds$kXao|l!B~O7bOiD_syKr=L z{QK{}$BY?M_wT~v?{2&&!1;!X9MjGsBZNWw?j8RdAv2Ced#q>NyT}ojLtnBlHTQN8<0JESU0kk@n5Aj z1mY)&rTgxr&l+ss%SoS1!k`q|7#t3#PoF;H#*G77nyRX5w{G2{qoeB{r509SdQq@7 z$g^EE7>mhyb~D-0!^+T9TOw&-of(Zmv#PiW(HY$bI_eu~c7RwJRLvF7J{0}2KQ)CA zjYcyzHU<{}yFgc~tgN)MvdYZNT(Dq4{m$f+!s;t83tHD1-Zx1ql}0^CMWYC=KGtGU z{qnL*Rh7)<2)@$MWhyFU4p;sZN5Ew#7gbj=`;K(S6BIcCym|BHwQJY@>@u+wLB?%w zsW=I7adDB6a^L^Dy1L-3udn}wKmN!zE9B*-mD~<_TawKw&F9hc{yif84tkv}qv!G2 zl`=OQ<3+(^_JyXF6^Pf3|8+pXa3)oh^Wy2?fkU6XmvnYk zk4ujE(ZCB978dj8&zH&l2?;zrJf1vx(u&p9Y9KxxkzHKDRrqVgV)4ge4aj7&L?StP z@+5=7sJ|KXca%WXw$z{+Cg=LGsD$UmW%>M)EY8=ClheB9l*)=TIW-KKtCb{lbL{ zB9RD>$Afc&?lFJg`}*`k-!>p5Ag>>$ig{>9&raXBeekn|<Os$e|)Pszl4 zZ>297;i!<+&47RaEiEko){PrCnwy&!6%|dJHtpE4V+}4lMJCb>G|A598m)+3M25t^ zN==Ne=JC(Gv6*46;WW5$f>(W3{zSXfw?LIS6@2@t0hvDkdLn}dS; z#Xco8dI_yKKapi)=3?z+CTY}fqKM0+5TT4xiJhqq zPRfnTF7a^lOnSC89_cm0Q-9d}L#KDFvNzFq8=uhGy(_zl4hvW)4HG<$n4X^M*a-|t>$;4Ud}ml=8Tt@my3(bs4Y)# zuIbyv*-wc?!e+BeOG|U}a%kxSOCwivtET!!!r`#=;)?9NBvV(CnVH-LhlYlRlAUJ5 zu;k^vWK}gaC+|*TAq;Ysz(~xqR9jC&8z+-?3F1Nq7cfO%M?ED961lPt5H%%1vEMrG0=H(8)(R ze<)F$@L%;PVq1S@e&GH4_lFD_GHTQ)fVSt)pMUHb|7lXGxt@xZp{jx=>7)XIfWcq@ z!J{a%+}K*n*w9p8U%wenv#F1F1pIzJla_XG?Qs9icZf1!)T>yZEA3=$F40QgkPf+&GjyrFu$^>zLZ)4?TBoqqAjT?98&Yi%( zK!7cv+5-fG`}GKp&92l|BPa^NwR{(&QcG4=Ry}`g;#(#W+|NlnI^9Xt*oz239zo|4 z&P@-QYWHhM7V#_n2M7rm49U^MQY-?f#dPcEA+H1h{6pPR09!elf(u5W5C|UN&56;O z&fQF`9E{r*CqD8ZbJpMnoc^9&5^$U`;`RC2vwY2tyrwE7uX1{I`2F+=!9F;A%g#$| z+qTWe$H&jl4-DTxjcefRB6ELnH2`cFYPXb~Qk?O=)UAu1wzfJD&$w)!y8)^cZ2-RomomZ4aZcaY>OeY-ycz#4B9B{*FiS;P6nV%{ zZ%&o`nn@Rhg~nzi7Af#sCQh8#wQJXqkdRfYRsjUReEG6L1P|NzB*@RYy&(Af)4b7J zpFK*T7nd+^op_b-w1k$;FG}MO&>HSt98fsbE&*Lsh>%ZzUkwar?6O@4R`roU!U0?F zAdGkY{))gblXkyhcJE~#{yZ+}+5(;k*T>5~DJ3~4a&y?LxIw{__*s|k7YZw@I6NVe z^ZcL7&!ZNM@j+2koIEw(CdQ0iyoZRX89j63o^?a^J;|4%Rr&`6^z73UCzWdHs(W{L zt)?TOFrY}0S5u=Nrqo4zYlWR1LH(?f3#vc6Ibzi*aIVM-pSUX&g7o$bQhV~`*_AZz zH{X_*PP-lQwltqxSt6`16}xqIu(UT4a7F+3FaQ5TigfPnq@%4@Q7m9F;EZ>rH&4E* zspdBC6YA{afcX33#fxj#uGQV_)$8*)koQ@Yry_FiuJ70Ov71y-z2bBnxR}(}>iVi* zyiD;Wv`nU`xFEM!9%D};{cynY@Q$VBQjAPkRr1w}%bseR0Po^-g~K4xdq1Q>A95hh026e(1p9 z(LJebNX^vS*UeX)^GH|}GjQgTz@dQ>7?C3A%eNjqz8S{i!}Vp5&ss9rx!HMiW_Ctq z8W7%E$97`N<>WPAiAM8H;&X)&*W%5s%*?FyY6Y?%B`hAB{5D%f6Wh6u-8ZM7G&MEL z%F2chA08hczkdDtIdkSTn5?9dzv)ua@wwgF1@{GGMT0#JVB>@Tb2`1Kh+3S&cX9GE z?W7NjVWpN&ZUKTyc$>n7Xx6RfEg}MU~JJjRH7Jac*g5UXr;h#mvmq(9lR-UHxm5+^uO8 z&lSS+j=np!paIpoqO|(??Nmn(TTLC+`fyhSL7Lr|wOJ8&MPf;D)Zcs4?DowX^1VK5 zWN9a#Yt8Rt_=)oyG?sL5|FRz4oUY}XYz^#Q-zInhE+>u3=hyTZ>5jvF-rqu>=8frL zL9E?3wf201KqT4yhuo!_n301mOF|pEKmKJa$a5l&{8a}7)C!&yK`ix~ zGiOrg{~U}z`+BUqWh~%V$LuR|S=~)jFmhw)y^XPt&p!x9DH0YD&2jmyECsO)-Lq)NhdbI={&ZQ{{M>*HiK z&yT3v_lA(~k#khlAU;R#LJG8nmKMZhLjUJCFsB?*F(jaVz}+PV$Esmz*fuQK%sd!< z^iKuIJavLcO-;=Q!6TV(XX#;JrrWqx6AFb+Ps-q9ORU}WjSWpd6B63)JaNNQR6(9# zsA92LG#V{2=UGt_&(+z}%-ZlX*$YOi5n;jW1AlD2&s;fD5~i==JN4+oDSc_G&R6#C z-BEm+ClHNZb9HLqP}sinM1epoL1YA7G9=~+paICUxx1NNjrFBiO|(E1eqq)8t@{FZ zoKX|MI&@-DXNQ}Hc!=aM+7bhO8Rrme7SGGdphTlVkU7hsEjiS9m$cMCIW zg|ow)f^$8uGwjYD*zw}Qc}V;{+zyTAR9C7u6mEL$xr9B_IxB|lqfmG}UbmLq+}vbC z5 zUZd?X_`5*dZ^-Z`FCTO=@cQRLq;d2vMg}H2Iyxj0sfl%+l+WCJ zIqAskZn_%8>YFPxo&6vg(pIVuN2*|PUJ9H-9_M&jX{Qub@0-!ZT(1>`^^u#O-dfwY zMVL<8SD)*{XxiJ`*M-rnuCAujX?Zz?mDy-FH!lrsRnXU)!EOsOi>ZwCPV!)kW+sM) z4&D1T&%d-=C#~zN>bx7u@F)o+5j6?K_*$3O4TOu7L29Z{4fiWP3mSjgKnDeXraEMi zSQ?*Kb!T0_|HoNsP3qQbNc7A5aVKY4OgW;B{s}<*8OsENkwGnaczA+ggwN;8jbKVk zvXkgU*wo3@{%d0kMm~KeNKTH|v=Up{nQI#w_w%sD+(xO;4)$jH=)i|cM2{QFwA=GL+5?#rJpS~{mF;^M~f zZq6%TEM5L*`n|iCk1hLc&f3l6oZZ&ETC!|T=EDmYkFGztbMO5O?tvp~D(;+%szL6* z6h)k!4#8i3yG$s-bhg!bvi*Z0)Wn@H&MfMQ$F-&hGk{=C6e<&z{buXD=H%Y})2Ez% zc5uT3)m_v3{`W!r8K42x8^QGOm0RD+739)VY7wVBUB8+qmX@*E5F#jJaZnl}zu`ld5AAg5WxcruBu;1Su!w2segRq;_}|PbWU1P_3&osCKVL7BMOvp$vj)q>Rj0JTq;F?qBv{0N)+gQj}9IPUaf0 zM8+3M)`uo49Kru-PFzc{RCf7!{-l0Z${hpb;i-8%p2B0Sf8VqO4o9I-fC}-oQE1Pt zw1p#_l(Sh$Dv`bkPt!J1cl0#x0P%Ozixh@B1?T?hx>^U-Nfg?u1fvhGxncX!`)A@$ z&ApU1v;SZ!!haO;Z2#QBaonzFPdC%yT54%-n~WY-w$1=sVN z7-g-Zj1_e+&84%Au7M`pNbmZg!$Unmg11Ab8yN z7c8E*1H1JE5L{L*7_;qJgHM^|>>I~lrMxOF%@Y)7a8ya!UcQcC)R&5-hy?lfkP#;h zwB#Zb1V!pSqOYN(aOurlaGywlr|h{alOi&y3>*kJJb#!HAZw(6mk9}|QN;w?}t|J3YQr*hA zKqNgGp7Y0&JI`)p7H9GcQrI;N$g`WPiaJFo-y{NnGC`Hw9R&MzTCI$lSKN1_q07NFnQTdiA2EsF~BC+ z&yvMrm6qlf6;Y|ld?!113p=C6jIKD@>^^64Y}VU*5sObf^K|hPNbr`L0L2K8N$6R5 z=V9_79~WnlNc!uV&`Ci9CJpStW}**Fa@cp{!aqBX!cs)d#G|LNngDKek*Ic`Qrw#q zE>vvoW@v0^I$@Eo+=1;+B@;J7%TL9+b<&#nOQ(*i_>AhNy=z?_mgHtqxy2;!u3jo? zq`IBPEloH)Et(M}yz@s$|~xp8oLd3gz) znw!W_$C|r%IVcd&Xf&F`;>X9uX;_M_Y|RV}KI~I!#BiVk#9yUHakK;XGLHV)%|wUN zQ5#<)7>4D7M_Fl6p?p`8wYjTFCj;qsS$oUlWT8?MGI*FeA;CmnU!P1SH{DLF1H?_D zvyr)X-WDI6)y3#%4L#d*!9%_!r;L`DRm?3Sxwv?cD1eaLsho)B)n}CVCZr*{L`OQ}sn79Z7_rR5Q-Fx;QGgWZdybBoV_%A%k1a5-_=9fJkaNUzLni zA>vd?IMD0NbjfDAD&~5WPKIg(92$deyJO7%1Yqwf;HpZx_`Uaa(A^EvNGOPyi0#^~ ztFGOhYuCDKuN`Y(t=$C{Dj#`NH3v`z zYeO{(88*;huox5;ovgv8sPmp{*hqvfigfB zq8O1~%*`nkWS8)AOZhyZlp~OGg;IeSvociiu+nrg*96K>M~(iYMt*?!TWxw?nINZ> zACp-Ton8T&bv<>umMY!BRNY*UZEK{e1sYFM^9(5gN*8GQh?KH7Y2^hK!s1FHgGL6F z+S^_S6i?+}N34HSW<*t4$>%KS12lrJzFa_+8=oXPIU?Z2z_feLRh8f&~AN z(rWR!r|B=^irbi|kN3B-F;x8l;ua*p%DMeI@A8W*YXjBZo<_YqjS%>Ur|DY)_(tI4 zbdEqWqpy8uXT2XFZZ=OsNL%&;9Sn zi}>Q**Au$9=+EriruFt_Hz$ZQi+QV0ztPiRtQzU6$)^5*R5RKh8_vhXWL9kd#nVDx z6 zy)9I-OL%h+MU3rgIn2-e2Z;Xx-z9%VQb@?=pWT1>cR!P?tgOR_4-XkKL{+spZ7h*U zbo=)0u3fwO_{dhaE2|dG+#lY{%V<&$n;#&Cmi`q9!|=9=9zXE1V3VT#tQ!V~^ZY{-BMI1!A zU$maMc<0H$?mn2}cpm{Fbc$?Ta;=5=_Pra%wdD$=JytzDJln_8phY;96-g%w$^`>A zJbt(-;0J;m0OHT2tf274sgArr|qi z(d}*deqBlP^4FycyNdmc2h&%_v4dPRC+MIbi=93!$~ zVM(xVN!XEnG4I|!u<}!Ct5JUR8e@Z(A>$`&2cm*K9naFsu3G=i2x8==EJ7lQQX6lK zFsjz)ZQk(DS{vcY9ba7c{Cw$g*OJyj(7>clLEYSFhf#+@Sfn1RY{2~ZunTXYi*R^wbq85N{E!UIQX{lfET7$)G-1DK=B#iEqb8o_L(Bm6;Y zDcd*TC!nBVt`zx1kxA!`3rSs7zPPB=Z{%Vweo(b13*bnIj0Q^7zan{SbEi7OFBXbpTI}02RvkGcpVeDzwJ_C@xxD zBP=H^g$yj2rws@T5Xjg4r?vQlkyqRkPl6MD|sRV-qnle&|mD9 zMU0)p_0y)by|2Q|u!sd*VgBpGxUarX1RWk$?06AS&#`A$OW?s3Eu7VvOt!`)T8l(w zsWOa=x%}q)jbN~=TfTOJ-MK;3n=9?slYhM#N%lxwT`hlaiid-KBfE6m;IcVCj}jV z%DY|Xo?QG=*Aepn6IlLdv`;ydhadnG{pmc>RFII~d2^s}H#7=U_^1@|;TU?vIIIW* zno)1muXW>rl2F~?@gaIvP*v_KPYVoWX>s{@d(b)sVl-%npZe7^etdOj zb**8aN{kI((%ztHzGbal+QNK@ack78)$(RVh?iomY^`rO%$3PbP2S8vdsY&nj%7_j z820-OlIQtT99a)qv5NIw4cJFTP#+shc)mPnrv~)K#&&IE?y3Zihc1N|!QbR_tI8TO zn6YL>;n<{wheKD zMT+*X$r zvy}C%<)X7&XvKiD3N_?V4l23_beZcj+XqjNA9-W~m4>NI{S$7HaH>_HOoLy+s5grJ zKGy~H-5if%IYR@r?+-)?K6Y2{v~Rrf2KC+}<2zhpH+81ke|SU_rPh4MLl4FtBQu6P zraJw9&+SvoE?sT8?61C4pCMgn@y06}Jt?^5@p<1wq;Xaba3j9%XU6u_@?`S5&2J%1 z)q109g^QAWOqv=vtT45!eY|YNU^#I8ai4gHr1gBW*S@~pPnMNj408K~HGc1~X$4fX zb7hK#&34*FDRqBOai5qINA>{`)#Yka)eRwrkW;N;=%wRn0ohfU&~R1HF8hiFS8=Sw zw{%GpHKN~r2u&BK3*#Gco9n%2l;)M>GSctSY3+DWCw@cvaGIX@568W2y?MqQ9Zajr z_V}UVFORN31i{(xhka&T+_#*XAR$Ncg+hBQ)0Az` zQzLSH$VC#3IMM^8(y&B|k>2uq&`4IbXaUHEWc+BWhHsy7H+s%}$Dlgx5X^Ug7yrm&q5E-8--`V+w3}M`` zl9`#wmf0uqP0v5WzGldyWzl92q0bo>9(EY|<|@*l>Bi!Fk1{EV(sZLV3elsWfB6!3T6 ziauzu^vt`sD5*vDjzOBi)$S#fBR^l$UEh;EOC@Z-s{tvPjlbmjHI*`xW%*;0kn1%l zWVkjssyqhE^TRti7CGvP!BN*gH9qm@cR}x`>(jPwG-rj++PlX~0Vh=q;*0kOB{^a! zSXnd{SB@HtCz`Zc<+ByyL zU_SRVj#r*DOT^q&?{`AoRD*7C%@_jYBsK9(3kNq%a-qFZ!r1K|qKh`Sfg|W`BBE zKgza84vU_Xr{Tjb-X6 zBkj?MXKRm{wyz2MG6rf;*;z2HI7FlU5C}Tkyj}7Z(mS00aVRp{@*rzga1;OFmX_Ey z+7F&VouSyj$w%aVHM)|wR`N1UT5*6ym89v+(LzZ z`u1-pC#{YCoDb}Q41_x^>yz>a+x_OsF_fl>=;X!N45xFV?sqq9SPtJZ_^;4^i)?gH zi<02k#z!g5PcQjDp7YZ}t%mKp`1yA#@AB5*9kkK~gWP?!$kq`MJm{R;4VH-JO!7}) z&n?tT`$>W2k~P2n%IM1anOB)C=BN!qpw~4%dz26b5jD1S^-x3emQ>YomY9yGzVR=-WRx;e?Wx-0!dXiOAjB5*rdIMIAlPd}LJ=}b{ zoa~8K{P^g~kiBBA^vZ)Y_AgmNzAg~L z$l?e1zP8#`YGsv$B5RjPBJp%w4>~OA*?;&~9ky~aic;5CI*XSG109;II6n{hY>RI2 zURhu-JMIqt+$=&)zL8%00-4xoBCojI*-?tfi}FY+!(;+^wNA*kQf3bTo6GAJ=D%)?Y2X1Lg^6PsZ92lTX%2kRT z4WnGuP>O%{PGVT{#~YINkvCbJG#WqWkBKW!bzdK!g@>Lushu#t%szUoCc21o%o5hJ zM#>r%px;hrML|0x5Cm8iH#GRCfS@>YBQ<~AN|;b38D&(AFmw_JV@o)Tgje^GtA&9D z;O41o1rhqD^&Bjf8I8Ii(!l(y|K$12VTmkZM1qg%(AnfPJk9T8ac>XLdl{Ix-W+-s z-2^@)w@ge^^?LUBnyq3bdSnPm}6M5(!Vfl%6;C})cRNZ&#M%CUfvCp`bb})sFt@ZufEgrC zB$5`W4v!t4=L>}`Fe$%;ftpv$%e1sA-)^d$h2skP!<}VIWq_94LrdkDAe?fI)xa0_ z>>E$~{HOnI7e-9#<)7r%;v0bg!>8Smt4B=Y=-vVqfliq1r>(8JTn3Bz>3oI%+hdCN z3fWJ`H=NU(3AZM6=|3aBBK8RCjVDSQClIemGa+d9@g@jz-ubb{v zZwHI6n2u-*rZKR>>ra+&VyV@Z*NvJ-<~#!eK2 zOESXg0O@WD5R@;DN_MS!W1n!zH1qb2wz9RhEw`Pg4MPbRS#5u0&QhrRZV zynrFF_BgiZs(*1l_PA<*s9;1Y#I6znQF%B~3rv~%HmbJ#+z>4IpNZAr{tOtb)rwhT zx)3OP7|hSuPq1B5S&dKo>ANd~qlc3Ps8`$eiQmZ;9}!cX?rsau=E0Pfx*MoSw=F8) zBLRbiyf}>DL!ZhiX%@r3T)kyym7s@W{+);RBsq$f?2*nE(p&7tFEsW#t#Ok&5>nEp z#zqqplh5b9gh5g+>J}e)qx(>KP{NU?GS?O5->Kh9g$T0ULCmIV&c&3&2frPQ@A7ZC z(hKnK$2UHIHnpU9a(bpQ6$tc~ZLY0~OGV^f5oja@UTNST9lkQO!Zq4F^)Dw5LD0#{ zz&XW@c{oKv1ej|lpP1o-lMk~G*=}Ttz|m&H{rl$W-Kt|%$wUnX>*MC|gTh2vo<4us zAvH7aJJ4(S32gQB5V5iX#sm#2bO01}Y8